{"id":33075,"date":"2019-10-31T21:50:35","date_gmt":"2019-10-31T18:50:35","guid":{"rendered":"https:\/\/prohoster.info\/blog\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes\/"},"modified":"2019-10-31T21:50:35","modified_gmt":"2019-10-31T18:50:35","slug":"besprostojnaya-migratsiya-rabbitmq-v-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes","title":{"rendered":"Migrazione non semplice di RabbitMQ in Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/32c491c8605e2488550efadbcb052320.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nRabbitMQ \u2013 un broker di messaggi scritto in Erlang, che consente di organizzare un cluster di alta disponibilit\u00e0 con replicazione completa dei dati su pi\u00f9 nodi, dove ciascun nodo pu\u00f2 gestire richieste di lettura e scrittura. Avendo in produzione diversi cluster Kubernetes, supportiamo un grande numero di installazioni di RabbitMQ e ci siamo trovati di fronte alla necessit\u00e0 di migrare dati da un cluster all'altro senza inattivit\u00e0.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Questa operazione \u00e8 stata necessaria almeno in due casi:<\/p>\n<ol>\n<li> Trasferimento di dati da un cluster RabbitMQ che non si trova in Kubernetes a un nuovo cluster gi\u00e0 'kubernetesizzato' (cio\u00e8 funzionante in pod K8s).<\/li>\n<li> Migrazione di RabbitMQ all'interno di Kubernetes da uno namespace a un altro (ad esempio, se i confini sono delimitati dagli spazi dei nomi, per trasferire l'infrastruttura da un confine all'altro).<\/li>\n<\/ol>\n<p>\nLa ricetta proposta nell'articolo \u00e8 orientata a situazioni (ma non \u00e8 limitata a queste) in cui esiste un vecchio cluster RabbitMQ (ad esempio, composto da 3 nodi), che si trova gi\u00e0 in K8s o su alcuni vecchi server. Esso \u00e8 utilizzato da un'applicazione ospitata in Kubernetes (gi\u00e0 l\u00ec o in prospettiva):<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/5fba162c90bc441978429288c59300ef.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u2026 e ora abbiamo il compito di migrare in un nuovo production in Kubernetes.<\/p>\n<p>Inizialmente verr\u00e0 descritto l'approccio generale alla migrazione, seguito dai dettagli tecnici per la sua implementazione.<\/p>\n<h2>Algoritmo di migrazione<\/h2>\n<p>\nIl primo passo preliminare, prima di intraprendere qualsiasi azione, \u00e8 verificare che nella vecchia installazione di RabbitMQ sia attivata la modalit\u00e0 di alta disponibilit\u00e0 (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/ha.html\">HA<\/a><\/noindex>). Il motivo \u00e8 ovvio: non vogliamo perdere alcun dato. Per effettuare questa verifica, \u00e8 possibile accedere all'interfaccia di amministrazione di RabbitMQ e nella scheda Admin \u2192 Policies assicurarsi che sia impostato il valore <code>ha-mode: all<\/code>:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/2e37be2cd3685eb8cedfbc5949e5036f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl passo successivo consiste nel sollevare un nuovo cluster RabbitMQ nei pod di Kubernetes (nel nostro caso, ad esempio, composto da 3 nodi, ma il numero pu\u00f2 variare).<\/p>\n<p>Dopo di ci\u00f2 uniamo i cluster RabbitMQ vecchio e nuovo, ottenendo un unico cluster (di 6 nodi):<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/52204b814f0ba73a20c4854e990c4059.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSi avvia il processo di sincronizzazione dei dati tra i vecchi e i nuovi cluster RabbitMQ. Una volta che tutti i dati sono sincronizzati tra i nodi nel cluster, possiamo switchare l'applicazione per utilizzare il nuovo cluster:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/8bf19d4176e38b4679e96e0f1b8b57c1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDopo queste operazioni \u00e8 sufficiente rimuovere i vecchi nodi dal cluster RabbitMQ, e il trasferimento pu\u00f2 considerarsi completato:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/bccc9b9fc8d6691d24195e9a97a0f88b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuesto schema \u00e8 stato applicato pi\u00f9 volte nel nostro ambiente di produzione. Tuttavia, per comodit\u00e0, lo abbiamo implementato all'interno di un sistema specializzato che distribuisce configurazioni standard di RMQ su pi\u00f9 cluster Kubernetes. <i>(per coloro che sono curiosi: si tratta di <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/addon-operator\">addon-operator<\/a><\/noindex>, di cui noi <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">abbiamo parlato recentemente<\/a><\/noindex>)<\/i>. Di seguito verranno presentate istruzioni specifiche che chiunque pu\u00f2 applicare alle proprie installazioni per provare la soluzione proposta in azione.<\/p>\n<h2>Proviamo nella pratica<\/h2>\n<p><\/p>\n<h3>Requisiti<\/h3>\n<p>\nI requisiti sono molto semplici:<\/p>\n<ol>\n<li> Cluster Kubernetes (va bene anche minikube);<\/li>\n<li> Un cluster RabbitMQ (che pu\u00f2 essere distribuito su bare metal o creato come un normale cluster in Kubernetes usando il chart Helm ufficiale).<\/li>\n<\/ol>\n<p>\nPer l'esempio descritto di seguito, ho distribuito RMQ in Kubernetes e l'ho chiamato <code>rmq-old<\/code>.<\/p>\n<h3>Preparazione dell'ambiente<\/h3>\n<p>\n1. Scarichiamo il chart Helm e apportiamo alcune modifiche:<\/p>\n<pre><code class=\"bash\">helm fetch --untar stable\/rabbitmq-ha<\/code><\/pre>\n<p>\nPer comodit\u00e0, impostiamo la password, <code>ErlangCookie<\/code> e definiamo la politica <code>ha-all<\/code>, affinch\u00e9, per impostazione predefinita, le code siano sincronizzate tra tutti i nodi del cluster RMQ:<\/p>\n<pre><code class=\"plaintext\">rabbitmqPassword: guest\nrabbitmqErlangCookie: mae9joopaol7aiVu3eechei2waiGa2we\ndefinitions:\npolicies: |-\n  {\n    \"name\": \"ha-all\",\n    \"pattern\": \".*\",\n    \"vhost\": \"\/\",\n    \"definition\": {\n      \"ha-mode\": \"all\",\n      \"ha-sync-mode\": \"automatic\",\n      \"ha-sync-batch-size\": 81920\n    }\n  }<\/code><\/pre>\n<p>\n2. Installiamo il chart:<\/p>\n<pre><code class=\"bash\">helm install . --name rmq-old --namespace rmq-old<\/code><\/pre>\n<p>\n3. Accediamo all'interfaccia di amministrazione di RabbitMQ, creiamo una nuova coda e aggiungiamo alcuni messaggi. Questi saranno necessari per assicurarci, dopo la migrazione, che tutti i dati siano stati conservati e che nulla sia andato perso:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/b4b78ce622903dada396ced196c2ecce.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl banco di prova \u00e8 pronto: abbiamo un 'vecchio' RabbitMQ con i dati da trasferire.<\/p>\n<h3>Migrazione del cluster RabbitMQ<\/h3>\n<p>\n1. Iniziamo a distribuire un nuovo RabbitMQ in <b>amico<\/b> uno spazio dei nomi con <b>le stesse<\/b> <code>ErlangCookie<\/code> credenziali e password per l'utente. A tal fine, eseguiamo le operazioni descritte sopra, modificando il comando finale per l'installazione di RMQ nella seguente maniera:<\/p>\n<pre><code class=\"bash\">helm install . --name rmq-new --namespace rmq-new<\/code><\/pre>\n<p>\n2. Ora \u00e8 necessario unire il nuovo cluster a quello esistente. Per farlo, accediamo a ciascun pod di <b>del nuovo<\/b> RabbitMQ ed eseguiamo i comandi:<\/p>\n<pre><code class=\"bash\">export OLD_RMQ=rabbit@rmq-old-rabbitmq-ha-0.rmq-old-rabbitmq-ha-discovery.rmq-old.svc.cluster.local &amp;&amp; \n  rabbitmqctl stop_app &amp;&amp; \n  rabbitmqctl join_cluster $OLD_RMQ &amp;&amp; \n  rabbitmqctl start_app<\/code><\/pre>\n<p>\nNella variabile <code>OLD_RMQ<\/code> \u00e8 l'indirizzo di uno dei nodi <b>del vecchio<\/b> cluster RMQ.<\/p>\n<p>Questi comandi fermeranno il nodo corrente <b>del nuovo<\/b> del cluster RMQ, lo uniranno al vecchio cluster e lo riavvieranno.<\/p>\n<p>3. Il cluster RMQ composto da 6 nodi \u00e8 pronto:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/88f4655556c1146f7a6e54fd2fd798f4.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c8 necessario attendere che i messaggi vengano sincronizzati tra tutti i nodi. \u00c8 facile intuire che il tempo di sincronizzazione dei messaggi dipende dalle capacit\u00e0 dell'hardware su cui \u00e8 effettuato il cluster e dal numero di messaggi. Nel caso descritto, ce ne sono solo 10, quindi i dati si sono sincronizzati immediatamente, ma con un numero sufficientemente elevato di messaggi la sincronizzazione pu\u00f2 richiedere ore.<\/p>\n<p>Quindi, lo stato di sincronizzazione:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/1185591d8d5478634f35b7433ca75bbc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQui <code>+5<\/code> significa che i messaggi sono gi\u00e0 presenti <b>ancora<\/b> su 5 nodi (oltre a quello indicato nel campo <code>Node<\/code>). Pertanto, la sincronizzazione \u00e8 avvenuta con successo.<\/p>\n<p>4. Resta solo da cambiare nell'app l'indirizzo RMQ al nuovo cluster (le azioni specifiche qui dipendono dalla tecnologia utilizzata e da altre specifiche dell'applicazione), dopo di che si pu\u00f2 salutare il vecchio.<\/p>\n<p>Per l'ultima operazione (ossia <b>dopo<\/b> cambiare l'app al nuovo cluster) accediamo a ciascun nodo <b>del vecchio<\/b> del cluster ed eseguiamo i comandi:<\/p>\n<pre><code class=\"bash\">rabbitmqctl stop_app\nrabbitmqctl reset<\/code><\/pre>\n<p>\nIl cluster ha \u201cdimenticato\u201d i vecchi nodi: si pu\u00f2 eliminare il vecchio RMQ, completando cos\u00ec la migrazione.<\/p>\n<p><i><b>Nota<\/b>: Se stai utilizzando RMQ con certificati, il principio rimane invariato: il processo di migrazione avverr\u00e0 esattamente nello stesso modo.<\/i><\/p>\n<h2>Conclusioni<\/h2>\n<p>\nLo schema descritto si adatta praticamente a tutti i casi in cui dobbiamo trasferire RabbitMQ o semplicemente migrare a un nuovo cluster.<\/p>\n<p>Nel nostro caso, abbiamo incontrato difficolt\u00e0 solo una volta, quando RMQ veniva utilizzato da molteplici origini e non avevamo la possibilit\u00e0 di cambiare l'indirizzo di RMQ ovunque. Allora abbiamo avviato un nuovo RMQ nello stesso namespace con etichette identiche, affinch\u00e9 venisse intercettato dai servizi e dagli Ingress gi\u00e0 esistenti, e durante l'avvio del pod abbiamo manipolato le etichette manualmente, rimuovendole inizialmente per impedire che le richieste arrivassero al nuovo RMQ vuoto, aggiungendole nuovamente dopo la sincronizzazione dei messaggi.<\/p>\n<p>Abbiamo applicato la stessa strategia durante l'aggiornamento di RabbitMQ a una nuova versione con configurazione modificata: tutto ha funzionato alla perfezione.<\/p>\n<h2>P.S.<\/h2>\n<p>\nCome logico seguito a questo materiale, stiamo preparando articoli su MongoDB (migrazione da server fisico a Kubernetes) e MySQL (come prepariamo questo DBMS all'interno di Kubernetes). Saranno pubblicati nei prossimi mesi.<\/p>\n<h2>P.P.S.<\/h2>\n<p>\nLeggete anche nel nostro blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/flant\/blog\/431500\/\">Database e Kubernetes (panoramica e video della presentazione)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/417509\/\">K8s tips &amp; tricks: Acceleriamo il bootstrap di grandi database<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/450662\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>RabbitMQ \u2013 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Erlang \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0437\u043b\u043e\u0432, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c. \u0418\u043c\u0435\u044f \u0432 production-\u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 Kubernetes, \u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0439 RabbitMQ \u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0431\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u044f. \u0414\u0430\u043d\u043d\u0430\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24827,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-33075","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"RabbitMQ \u2013 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Erlang \u0431\u0440\u043e\u043a\u0435\u0440.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0411\u0435\u0441\u043f\u0440\u043e\u0441\u0442\u043e\u0439\u043d\u0430\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f RabbitMQ \u0432 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"RabbitMQ \u2013 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Erlang \u0431\u0440\u043e\u043a\u0435\u0440.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:50:35+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:50:35+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Migrazione senza downtime di RabbitMQ in Kubernetes | ProHoster","description":"RabbitMQ \u2013 un broker scritto in linguaggio Erlang.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0411\u0435\u0441\u043f\u0440\u043e\u0441\u0442\u043e\u0439\u043d\u0430\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f RabbitMQ \u0432 Kubernetes | ProHoster","og:description":"RabbitMQ \u2013 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Erlang \u0431\u0440\u043e\u043a\u0435\u0440.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:50:35+00:00","article:modified_time":"2019-10-31T18:50:35+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"33075","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 13:51:33","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:47:28","updated":"2026-01-21 13:51:33","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/33075","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=33075"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/33075\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/24827"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=33075"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=33075"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=33075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}