RabbitMQ-ны Kubernetes-ке үздіксіз көшіру

RabbitMQ-ны Kubernetes-ке үздіксіз көшіру

RabbitMQ — Erlang тілінде жазылған хабар брокері, ол әр түйін оқу және жазу сұрауларына қызмет көрсете алатын бірнеше түйіндер бойынша толық деректер репликасы бар ауыстырып қосу кластерін ұйымдастыруға мүмкіндік береді. Өндірісте көптеген Kubernetes кластерлері болғандықтан, біз RabbitMQ қондырғыларының үлкен санын қолдаймыз және деректерді бір кластерден екіншісіне тоқтаусыз көшіру қажеттілігіне тап болдық.

Бұл операция бізге кем дегенде екі жағдайда қажет болды:

  1. Деректерді Kubernetes ішінде орналаспаған RabbitMQ кластерінен жаңа – әлдеқашан «кубернетизацияланған» (яғни K8s қосқыштарында жұмыс істейтін) кластерге тасымалдау.
  2. Kubernetes ішіндегі RabbitMQ бір аттар кеңістігінен екіншісіне көшіру (мысалы, егер тізбектер аттар кеңістігімен бөлінген болса, инфрақұрылымды бір тізбектен екіншісіне тасымалдау үшін).

Мақалада ұсынылған рецепт K3-де немесе кейбір ескі серверлерде орналасқан ескі RabbitMQ кластері (мысалы, 8 түйін) бар жағдайларға бағытталған (бірақ олармен шектелмейді). Kubernetes-те орналастырылған қолданба (қазірдің өзінде немесе болашақта) онымен жұмыс істейді:

RabbitMQ-ны Kubernetes-ке үздіксіз көшіру

... және алдымызда оны Кубернетестегі жаңа өндіріске көшіру міндеті тұр.

Біріншіден, көші-қонның өзіне жалпы көзқарас сипатталады, содан кейін оны жүзеге асырудың техникалық бөлшектері сипатталады.

Көшіру алгоритмі

Кез келген әрекеттің алдындағы бірінші, алдын ала кезең - ескі RabbitMQ орнатуында жоғары қолжетімділік режимінің қосылғанын тексеру (HA). Себебі анық - біз ешқандай деректерді жоғалтқымыз келмейді. Бұл тексеруді орындау үшін сіз RabbitMQ басқару тақтасына өтіп, Әкімші → Саясат қойындысында мәннің орнатылғанын тексеріңіз. ha-mode: all:

RabbitMQ-ны Kubernetes-ке үздіксіз көшіру

Келесі қадам - ​​Kubernetes қосқыштарында жаңа RabbitMQ кластерін көтеру (біздің жағдайда, мысалы, 3 түйіннен тұрады, бірақ олардың саны әртүрлі болуы мүмкін).

Осыдан кейін біз ескі және жаңа RabbitMQ кластерлерін біріктіріп, бір кластерді (6 түйіннен) аламыз:

RabbitMQ-ны Kubernetes-ке үздіксіз көшіру

Ескі және жаңа RabbitMQ кластерлері арасында деректерді синхрондау процесі басталады. Барлық деректер кластердегі барлық түйіндер арасында синхрондалған соң, біз қолданбаны жаңа кластерді пайдалану үшін ауыстыра аламыз:

RabbitMQ-ны Kubernetes-ке үздіксіз көшіру

Осы әрекеттерден кейін RabbitMQ кластерінен ескі түйіндерді алып тастау жеткілікті және жылжытуды аяқталды деп санауға болады:

RabbitMQ-ны Kubernetes-ке үздіксіз көшіру

Біз бұл схеманы өндірісте талай рет қолдандық. Дегенмен, өзімізге ыңғайлы болу үшін біз оны бірнеше Kubernetes кластерлері бойынша стандартты RMQ конфигурацияларын тарататын арнайы жүйеде іске асырдық. (қызықты адамдар үшін: біз айтып отырмыз қосымша операторыол туралы біз жақында ғана айтты). Төменде біз ұсынылған шешімді қолданып көру үшін кез келген адам өз қондырғыларында қолдана алатын жеке нұсқауларды ұсынамыз.

Оны іс жүзінде қолданып көрейік

талаптар

Мәліметтер өте қарапайым:

  1. Kubernetes кластері (minikube де жұмыс істейді);
  2. RabbitMQ кластері (жалаңаш металға орналастыруға болады және ресми Helm диаграммасынан Кубернетестегі кәдімгі кластер сияқты жасалуы мүмкін).

Төмендегі мысал үшін мен RMQ-ды Kubernetes-ке орналастырдым және оны шақырдым rmq-old.

Стенд дайындау

1. Helm диаграммасын жүктеп алып, оны аздап өңдеңіз:

helm fetch --untar stable/rabbitmq-ha

