Óaðfinnanlegur flutningur RabbitMQ til Kubernetes

Óaðfinnanlegur flutningur RabbitMQ til Kubernetes

RabbitMQ er skilaboðamiðlari skrifaður í Erlang sem gerir þér kleift að skipuleggja bilunarklasa með fullri gagnaafritun yfir marga hnúta, þar sem hver hnútur getur þjónað lestrar- og skrifbeiðnum. Með marga Kubernetes klasa í framleiðslu rekstri, styðjum við mikinn fjölda RabbitMQ uppsetningar og stóðum frammi fyrir þörfinni á að flytja gögn frá einum klasa til annars án niður í miðbæ.

Við þurftum þessa aðgerð í að minnsta kosti tveimur tilvikum:

  1. Flutningur gagna frá RabbitMQ klasa sem er ekki staðsettur í Kubernetes yfir í nýjan – þegar „kubernetized“ (þ.e. starfar í K8s belgjum) – klasa.
  2. Flutningur RabbitMQ innan Kubernetes frá einu nafnarými til annars (til dæmis ef hringrásir eru afmarkaðar af nafnasvæðum, þá til að flytja innviði frá einni hringrás í aðra).

Uppskriftin sem lögð er til í greininni beinist að aðstæðum (en er alls ekki takmörkuð við þær) þar sem það er gamall RabbitMQ þyrping (til dæmis með 3 hnútum), sem er annað hvort þegar í K8s eða á einhverjum gömlum netþjónum. Forrit sem hýst er á Kubernetes (þegar þar eða í framtíðinni) vinnur með því:

Óaðfinnanlegur flutningur RabbitMQ til Kubernetes

... og við stöndum frammi fyrir því verkefni að flytja það yfir í nýju framleiðsluna í Kubernetes.

Fyrst verður almennri nálgun við flutninginn sjálfan lýst og að því loknu verður tæknilegum upplýsingum um framkvæmd hennar lýst.

Flutningalgrím

Fyrsta, bráðabirgðastigið fyrir aðgerð er að ganga úr skugga um að háttur aðgengisstillingar sé virkur í gömlu RabbitMQ uppsetningunni (HA). Ástæðan er augljós - við viljum ekki tapa neinum gögnum. Til að framkvæma þessa athugun geturðu farið á RabbitMQ stjórnborðið og í Admin → Reglur flipann ganga úr skugga um að gildið sé stillt ha-mode: all:

Óaðfinnanlegur flutningur RabbitMQ til Kubernetes

Næsta skref er að ala upp nýjan RabbitMQ þyrping í Kubernetes fræbelg (í okkar tilfelli, til dæmis, sem samanstendur af 3 hnútum, en fjöldi þeirra getur verið mismunandi).

Eftir þetta sameinum við gamla og nýja RabbitMQ þyrpinguna og fáum einn þyrping (af 6 hnútum):

Óaðfinnanlegur flutningur RabbitMQ til Kubernetes

Ferlið við samstillingu gagna milli gamla og nýja RabbitMQ klasans er hafið. Þegar öll gögn hafa verið samstillt á milli allra hnúta í klasanum getum við skipt um forrit til að nota nýja klasann:

Óaðfinnanlegur flutningur RabbitMQ til Kubernetes

Eftir þessar aðgerðir er nóg að fjarlægja gömlu hnúðana úr RabbitMQ þyrpingunni og flutningurinn getur talist lokið:

Óaðfinnanlegur flutningur RabbitMQ til Kubernetes

Við höfum notað þetta kerfi margoft í framleiðslu. Hins vegar, til okkar eigin þæginda, innleiddum við það í sérhæfðu kerfi sem dreifir stöðluðum RMQ stillingum yfir marga Kubernetes klasa (fyrir þá sem eru forvitnir: við erum að tala um addon-rekstraraðilium það sem við bara nýlega sagt). Hér að neðan munum við kynna einstakar leiðbeiningar sem hver sem er getur beitt um innsetningar sínar til að prófa fyrirhugaða lausn í verki.

Við skulum reyna það í reynd

Kröfur

Smáatriðin eru mjög einföld:

  1. Kubernetes þyrping (minikube mun einnig virka);
  2. RabbitMQ þyrping (hægt að dreifa á berum málmi og gera eins og venjulegan þyrping í Kubernetes frá opinberu Helm töflunni).

Fyrir dæmið hér að neðan sendi ég RMQ til Kubernetes og kallaði það rmq-old.

Undirbúningur stands

1. Sæktu Helm töfluna og breyttu því aðeins:

helm fetch --untar stable/rabbitmq-ha

