Nevainojama RabbitMQ migrācija uz Kubernetes

Nevainojama RabbitMQ migrācija uz Kubernetes

RabbitMQ ir Erlang valodā rakstÄ«ts ziņojumu brokeris, kas ļauj organizēt kļūmjpārlēces kopu ar pilnu datu replikāciju vairākos mezglos, kur katrs mezgls var apkalpot lasÄ«Å”anas un rakstÄ«Å”anas pieprasÄ«jumus. Tā kā ražoÅ”anas darbÄ«bā ir daudz Kubernetes klasteru, mēs atbalstām lielu skaitu RabbitMQ instalāciju un saskārāmies ar nepiecieÅ”amÄ«bu migrēt datus no viena klastera uz citu bez dÄ«kstāves.

Šī darbība mums bija nepiecieŔama vismaz divos gadījumos:

  1. Datu pārsÅ«tÄ«Å”ana no RabbitMQ klastera, kas neatrodas Kubernetes uz jaunu ā€“ jau ā€œkubernetizētuā€ (t.i., kas darbojas K8s podiņos) ā€“ klasteru.
  2. RabbitMQ migrācija Kubernetes ietvaros no vienas nosaukumvietas uz citu (piemēram, ja ķēdes ir norobežotas ar nosaukumvietām, tad, lai pārsūtītu infrastruktūru no vienas ķēdes uz citu).

Rakstā piedāvātā recepte ir vērsta uz situācijām (bet neaprobežojas ar tām), kurās ir vecs RabbitMQ klasteris (piemēram, no 3 mezgliem), kas atrodas vai nu jau K8s, vai arī uz dažiem veciem serveriem. Kubernetes mitināta lietojumprogramma (jau tur vai nākotnē) darbojas ar to:

Nevainojama RabbitMQ migrācija uz Kubernetes

... un mÅ«su priekŔā ir uzdevums to migrēt uz jauno iestudējumu Kubernetes.

Vispirms tiks aprakstÄ«ta vispārējā pieeja paÅ”ai migrācijai un pēc tam tiks aprakstÄ«tas tās ievieÅ”anas tehniskās detaļas.

Migrācijas algoritms

Pirmais, sākotnējais posms pirms jebkādas darbÄ«bas ir pārbaudÄ«t, vai vecajā RabbitMQ instalācijā ir iespējots augstas pieejamÄ«bas režīms (HA). Iemesls ir acÄ«mredzams ā€” mēs nevēlamies zaudēt nekādus datus. Lai veiktu Å”o pārbaudi, varat doties uz RabbitMQ administratora paneli un cilnē AdministrÄ“Å”ana ā†’ Politikas pārliecinieties, vai vērtÄ«ba ir iestatÄ«ta. ha-mode: all:

Nevainojama RabbitMQ migrācija uz Kubernetes

Nākamais solis ir izveidot jaunu RabbitMQ klasteru Kubernetes podiņos (mÅ«su gadÄ«jumā, piemēram, sastāv no 3 mezgliem, bet to skaits var bÅ«t atŔķirÄ«gs).

Pēc tam mēs apvienojam vecos un jaunos RabbitMQ klasterus, iegūstot vienu klasteru (no 6 mezgliem):

Nevainojama RabbitMQ migrācija uz Kubernetes

Tiek uzsākts datu sinhronizācijas process starp veco un jauno RabbitMQ klasteriem. Kad visi dati ir sinhronizēti starp visiem klastera mezgliem, mēs varam pārslēgt lietojumprogrammu, lai izmantotu jauno klasteru:

Nevainojama RabbitMQ migrācija uz Kubernetes

Pēc Ŕīm darbÄ«bām pietiek noņemt vecos mezglus no RabbitMQ klastera, un pārvietoÅ”anu var uzskatÄ«t par pabeigtu:

Nevainojama RabbitMQ migrācija uz Kubernetes

Mēs esam daudzkārt izmantojuÅ”i Å”o shēmu ražoÅ”anā. Tomēr mÅ«su paÅ”u ērtÄ«bām mēs to ieviesām specializētā sistēmā, kas izplata standarta RMQ konfigurācijas vairākos Kubernetes klasteros. (tiem, kam ir interese: mēs runājam par papildinājumu operatorspar ko mēs nesen stāstÄ«ja). Tālāk mēs sniegsim individuālas instrukcijas, kuras ikviens var izmantot savās instalācijās, lai izmēģinātu piedāvāto risinājumu darbÄ«bā.

Izmēģināsim to praksē

Prasības

Sīkāka informācija ir ļoti vienkārŔa:

  1. Kubernetes klasteris (derēs arī minikube);
  2. RabbitMQ klasteris (var izvietot uz tukŔa metāla un izveidot kā parastu kopu Kubernetes no oficiālās Helm diagrammas).

Tālāk esoÅ”ajā piemērā es izvietoju RMQ vietnē Kubernetes un to nosaucu rmq-old.

Statīva sagatavoŔana

1. Lejupielādējiet stÅ«res diagrammu un nedaudz rediģējiet to:

helm fetch --untar stable/rabbitmq-ha

