Uhamiaji bila mshono wa RabbitMQ hadi Kubernetes

Uhamiaji bila mshono wa RabbitMQ hadi Kubernetes

RabbitMQ ni wakala wa ujumbe ulioandikwa kwa Erlang ambao hukuruhusu kupanga nguzo ya kushindwa na urudufishaji kamili wa data kwenye nodi nyingi, ambapo kila nodi inaweza kutoa huduma ya kusoma na kuandika maombi. Kwa kuwa na makundi mengi ya Kubernetes katika uendeshaji wa uzalishaji, tunaauni idadi kubwa ya usakinishaji wa RabbitMQ na tulikabiliwa na hitaji la kuhamisha data kutoka kundi moja hadi jingine bila muda wa chini.

Tulihitaji operesheni hii katika angalau kesi mbili:

  1. Kuhamisha data kutoka kwa kundi la RabbitMQ ambalo halipo Kubernetes hadi mpya - tayari "kubernetized" (yaani, inayofanya kazi katika maganda ya K8s) - nguzo.
  2. Uhamiaji wa RabbitMQ ndani ya Kubernetes kutoka nafasi moja ya majina hadi nyingine (kwa mfano, ikiwa mizunguko imetengwa na nafasi za majina, basi kuhamisha miundombinu kutoka kwa mzunguko mmoja hadi mwingine).

Kichocheo kilichopendekezwa katika kifungu kinazingatia hali (lakini sio mdogo kwao) ambayo kuna nguzo ya zamani ya RabbitMQ (kwa mfano, ya nodi 3), iko tayari katika K8 au kwenye seva za zamani. Programu iliyopangishwa kwenye Kubernetes (tayari ipo au katika siku zijazo) inafanya kazi nayo:

Uhamiaji bila mshono wa RabbitMQ hadi Kubernetes

... na tunakabiliwa na kazi ya kuihamisha hadi kwenye toleo jipya la Kubernetes.

Kwanza, mbinu ya jumla ya uhamiaji yenyewe itaelezwa, na baada ya hayo maelezo ya kiufundi ya utekelezaji wake yataelezwa.

Algorithm ya uhamiaji

Hatua ya kwanza, ya awali, kabla ya hatua yoyote ni kuangalia kuwa hali ya juu ya upatikanaji imewezeshwa katika usakinishaji wa zamani wa RabbitMQ (HA) Sababu ni dhahiri - hatutaki kupoteza data yoyote. Ili kutekeleza ukaguzi huu, unaweza kwenda kwa paneli ya msimamizi ya RabbitMQ na kwenye kichupo cha Msimamizi β†’ Sera hakikisha kuwa thamani imewekwa. ha-mode: all:

Uhamiaji bila mshono wa RabbitMQ hadi Kubernetes

Hatua inayofuata ni kuinua nguzo mpya ya RabbitMQ katika maganda ya Kubernetes (kwa upande wetu, kwa mfano, yenye nodi 3, lakini idadi yao inaweza kuwa tofauti).

Baada ya hayo, tunaunganisha nguzo za zamani na mpya za RabbitMQ, kupata nguzo moja (ya nodi 6):

Uhamiaji bila mshono wa RabbitMQ hadi Kubernetes

Mchakato wa kusawazisha data kati ya makundi ya zamani na mapya ya RabbitMQ umeanzishwa. Mara tu data yote ikisawazishwa kati ya nodi zote kwenye nguzo, tunaweza kubadilisha programu kutumia nguzo mpya:

Uhamiaji bila mshono wa RabbitMQ hadi Kubernetes

Baada ya shughuli hizi, inatosha kuondoa nodi za zamani kutoka kwa nguzo ya RabbitMQ, na hoja inaweza kuzingatiwa kuwa kamili:

Uhamiaji bila mshono wa RabbitMQ hadi Kubernetes

Tumetumia mpango huu mara nyingi katika uzalishaji. Hata hivyo, kwa manufaa yetu wenyewe, tuliitekeleza ndani ya mfumo maalumu unaosambaza usanidi wa kawaida wa RMQ kwenye makundi mengi ya Kubernetes. (kwa wale wanaotamani kujua: tunazungumza kiendeshaji cha kuongezaambayo sisi aliiambia hivi karibuni). Hapo chini tutawasilisha maagizo ya mtu binafsi ambayo mtu yeyote anaweza kutumia kwenye usakinishaji wake ili kujaribu suluhisho lililopendekezwa kwa vitendo.

Hebu tujaribu kwa vitendo

Mahitaji

Maelezo ni rahisi sana:

  1. Nguzo ya Kubernetes (minikube pia itafanya kazi);
  2. Nguzo ya RabbitMQ (inaweza kutumwa kwenye chuma tupu, na kufanywa kama nguzo ya kawaida huko Kubernetes kutoka kwa chati rasmi ya Helm).

Kwa mfano hapa chini, nilipeleka RMQ kwa Kubernetes na kuiita rmq-old.

Maandalizi ya kusimama

