
RabbitMQ â Erlang keeles kirjutatud sĂ”numite vahetaja, mis vĂ”imaldab luua usaldusvÀÀrse klastriga, millel on tĂ€ielik andmete replikatsioon mitmel sĂ”lmel, kus iga sĂ”lm suudab teenindada lugemis- ja kirjutamissoove. Tootmiskeskkonnas oleme haldanud mitmeid Kubernetes klastri, mis tĂ€hendab, et toetame suurt hulka RabbitMQ paigaldusi ning oleme silmitsi seisnud vajadusega migratsioonida andmeid ĂŒhest klastrist teise katkestusteta.
See operatsioon oli vajalik meile vÀhemalt kahes olukorras:
- Andmete edastamine RabbitMQ klastrist, mis ei asunud Kuberneteses, uude â nĂŒĂŒd juba "kuberiseeritud" (st K8s pod'ides töötav) â klastrisse.
- RabbitMQ migratsioon Kuberneteses ĂŒhe nimeduse alt teise (nĂ€iteks kui piirid on jaotatud nimede jĂ€rgi, siis infrastruktuuri edastamiseks ĂŒhest piirist teise).
Artiklis pakutud retsept on suunatud olukordadele (aga mitte ainult nendele), kus on olemas vana RabbitMQ klaster (nÀiteks 3 sÔlmega), mis asub kas juba K8s-is vÔi mingitel vanadel serveritel. Sellega töötatakse rakendusega, mis on paigutatud Kubernetesesse (kas juba seal vÔi tulevikus):

⊠ja meie ees on ĂŒlesanne migratsiooni tegemiseks uude production keskkonda Kubernetes'is.
Esmalt kirjeldatakse ĂŒldiselt migratsiooni lĂ€henemist, seejĂ€rel jagatakse tehnilisi detaile selle rakendamise kohta.
Migratsioonialgoritm
Esimene, etapp enne mis tahes toimingute tegemist â kontrollida, et vana RabbitMQ installatsioonis on sisse lĂŒlitatud kĂ”rge kĂ€ttesaadavuse reĆŸiim (). PĂ”hjus on ilmne â me ei taha ju andmeid kaotada. Selle kontrollimiseks saab minna RabbitMQ adminpaneelile ja vahekaardil Admin â Policies veenduda, et vÀÀrtus on seadistatud ha-mode: all:

JĂ€rgmine samm â tĂ”stame ĂŒles uue RabbitMQ klastrite Kubernetes'i pod'id (meie puhul nĂ€iteks koosnedes 3 sĂ”lmest, kuid nende arv vĂ”ib olla ka erinev).
PĂ€rast seda ĂŒhendame vana ja uue RabbitMQ klastri, saades ĂŒhe klastrina (6 sĂ”lmega):

Algatatakse andmete sĂŒnkroonimise protsess vana ja uue RabbitMQ klastri vahel. PĂ€rast seda, kui kĂ”ik andmed on kĂ”igi sĂ”lmede vahel klastris sĂŒnkroonitud, saame rakenduse suunata uue klastri kasutamisele:

PÀrast neid toiminguid piisab, kui eemaldada RabbitMQ klastrist vanad sÔlmed, ja migratsioon on lÔpetatud:

Me oleme seda skeemi korduvalt kasutanud oma tootmises. KĂŒll aga oleme enda mugavuse huvides realiseerinud selle spetsialiseeritud sĂŒsteemi raames, mis jagab tĂŒĂŒpilisi RMQ konfiguratsioone paljude Kubernetes klastrite vahel. (neile, keda huvitab: on juttu , millest me ). Allpool on esitatud eraldi juhised, mida igaĂŒks saab oma installatsioonides rakendada, et proovida ettepanekut praktikas.
Proovime praktikas
NÔuded
Andmed on vÀga lihtsad:
- Kubernetes klaster (sobib ka minikube);
- RabbitMQ klaster (see vĂ”ib olla ĂŒles seatud nii bare metalil kui ka tavalisena Kubernetesis ametlikust Helm-chart'ist).
Allpool kirjeldatud nÀite jaoks olen ma seadistanud RMQ Kubernetesis ja kutsunud seda rmq-old.
Stendi ettevalmistamine
1. Lae alla Helm-chart ja tee sellest veidi muudatusi:
helm fetch --untar stable/rabbitmq-ha Mugavuse mĂ”ttes seadistame parooli, ErlangCookie ja teeme poliitika ha-all, et vaikimisi oleksid jĂ€rjekorrad sĂŒnkroonitud kĂ”igi RMQ klastriga seotud 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. Seame diagramm:
helm install . --name rmq-old --namespace rmq-old3. Logi RabbitMQ admin paneeli, loo uus jÀrjekord ja lisa mÔned sÔnumid. Neid on vaja, et pÀrast migreerimist saaksime veenduda, et kÔik andmed on alles ja me midagi ei kaotanud:
![]()
Testkeskkond on valmis: meil on "vana" RabbitMQ andmetega, mis tuleb ĂŒle kanda.
RabbitMQ klastrite migreerimine
1. Alustame uue RabbitMQ kĂ€ivitamisega sĂ”braga nimede ruumis samade ErlangCookie ja kasutaja parooliga. Selleks teeme ĂŒlaltoodud operatsioonid, muutes RMQ installimise lĂ”ppkĂ€sku jĂ€rgmisega:
helm install . --name rmq-new --namespace rmq-new2. NĂŒĂŒd tuleb ĂŒhendada uus klaster vanaga. Selleks logime iga podi uue RabbitMQ sisse ja tĂ€idame jĂ€rgmised kĂ€sklused:
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 Muutujas OLD_RMQ on ĂŒhe vana RMQ klastrite sĂ”lme aadress. Need kĂ€sklused peatavad praeguse
RMQ klastris sÔlme, liidavad selle vana klastriga ja kÀivitavad uuesti. uue 3. RMQ klaster, mis koosneb 6 sÔlmest, on valmis:
3. RMQ klaster kuuest sÔlmest on valmis:

Peab ootama, kuni sĂ”numid sĂŒnkroniseeritakse kĂ”igi sĂ”lmpunktide vahel. Pole raske arvata, et sĂ”numite sĂŒnkroniseerimise aeg sĂ”ltub riistvara vĂ”imsusest, millel klaster on rajatud, ja sĂ”numite arvust. Kirjeldatud stsenaariumi puhul on neid vaid 10, seega andmed sĂŒnkroniseerusid kohe, kuid piisavalt suurte sĂ”numite arvu korral vĂ”ib sĂŒnkroniseerimine kesta tunde.
Nii et sĂŒnkroniseerimise staatus:

Siit +5 tĂ€hendab, et sĂ”numid on juba veel 5 sĂ”lmpunktis (vĂ€lja arvatud see, mis on nĂ€idatud vĂ€ljal SĂ”lm). Seega on sĂŒnkroniseerimine Ă”nnestunud.
4. JÀÀb vaid rakenduses RMQ aadress uuele klastrile ĂŒle lĂŒlitada (konkreetsed toimingud sĂ”ltuvad siin teie kasutatavast tehnoloogiamaastikust ja rakenduse muudest eripĂ€radest), pĂ€rast mida saab vanast lahkuda.
Viimase operatsiooni jaoks (st pĂ€rast rakenduse uuele klastrile ĂŒleminek) siseneme iga sĂ”lmpunkti RMQ klastrite sĂ”lme aadress. klastris ja tĂ€idame kĂ€sklused:
rabbitmqctl stop_app
rabbitmqctl resetKlaster on "unustanud" vanad sÔlmed: vana RMQ vÔib eemaldada, millega kolimine on lÔpetatud.
MĂ€rkus: Kui kasutate RMQ-d koos sertifikaatidega, ei muutu pĂ”himĂ”tteliselt midagi â migratsiooniprotsess toimub tĂ€pselt nii nagu tavaliselt.
JĂ€reldused
Kirjeldatud skeem sobib peaaegu kÔikidele juhtumitele, kus peame RabbitMQ-d migreerima vÔi lihtsalt uude klastrisse liikuma.
Meie juhul tekkis probleeme ainult ĂŒks kord, kui RMQ-le pöörduti paljusid kohti, kuid meil ei olnud vĂ”imalust adresseerida RMQ-d kĂ”ikjal. Sel juhul kĂ€ivitasime uue RMQ sama nimelises ruumis sama etikettidega, et see satuks juba olemasolevate teenuste ja Ingressâite alla ning podâi kĂ€sitsi kĂ€ivitamisel manipuleerisime etiketiga, eemaldades need alguses, et tĂŒhja RMQ-le ei satuks pĂ€ringud, ja lisades need tagasi pĂ€rast sĂ”numite sĂŒnkroneerimist.
Sama strateegiat rakendasime RabbitMQ uuendamisel uue versiooniga, millel oli muudetud konfiguratsioon â kĂ”ik toimis nagu kellavĂ€rk.
P.S.
Selle materjali loogilise jÀtkuna valmistame ette artikleid MongoDB (migreerimine rauaserverist Kubernetesesse) ja MySQL (kuidas valmistame ette seda andmebaasi Kuberneteses). Need avaldatakse lÀhikuudel.
P.P.S.
Lugege ka meie blogist:
- «»;
- «».
Allikas: habr.com