Ērtības labad mēs iestatām paroli, ErlangCookie un taisīt politiku ha-alllai pēc noklusējuma rindas tiktu sinhronizētas starp visiem RMQ klastera mezgliem:

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. Instalējiet diagrammu:

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

3. Dodieties uz RabbitMQ administratora paneli, izveidojiet jaunu rindu un pievienojiet vairākus ziņojumus. Tie bÅ«s nepiecieÅ”ami, lai pēc migrācijas mēs varētu pārliecināties, ka visi dati ir saglabāti un mēs neko neesam zaudējuÅ”i:

Nevainojama RabbitMQ migrācija uz Kubernetes

Pārbaudes stends ir gatavs: mums ir ā€œvecaisā€ RabbitMQ ar datiem, kas jāpārsÅ«ta.

RabbitMQ klastera migrēŔana

1. Vispirms izvietosim jauno RabbitMQ draugs nosaukumvieta ar tas pats ErlangCookie un lietotāja paroli. Lai to izdarÄ«tu, mēs veiksim iepriekÅ” aprakstÄ«tās darbÄ«bas, mainot pēdējo RMQ instalÄ“Å”anas komandu uz Ŕādu:

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

2. Tagad jums ir jāapvieno jaunais klasteris ar veco. Lai to izdarītu, dodieties uz katru no pākstīm jauns RabbitMQ un izpildiet komandas:

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

Mainīgā OLD_RMQ tiek atrasta viena no mezgliem adrese vecs RMQ klasteris.

Å Ä«s komandas apturēs paÅ”reizējo mezglu jauns RMQ klasteris, pievienojiet to vecajam klasterim un palaidiet to vēlreiz.

3. 6 mezglu RMQ klasteris ir gatavs:

Nevainojama RabbitMQ migrācija uz Kubernetes

Jums jāgaida, kamēr ziņojumi tiek sinhronizēti starp visiem mezgliem. Nav grūti uzminēt, ka ziņojumu sinhronizācijas laiks ir atkarīgs no aparatūras jaudas, uz kuras ir izvietots klasteris, un no ziņojumu skaita. Aprakstītajā scenārijā tie ir tikai 10, tāpēc dati tika sinhronizēti momentāni, bet ar pietiekami lielu ziņojumu skaitu sinhronizācija var ilgt stundām.

Tātad, sinhronizācijas statuss:

Nevainojama RabbitMQ migrācija uz Kubernetes

Å eit +5 nozÄ«mē, ka ziņojumi jau ir ienākuÅ”i vairāk uz 5 mezgliem (izņemot to, kas norādÄ«ts laukā Node). Tādējādi sinhronizācija bija veiksmÄ«ga.

4. Atliek tikai pārslēgt RMQ adresi aplikācijā uz jauno klasteru (konkrētās darbÄ«bas Å”eit ir atkarÄ«gas no izmantotā tehnoloÄ£iju steka un citas aplikācijas specifikas), pēc kā var atvadÄ«ties no vecās.

Par pēdējo operāciju (t.i., jau pēc lietojumprogrammas pārslēgÅ”ana uz jaunu kopu) dodieties uz katru mezglu vecs klasteri un izpildiet komandas:

rabbitmqctl stop_app
rabbitmqctl reset

Klasteris ā€œaizmirsaā€ par vecajiem mezgliem: varat izdzēst veco RMQ, kurā brÄ«dÄ« pārvietoÅ”ana tiks pabeigta.

Piezīme: Ja izmantojat RMQ ar sertifikātiem, nekas būtiski nemainās - pārvietoŔanas process tiks veikts tieŔi tāpat.

Atzinumi

AprakstÄ«tā shēma ir piemērota gandrÄ«z visiem gadÄ«jumiem, kad mums ir nepiecieÅ”ams migrēt RabbitMQ vai vienkārÅ”i pāriet uz jaunu klasteru.

MÅ«su gadÄ«jumā grÅ«tÄ«bas radās tikai vienu reizi, kad RMQ tika piekļūts no daudzām vietām, un mums nebija iespējas nomainÄ«t RMQ adresi uz jaunu visur. Pēc tam tajā paŔā nosaukumvietā iedarbinājām jaunu RMQ ar vienādām etiÄ·etēm, lai tas ietilptu esoÅ”ajos servisos un Ingresses, un, palaižot podziņu, mēs ar rokām manipulējām ar etiÄ·etēm, sākumā tās noņemot, lai pieprasÄ«jumi nenonāktu uz tukÅ”u RMQ un pievienojiet tos atpakaļ pēc ziņojumu sinhronizācijas.

Mēs izmantojām to paÅ”u stratēģiju, atjauninot RabbitMQ uz jaunu versiju ar mainÄ«tu konfigurāciju - viss darbojās kā pulkstenis.

PS

Kā loÄ£isks Ŕī materiāla turpinājums mēs gatavojam rakstus par MongoDB (migrācija no aparatÅ«ras servera uz Kubernetes) un MySQL (kā mēs sagatavojam Å”o DBVS Kubernetes iekÅ”ienē). Tie tiks publicēti tuvāko mēneÅ”u laikā.

PPS

Lasi arī mūsu emuārā:

Avots: www.habr.com

Pievieno komentāru