1. Pakua chati ya Helm na uihariri kidogo:

helm fetch --untar stable/rabbitmq-ha

Kwa urahisi, tunaweka nenosiri, ErlangCookie na kufanya siasa ha-allili kwa chaguo-msingi foleni zisawazishwe kati ya nodi zote za nguzo ya RMQ:

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. Sakinisha chati:

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

3. Nenda kwenye jopo la msimamizi wa RabbitMQ, unda foleni mpya na uongeze ujumbe kadhaa. Watahitajika ili baada ya uhamiaji tuweze kuhakikisha kuwa data zote zimehifadhiwa na hatujapoteza chochote:

Uhamiaji bila mshono wa RabbitMQ hadi Kubernetes

Benchi ya majaribio iko tayari: tuna RabbitMQ ya "zamani" yenye data ambayo inahitaji kuhamishwa.

Kuhamisha nguzo ya RabbitMQ

1. Kwanza, hebu tupeleke RabbitMQ mpya ndani rafiki nafasi ya jina na sawa ErlangCookie na nenosiri kwa mtumiaji. Ili kufanya hivyo, tutafanya shughuli zilizoelezwa hapo juu, tukibadilisha amri ya mwisho ya kusanikisha RMQ kuwa ifuatayo:

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

2. Sasa unahitaji kuunganisha nguzo mpya na ya zamani. Ili kufanya hivyo, nenda kwa kila ganda mpya RabbitMQ na utekeleze amri:

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

Katika kutofautiana OLD_RMQ anwani ya moja ya nodes hupatikana mzee Kundi la RMQ.

Amri hizi zitasimamisha nodi ya sasa mpya Nguzo ya RMQ, iambatanishe na nguzo ya zamani na uzindue tena.

3. Nguzo ya RMQ ya nodi 6 iko tayari:

Uhamiaji bila mshono wa RabbitMQ hadi Kubernetes

Lazima usubiri wakati ujumbe unasawazishwa kati ya nodi zote. Si vigumu nadhani kwamba muda wa maingiliano ya ujumbe unategemea uwezo wa maunzi ambayo nguzo imetumwa na kwa idadi ya ujumbe. Katika hali iliyoelezewa, kuna 10 tu kati yao, kwa hivyo data ililandanishwa mara moja, lakini kwa idadi kubwa ya ujumbe, maingiliano yanaweza kudumu kwa masaa.

Kwa hivyo, hali ya maingiliano:

Uhamiaji bila mshono wa RabbitMQ hadi Kubernetes

Hapa +5 inamaanisha kuwa ujumbe tayari umeingia zaidi kwenye nodi 5 (isipokuwa kwa kile kilichoonyeshwa kwenye uwanja Node) Kwa hivyo, maingiliano yalifanikiwa.

4. Kilichobaki ni kubadili anwani ya RMQ katika programu hadi kwenye nguzo mpya (vitendo mahususi hapa vinategemea mrundikano wa teknolojia unaotumia na maelezo mengine maalum ya programu), baada ya hapo unaweza kusema kwaheri kwa ile ya zamani.

Kwa operesheni ya mwisho (yaani tayari baada ya kubadilisha programu kwa nguzo mpya) nenda kwa kila nodi mzee unganisha na utekeleze amri:

rabbitmqctl stop_app
rabbitmqctl reset

Kundi "limesahau" kuhusu nodes za zamani: unaweza kufuta RMQ ya zamani, ambapo hatua itakamilika.

Kumbuka: Ikiwa unatumia RMQ na vyeti, basi hakuna kitu kinachobadilika - mchakato wa kusonga utafanyika sawa.

Matokeo

Mpango uliofafanuliwa unafaa kwa karibu kesi zote tunapohitaji kuhama RabbitMQ au tu kuhamia kwenye kundi jipya.

Kwa upande wetu, matatizo yalitokea mara moja tu, wakati RMQ ilifikiwa kutoka sehemu nyingi, na hatukupata fursa ya kubadilisha anwani ya RMQ kuwa mpya kila mahali. Kisha tukazindua RMQ mpya katika nafasi ile ile ya majina na lebo zile zile ili ianguke chini ya huduma zilizopo na Ingresses, na wakati wa kuzindua pod tulibadilisha lebo kwa mkono, tukiziondoa mwanzoni ili maombi yasianguke kwenye RMQ tupu, na kuziongeza baada ya ujumbe kusawazishwa.

Tulitumia mkakati sawa wakati wa kusasisha RabbitMQ hadi toleo jipya na usanidi uliobadilishwa - kila kitu kilifanya kazi kama saa.

PS

Kama muendelezo wa kimantiki wa nyenzo hii, tunatayarisha makala kuhusu MongoDB (kuhama kutoka kwa seva ya maunzi hadi Kubernetes) na MySQL (jinsi tunavyotayarisha DBMS hii ndani ya Kubernetes). Zitachapishwa katika miezi ijayo.

PPS

Soma pia kwenye blogi yetu:

Chanzo: mapenzi.com

Kuongeza maoni