Ыңғайлы болу үшін біз пароль орнаттық, ErlangCookie және саясат жасайды ha-allәдепкі бойынша кезектер 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. Диаграмманы орнатыңыз:

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

3. RabbitMQ басқару тақтасына өтіп, жаңа кезек жасаңыз және бірнеше хабар қосыңыз. Олар тасымалдаудан кейін барлық деректердің сақталғанына және біз ештеңе жоғалтпағанымызға көз жеткізу үшін қажет болады:

RabbitMQ-ны Kubernetes-ке үздіксіз көшіру

Сынақ үстелі дайын: бізде берілуі қажет деректері бар «ескі» RabbitMQ бар.

RabbitMQ кластерін тасымалдау

1. Алдымен, жаңа RabbitMQ қолданбасын орналастырайық другом бар аттар кеңістігі бірдей ErlangCookie және пайдаланушы үшін құпия сөз. Ол үшін RMQ орнатудың соңғы пәрменін келесіге өзгерте отырып, жоғарыда сипатталған әрекеттерді орындаймыз:

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

2. Енді жаңа кластерді ескімен біріктіру керек. Бұл әрекетті орындау үшін, бүршіктердің әрқайсысына өтіңіз жаңа RabbitMQ және пәрмендерді орындаңыз:

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 түйіндердің бірінің мекенжайы табылды ескі RMQ кластері.

Бұл пәрмендер ағымдағы түйінді тоқтатады жаңа RMQ кластері, оны ескі кластерге тіркеп, қайта іске қосыңыз.

3. 6 түйіннен тұратын RMQ кластері дайын:

RabbitMQ-ны Kubernetes-ке үздіксіз көшіру

Хабарлар барлық түйіндер арасында синхрондалғанша күту керек. Хабарламаны синхрондау уақыты кластер орналастырылған аппараттық құралдың сыйымдылығына және хабарламалар санына байланысты екенін болжау қиын емес. Сипатталған сценарийде олардың тек 10-ы бар, сондықтан деректер лезде синхрондалған, бірақ хабарламалардың жеткілікті санымен синхрондау бірнеше сағатқа созылуы мүмкін.

Сонымен, синхрондау күйі:

RabbitMQ-ны Kubernetes-ке үздіксіз көшіру

Бұл +5 хабарлар әлдеқашан бар дегенді білдіреді толығырақ 5 түйінде (өрісте көрсетілгеннен басқа Node). Осылайша, синхрондау сәтті болды.

4. Қолданбадағы RMQ мекенжайын жаңа кластерге ауыстыру ғана қалады (мұндағы нақты әрекеттер сіз пайдаланып жатқан технология стекіне және қолданбаның басқа ерекшеліктеріне байланысты), содан кейін ескімен қоштаса аласыз.

Соңғы операция үшін (яғни қазірдің өзінде после қолданбаны жаңа кластерге ауыстыру) әрбір түйінге өтіңіз ескі кластер жасаңыз және командаларды орындаңыз:

rabbitmqctl stop_app
rabbitmqctl reset

Кластер ескі түйіндерді «ұмытып» қалды: ескі RMQ-ны жоюға болады, сол кезде жылжыту аяқталады.

ескерту: Егер сіз сертификаттармен RMQ қолдансаңыз, онда түбегейлі ештеңе өзгермейді - жылжыту процесі дәл солай орындалады.

қорытындылар

Сипатталған схема RabbitMQ көшіру немесе жай ғана жаңа кластерге көшу қажет болған барлық дерлік жағдайларға жарамды.

Біздің жағдайда қиындықтар тек бір рет пайда болды, RMQ көптеген жерлерден қол жетімді болды және бізде RMQ мекенжайын барлық жерде жаңасына өзгерту мүмкіндігі болмады. Содан кейін біз сол белгілермен бірдей аттар кеңістігінде жаңа RMQ іске қостық, осылайша ол бар қызметтер мен кірістерге түседі, ал подкастты іске қосқан кезде біз белгілерді қолмен басқардық, сұраулар сайтқа түспеуі үшін оларды басында алып тастадық. бос RMQ және хабарлар қадамдастырылғаннан кейін оларды кері қосу.

Біз RabbitMQ конфигурациясы өзгертілген жаңа нұсқаға жаңарту кезінде бірдей стратегияны қолдандық - бәрі сағат сияқты жұмыс істеді.

PS

Осы материалдың логикалық жалғасы ретінде біз MongoDB (аппараттық серверден Kubernetes-ке көшу) және MySQL (бұл ДҚБЖ-ны Kubernetes ішінде қалай дайындаймыз) туралы мақалалар дайындаймыз. Олар алдағы айларда жарияланады.

PPS

Біздің блогта да оқыңыз:

Ақпарат көзі: www.habr.com

пікір қалдыру