Til þæginda setjum við lykilorð, ErlangCookie og gera pólitík ha-allþannig að sjálfgefið er að biðraðir séu samstilltar á milli allra hnúta RMQ klasans:

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. Settu upp töfluna:

helm install . --name rmq-old --namespace rmq-old

3. Farðu á RabbitMQ stjórnborðið, búðu til nýja biðröð og bættu við nokkrum skilaboðum. Þeir verða nauðsynlegir svo að eftir flutning getum við tryggt að öll gögn séu varðveitt og að við höfum ekki tapað neinu:

Óaðfinnanlegur flutningur RabbitMQ til Kubernetes

Prófunarbekkurinn er tilbúinn: við erum með „gamla“ RabbitMQ með gögnum sem þarf að flytja.

Flytja RabbitMQ klasa

1. Í fyrsta lagi skulum við setja nýja RabbitMQ inn vinur nafnrými með sama ErlangCookie og lykilorð fyrir notandann. Til að gera þetta munum við framkvæma aðgerðirnar sem lýst er hér að ofan og breyta lokaskipuninni til að setja upp RMQ í eftirfarandi:

helm install . --name rmq-new --namespace rmq-new

2. Nú þarftu að sameina nýja klasann við þann gamla. Til að gera þetta, farðu í hverja belg RabbitMQ og framkvæma skipanirnar:

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

Í breytilegu OLD_RMQ heimilisfang eins hnútanna finnst gamall RMQ þyrping.

Þessar skipanir munu stöðva núverandi hnút RMQ klasa, festu hann við gamla klasann og ræstu hann aftur.

3. RMQ þyrping með 6 hnútum er tilbúin:

Óaðfinnanlegur flutningur RabbitMQ til Kubernetes

Þú verður að bíða á meðan skilaboð eru samstillt á milli allra hnúta. Það er ekki erfitt að giska á að samstillingartími skilaboða fer eftir getu vélbúnaðarins sem þyrpingin er sett á og fjölda skeyta. Í þeirri atburðarás sem lýst er eru þau aðeins 10, þannig að gögnin voru samstillt samstundis, en með nægilega miklum fjölda skilaboða getur samstilling varað í klukkustundir.

Svo, samstillingarstaðan:

Óaðfinnanlegur flutningur RabbitMQ til Kubernetes

Hér +5 þýðir að skilaboð eru þegar inn meira á 5 hnútum (nema það sem tilgreint er í reitnum Node). Þannig tókst samstillingin vel.

4. Það eina sem er eftir er að skipta RMQ heimilisfanginu í forritinu yfir í nýja þyrpinguna (sértæku aðgerðirnar hér eru háðar tæknistaflanum sem þú notar og öðrum sértækum forritum), eftir það geturðu sagt bless við þann gamla.

Fyrir síðustu aðgerð (þ.e. þegar eftir skipta um forrit yfir í nýjan klasa) fara í hvern hnút gamall klasa og framkvæma skipanirnar:

rabbitmqctl stop_app
rabbitmqctl reset

Klasinn „gleymdi“ gömlu hnútunum: þú getur eytt gamla RMQ, á þeim tímapunkti verður flutningnum lokið.

Athugið: Ef þú notar RMQ með vottorðum, þá breytist ekkert í grundvallaratriðum - flutningsferlið mun fara fram nákvæmlega eins.

Niðurstöður

Lýst kerfi hentar næstum öllum tilvikum þegar við þurfum að flytja RabbitMQ eða einfaldlega flytja í nýjan klasa.

Í okkar tilviki komu aðeins upp erfiðleikar einu sinni, þegar RMQ var aðgengilegt víða að, og við höfðum ekki tækifæri til að breyta RMQ heimilisfanginu í nýtt alls staðar. Síðan settum við af stað nýjan RMQ í sama nafnarými með sömu merkingum þannig að það félli undir núverandi þjónustu og Ingresses, og þegar við opnuðum podinn handhöndluðum við merkin með höndunum, fjarlægðum þau í upphafi svo að beiðnir féllu ekki á tóm RMQ, og bætir þeim við aftur eftir að skilaboðin eru samstillt.

Við notuðum sömu stefnu þegar við uppfærðum RabbitMQ í nýja útgáfu með breyttri uppsetningu - allt virkaði eins og klukka.

PS

Sem rökrétt framhald af þessu efni erum við að undirbúa greinar um MongoDB (flutningur frá vélbúnaðarþjóni til Kubernetes) og MySQL (hvernig við undirbúum þetta DBMS inni í Kubernetes). Þær verða birtar á næstu mánuðum.

Pps

Lestu líka á blogginu okkar:

Heimild: www.habr.com

Bæta við athugasemd