
RabbitMQ on Erlangi kirjutatud sĂ”numibroker, mis vĂ”imaldab organiseerida talitlushĂ€ireteta klastrit tĂ€ieliku andmete replikatsiooniga mitmele sĂ”lmele, kus iga sĂ”lm suudab teenindada lugemis- ja kirjutamissoove. Olles tootes mitmeid Kubernetes klastri, toetame suurt hulka RabbitMQ paigaldisi ja seisime silmitsi vajadusega migreerida andmed ĂŒhest klastrist teise ilma seiskumiseta.
See operatsioon oli vajalik meile vÀhemalt kahe juhtumi puhul:
- Andmete ĂŒleviimine RabbitMQ klastrist, mis ei asu Kuberneteses, uude - juba âkuberneeritudâ (st toimiv K8s pod'ides) - klastrisse.
- RabbitMQ migratsioon Kuberneteses ĂŒhe nimede ruumist teise (nĂ€iteks, kui piirid on jagatud nimede ruumide kaudu, siis infrastruktuuri ĂŒleviimiseks ĂŒhest piirist teise).
Artiklis pakutud retsept on suunatud olukordadele (aga mitte ainult neile), kus on vana RabbitMQ klaster (nÀiteks koosneb 3 sÔlmest), mis asub kas K8s-is vÔi mÔnel vanemal serveril. Selle kallal töötab rakendus, mis on paigutatud Kubernetesesse (kas juba seal vÔi perspektiivis):

⊠ja meie ees on ĂŒlesanne migreerida see uude produktsiooni Kubernetesesse.
Esiteks kirjeldatakse ĂŒldist lĂ€henemist migreerimisele, seejĂ€rel tehnilisi ĂŒksikasju selle rakendamisest.
Migreerimise algoritm
Esimene, eelnev etapp enne igasuguseid tegevusi - kontrollimine, et vanas RabbitMQ paigalduses on aktiveeritud kĂ”rge saadavuse reĆŸiim (). PĂ”hjus on ilmne - me ei soovi kaotada andmeid. Selle kontrollimiseks saab siseneda RabbitMQ administraatori paneeli ja vahekaardil Admin â Policies veenduda, et vÀÀrtus on seatud ha-mode: all:

JĂ€rgmine samm - tĂ”stame ĂŒles uue RabbitMQ klastris pod'ides Kuberneteses (nĂ€iteks koosnedes 3 sĂ”lmest, kuid neid vĂ”ib olla ka teisi).
PĂ€rast seda ĂŒhendame vana ja uue RabbitMQ klastrid, saades ĂŒhe klastrisse (6 sĂ”lme):

Algatatakse andmete sĂŒnkroonimise protsess vana ja uue RabbitMQ klastrite vahel. PĂ€rast seda, kui kĂ”ik andmed sĂŒnkroniseeritakse nii, et kĂ”ik sĂ”lmed klastris, saame rakenduse suunata kasutama uut klastrit:

PÀrast neid toiminguid piisab, kui vÔtta RabbitMQ klastri vanad sÔlmed vÀlja ja kolimine vÔib lugeda lÔpetatuks:

Seda me oleme korduvalt kasutanud meie tootmises. Kuid enda mugavuse huvides rakendasime selle spetsialiseeritud sĂŒsteemi raames, mis levitab tĂŒĂŒpilisi RMQ konfiguratsioone paljudele Kubernetes klastritele. (neile, kellel on huvi: rÀÀgime , millest me )Allpool on esitatud eraldi juhised, mida igaĂŒks saab rakendada oma paigaldustes, et proovida pakutavat lahendust praktikas.
Proovime praktikas
NÔuded
NÔuded on vÀga lihtsad:
- Kubernetes klaster (sobib ka minikube);
- RabbitMQ klaster (vÔib olla paigaldatud bare metal'i peale vÔi loodud tavaliseks klastri Kubernetes'is ametlikust Helm-keskkonnast).
Allpool kirjeldatud nÀite jaoks paigaldasin RMQ Kubernetes'is ja nimetasime selle rmq-old.
Stendi ettevalmistamine
1. Laadime alla Helm-chart'i ja redigeerime seda veidi:
helm fetch --untar stable/rabbitmq-ha Mugavuse huvides mÀÀrame parooli, ErlangCookie ja loome poliitika ha-all, et vaikimisi jĂ€rjekorrad sĂŒnkroniseeritakse kĂ”igi RMQ klastri sĂ”lmede vahel:
rabbitmqPassword: guest
rabbitmqErlangCookie: mae9joopaol7aiVu3eechei2waiGa2we
definitions:
policies: |-
{
"name": "ha-all",
"pattern": ".*",
"vhost": "\/",
"definition": {
"ha-mode": "all",
"ha-sync-mode": "automatic",
"ha-sync-batch-size": 81920
}
}2. Paigaldame chart'i:
helm install . --name rmq-old --namespace rmq-old3. Siseneme RabbitMQ haldussĂŒsteemi, loome uue jĂ€rjekorra ja lisame paar sĂ”numit. Need on vajalikud, et pĂ€rast migratsiooni saaksime veenduda, et kĂ”ik andmed on sĂ€ilinud ja me ei ole midagi kaotanud:
![]()
Teststend on valmis: meil on «vana» RabbitMQ andmetega, mis tuleb ĂŒle kanda.
RabbitMQ klastrite migratsioon
1. Esiteks paigaldame uue RabbitMQ teises nimetuses sama ja parooliga kasutajale. Selleks teeme ĂŒlaltoodud toimingud, muutes RMQ paigaldamise lĂ”ppkĂ€sku jĂ€rgmisele: ErlangCookie helm install . --name rmq-new --namespace rmq-new
2. NĂŒĂŒd tuleb ĂŒhendada uus klaster vanaga. Selleks siseneme igasse pod'iuue RabbitMQ ja tĂ€idame kĂ€sud: export OLD_RMQ=rabbit@rmq-old-rabbitmq-ha-0.rmq-old-rabbitmq-ha-discovery.rmq-old.svc.cluster.local && rabbitmqctl stop_app && rabbitmqctl join_cluster $OLD_RMQ && rabbitmqctl start_app
OLD_RMQ Mu variables on ĂŒhe vana RMQ klastris oleva sĂ”lme aadress. Need kĂ€sud peatavad praeguse sĂ”lme RMQ klastri, ĂŒhendavad selle vanasse klastrisse ja kĂ€ivitavad uuesti.
3. RMQ klaster, kus on 6 sÔlme, on valmis: RabbitMQ ja tÀidame kÀsud: RMQ klaster, liidetakse vanale klasterile ja kÀivitatakse uuesti.
3. RMQ klaster koosneb 6 sÔlmest ja on valmis:

Peate ootama, kuni sĂ”numid sĂŒnkroonitakse kĂ”igi sĂ”lmede vahel. Ei ole raske arvata, et sĂ”numite sĂŒnkroonimise aeg sĂ”ltub klastrit kĂ€itavast riistvarast ja sĂ”numite arvust. Kirjeldatud stsenaariumis on neid ainult 10, seega andmed sĂŒnkrooniti hetkega, kuid piisavalt suures sĂ”numite arvus vĂ”ib sĂŒnkroonimine kesta tunde.
Nii et, sĂŒnkroonimise staatus:

Siin +5 tĂ€hendab, et sĂ”numid on juba veel 5 sĂ”lmes (lisaks sellele, mis on mĂ€rgitud vĂ€ljale Node). Nii et, sĂŒnkroonimine lĂ€ks edukalt lĂ€bi.
4. JÀÀb vaid rakenduses RMQ aadress vahetada uuele klastrile (konkreetsed tegevused sĂ”ltuvad teie kasutatavast tehnoloogiapaagist ja muudest rakenduse eripĂ€radest), pĂ€rast mida saab vanaga hĂŒvasti jĂ€tta.
Viimase toimingu jaoks (st pĂ€rast rakenduse mĂ”nel uuele klastrile ĂŒleviimine) siseneme iga sĂ”lme Need kĂ€sud peatavad praeguse sĂ”lme klastris ja tĂ€idame kĂ€sud:
rabbitmqctl stop_app
rabbitmqctl resetKlastril on "unustanud" vanad sÔlmed: vana RMQ-deleting ja kolimine on lÔpetatud.
MĂ€rkus: Kui kasutate RMQ-d sertifikaatidega, siis pĂ”himĂ”tteliselt ei muutu midagi â kolimisprotsess toimub tĂ€pselt samamoodi.
JĂ€reldused
Kirjeldatud skeem sobib praktiliselt kĂ”ikides olukordades, kui peame RabbitMQ-d ĂŒleviima vĂ”i lihtsalt uuele klastrile kolima.
Meie puhul tekkisid raskused vaid ĂŒks kord, kui RMQ-d kasutati paljusid kohti, ja meil ei olnud vĂ”imalust igal pool RMQ aadressi uuele vahetada. Siis kĂ€ivitasime uue RMQ sama nimekirjaga samas nimes, nii et see vastaks juba olemasolevatele teenustele ja Ingress'idele, ja kĂ€ivitasime pod'i kĂ€sitsi mĂ€rkide manipuleerimisega, eemaldades need alguses, et tĂŒhjad RMQ-le ei laekuks pĂ€ringud, ja lisades need pĂ€rast sĂ”numite sĂŒnkroonimist tagasi.
Sarnast strateegiat kasutasime RabbitMQ versiooniuuendamiseks koos muudetud konfiguratsiooniga â kĂ”ik töötas nagu kell.
P.S.
Selle teema loogilise jÀtkuna valmistame ette artikleid MongoDB (migratsioon rauaserverist Kubernetesesse) ja MySQL (kuidas me seda andmebaasi Kuberneteses valmistame). Need avaldatakse lÀhikuudel.
P.P.S.
Lugege ka meie blogist:
- «»;
- «».
Allikas: habr.com
