RabbitMQ-г Kubernetes руу саадгүй шилжүүлэх

RabbitMQ-г Kubernetes руу саадгүй шилжүүлэх

RabbitMQ нь Erlang хэл дээр бичигдсэн мессеж брокер бөгөөд зангилаа бүр унших, бичих хүсэлтийг хүлээн авах боломжтой олон зангилаан дээр бүрэн өгөгдлийн хуулбарлах функциональ кластер зохион байгуулах боломжийг олгодог. Бид олон тооны Kubernetes кластеруудыг үйлдвэрлэж байгаа тул олон тооны RabbitMQ суулгацуудыг дэмждэг бөгөөд нэг кластераас нөгөөд зогсолтгүйгээр өгөгдлийг шилжүүлэх шаардлагатай тулгарсан.

Бид дор хаяж хоёр тохиолдолд энэ ажиллагаа шаардлагатай байсан:

  1. Kubernetes-д ороогүй RabbitMQ кластераас өгөгдлийг аль хэдийн "кубернетжүүлсэн" (жишээ нь K8s pods-д ажилладаг) - кластер руу шилжүүлэх.
  2. Kubernetes доторх RabbitMQ-г нэг нэрийн орон зайгаас нөгөөд шилжүүлэх (жишээ нь, хэлхээг нэрийн орон зайгаар хязгаарласан бол дэд бүтцийг нэг хэлхээнээс нөгөөд шилжүүлэх).

Нийтлэлд санал болгож буй жор нь K3 эсвэл зарим хуучин сервер дээр аль хэдийн байрладаг хуучин RabbitMQ кластер (жишээлбэл, 8 зангилаа) байдаг нөхцөл байдалд (гэхдээ тэдгээрээр хязгаарлагдахгүй) чиглэгддэг. Kubernetes дээр байрлуулсан програм (аль хэдийн байгаа эсвэл ирээдүйд) түүнтэй ажилладаг:

RabbitMQ-г Kubernetes руу саадгүй шилжүүлэх

... мөн бид үүнийг Кубернетес дэх шинэ үйлдвэрлэл рүү шилжүүлэх ажилтай тулгарч байна.

Нэгдүгээрт, шилжилт хөдөлгөөний ерөнхий хандлагыг тайлбарлаж, дараа нь түүнийг хэрэгжүүлэх техникийн нарийн ширийн зүйлийг тайлбарлах болно.

Шилжилтийн алгоритм

Аливаа үйлдэл хийхээс өмнөх эхний, урьдчилсан шат бол хуучин RabbitMQ суулгацад өндөр хүртээмжтэй горим идэвхжсэн эсэхийг шалгах явдал юм.HA). Шалтгаан нь ойлгомжтой - бид ямар ч өгөгдөл алдахыг хүсэхгүй байна. Энэ шалгалтыг хийхийн тулд та RabbitMQ админ самбар руу орж, Админ → Бодлого табаас утгыг тохируулсан эсэхийг шалгана уу. ha-mode: all:

RabbitMQ-г Kubernetes руу саадгүй шилжүүлэх

Дараагийн алхам бол Kubernetes pods-д шинэ RabbitMQ кластер үүсгэх явдал юм (бидний тохиолдолд жишээлбэл, 3 зангилаанаас бүрдэх боловч тэдгээрийн тоо өөр байж болно).

Үүний дараа бид хуучин болон шинэ RabbitMQ кластеруудыг нэгтгэж, нэг кластер (6 зангилаатай):

RabbitMQ-г Kubernetes руу саадгүй шилжүүлэх

Хуучин болон шинэ RabbitMQ кластеруудын хооронд өгөгдөл синхрончлох процесс эхэлсэн. Бүх өгөгдлийг кластерын бүх зангилааны хооронд синхрончилсны дараа бид шинэ кластер ашиглахын тулд програмыг сольж болно:

RabbitMQ-г Kubernetes руу саадгүй шилжүүлэх

Эдгээр үйлдлүүдийн дараа RabbitMQ кластераас хуучин зангилааг арилгахад хангалттай бөгөөд нүүдэл дууссан гэж үзэж болно.

RabbitMQ-г Kubernetes руу саадгүй шилжүүлэх

Бид энэ схемийг үйлдвэрлэлд олон удаа ашигласан. Гэсэн хэдий ч бид өөрсдийн тав тухыг хангах үүднээс үүнийг олон Kubernetes кластерт стандарт RMQ тохиргоог түгээдэг тусгай системд хэрэгжүүлсэн. (сонирч буй хүмүүст: бид ярьж байна addon-operatorүүний талаар бид саяхан хэлсэн). Доор бид санал болгож буй шийдлийг бодитоор туршиж үзэхийн тулд хүн бүр суулгацдаа хэрэглэж болох бие даасан зааврыг танилцуулах болно.

Үүнийг практик дээр туршиж үзье

шаардлага

Нарийвчилсан мэдээлэл нь маш энгийн:

  1. Kubernetes кластер (minikube бас ажиллах болно);
  2. RabbitMQ кластер (нүцгэн металл дээр байрлуулж, албан ёсны Helm графикаас Kubernetes дахь ердийн кластер шиг хийж болно).

Доорх жишээний хувьд би 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-г эхлүүлсэн бөгөөд ингэснээр энэ нь одоо байгаа үйлчилгээнүүд болон Ingresss-д хамаарах болно, мөн под-г ажиллуулахдаа бид шошгуудыг гараар удирдаж, эхнээс нь хассан бөгөөд ингэснээр хүсэлтүүд дээр буухгүй. RMQ-г хоосон болгож, зурвасуудыг синхрончилсны дараа буцааж нэмнэ.

RabbitMQ-г өөрчилсөн тохиргоотой шинэ хувилбар болгон шинэчлэхдээ бид ижил стратегийг ашигласан - бүх зүйл цаг шиг ажилласан.

PS

Энэхүү материалын логик үргэлжлэл болгон бид MongoDB (техник хангамжийн серверээс Kubernetes руу шилжих) болон MySQL (бид энэхүү DBMS-ийг Kubernetes дотор хэрхэн бэлтгэдэг) тухай нийтлэлүүдийг бэлтгэж байна. Тэд ирэх саруудад хэвлэгдэх болно.

PPS

Мөн манай блог дээрээс уншина уу:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх