Seamless RabbitMQ ka migrasi Kubernetes

Seamless RabbitMQ ka migrasi Kubernetes

RabbitMQ mangrupikeun calo pesen anu ditulis dina Erlang anu ngamungkinkeun anjeun ngatur kluster failover kalayan réplikasi data lengkep dina sababaraha titik, dimana unggal titik tiasa ngalayanan paménta maca sareng nyerat. Ngabogaan seueur klaster Kubernetes dina operasi produksi, kami ngadukung sajumlah ageung pamasangan RabbitMQ sareng disanghareupan kabutuhan migrasi data tina hiji klaster ka klaster anu sanés tanpa downtime.

Kami peryogi operasi ieu sahenteuna dina dua kasus:

  1. Mindahkeun data tina klaster RabbitMQ nu teu lokasina di Kubernetes ka anyar - geus "kubernetized" (ie operasi di pods K8s) - klaster.
  2. Migrasi RabbitMQ dina Kubernetes ti hiji ngaranspasi ka nu sejen (contona, mun sirkuit dibatesan ku spasi ngaran, lajeng mindahkeun infrastruktur ti hiji sirkuit ka nu sejen).

Resep anu diusulkeun dina tulisan éta difokuskeun kana kaayaan (tapi henteu dugi ka aranjeunna) dimana aya klaster RabbitMQ anu lami (contona, tina 3 titik), ayana dina K8 atanapi dina sababaraha server anu lami. Aplikasi anu di-host dina Kubernetes (geus aya atanapi ka hareup) tiasa dianggo sareng éta:

Seamless RabbitMQ ka migrasi Kubernetes

... sarta kami Nyanghareupan tugas migrasi ka produksi anyar di Kubernetes.

Kahiji, pendekatan umum pikeun migrasi sorangan bakal dijelaskeun, sarta sanggeus éta rinci teknis palaksanaan na bakal dijelaskeun.

Algoritma migrasi

Tahap kahiji, awal, sateuacan tindakan naon waé nyaéta mariksa yén mode kasadiaan tinggi diaktipkeun dina pamasangan RabbitMQ anu lami (HA). Alesanna écés - urang henteu hoyong kaleungitan data. Pikeun ngalaksanakeun pamariksaan ieu, anjeun tiasa angkat ka panel admin RabbitMQ sareng dina tab Admin → Kawijakan pastikeun yén nilaina disetel. ha-mode: all:

Seamless RabbitMQ ka migrasi Kubernetes

Lengkah saterusna nyaéta ngangkat klaster RabbitMQ anyar dina pods Kubernetes (dina kasus urang, contona, diwangun ku 3 titik, tapi jumlahna tiasa béda).

Saatos ieu, urang ngahijikeun klaster RabbitMQ anu lami sareng énggal, kéngingkeun klaster tunggal (tina 6 titik):

Seamless RabbitMQ ka migrasi Kubernetes

Prosés sinkronisasi data antara klaster RabbitMQ heubeul jeung anyar dimimitian. Sakali sadaya data disingkronkeun antara sadaya titik dina kluster, urang tiasa ngalihkeun aplikasi pikeun nganggo kluster énggal:

Seamless RabbitMQ ka migrasi Kubernetes

Saatos operasi ieu, cukup pikeun ngahapus titik lami tina klaster RabbitMQ, sareng pamindhahanna tiasa dianggap lengkep:

Seamless RabbitMQ ka migrasi Kubernetes

Kami geus dipaké skéma ieu sababaraha kali dina produksi. Nanging, pikeun genah urang sorangan, kami ngalaksanakeunana dina sistem khusus anu nyebarkeun konfigurasi RMQ standar dina sababaraha klaster Kubernetes. (pikeun anu panasaran: urang ngobrolkeun addon-operatorngeunaan nu urang karék bébéja). Di handap ieu kami bakal nampilkeun petunjuk individu anu tiasa dianggo ku saha waé dina pamasanganna pikeun nyobian solusi anu diusulkeun dina aksi.

Hayu urang coba dina prakna

sarat

Rincianna saderhana pisan:

  1. Kluster Kubernetes (minikube ogé tiasa dianggo);
  2. RabbitMQ klaster (bisa deployed on logam bulistir, sarta dijieun kawas klaster biasa di Kubernetes tina bagan Helm resmi).

Pikeun conto di handap, kuring nyebarkeun RMQ ka Kubernetes sareng nyebatna rmq-old.

Persiapan nangtung

1. Unduh bagan Helm sareng édit sakedik:

helm fetch --untar stable/rabbitmq-ha

Pikeun genah, urang nyetel sandi, ErlangCookie jeung nyieun pulitik ha-allsupados sacara standar antrian disingkronkeun antara sadaya titik tina klaster 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. Pasang bagan:

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

3. Buka panel admin RabbitMQ, jieun antrian anyar jeung tambahkeun sababaraha pesen. Éta bakal diperyogikeun supados saatos hijrah urang tiasa mastikeun yén sadaya data dilestarikan sareng kami henteu kaleungitan nanaon:

Seamless RabbitMQ ka migrasi Kubernetes

Bangku tés parantos siap: urang gaduh RabbitMQ "heubeul" kalayan data anu kedah ditransfer.

Migrasi klaster RabbitMQ

1. Kahiji, hayu urang nyebarkeun RabbitMQ anyar dina sobat namespace kalawan sarua ErlangCookie sareng kecap akses pikeun pangguna. Jang ngalampahkeun ieu, urang bakal ngalakukeun operasi ditétélakeun di luhur, ngarobah paréntah ahir pikeun masang RMQ ka handap:

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

2. Ayeuna anjeun kudu ngagabungkeun klaster anyar jeung nu heubeul. Jang ngalampahkeun ieu, buka unggal pods anyar RabbitMQ sareng laksanakeun paréntah:

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

Dina hiji variabel OLD_RMQ alamat salah sahiji titik kapanggih lami RMQ klaster.

Paréntah ieu bakal ngeureunkeun titik ayeuna anyar RMQ klaster, ngagantelkeun kana klaster heubeul tur ngajalankeun deui.

3. RMQ klaster 6 titik geus siap:

Seamless RabbitMQ ka migrasi Kubernetes

Anjeun kedah ngantosan samentawis pesen disingkronkeun antara sadaya titik. Teu hese nebak yén waktos sinkronisasi pesen gumantung kana kapasitas hardware on nu klaster ieu deployed sarta dina Jumlah pesen. Dina skenario anu dijelaskeun, ngan aya 10 di antarana, ku kituna data disingkronkeun sacara instan, tapi kalayan jumlah pesen anu cukup ageung, sinkronisasi tiasa salami sababaraha jam.

Janten, status sinkronisasi:

Seamless RabbitMQ ka migrasi Kubernetes

Ieu téh +5 hartina pesen geus asup deui dina 5 titik (iwal naon anu dituduhkeun di lapangan Node). Ku kituna, singkronisasi éta suksés.

4. Kabéh anu tetep nyaéta pikeun pindah alamat RMQ dina aplikasi ka klaster anyar (aksi husus dieu gumantung kana tumpukan téhnologi nu Anjeun anggo jeung spésifikasi aplikasi sejenna), sanggeus nu bisa pamit ka nu heubeul.

Pikeun operasi panungtungan (ie geus после ngaganti aplikasi ka klaster anyar) buka unggal titik lami klaster sareng laksanakeun paréntah:

rabbitmqctl stop_app
rabbitmqctl reset

Klaster "poho" ngeunaan titik heubeul: Anjeun tiasa ngahapus RMQ heubeul, di mana titik move bakal réngsé.

nyarios: Upami anjeun nganggo RMQ sareng sertipikat, maka teu aya anu dasarna robih - prosés gerak bakal dilaksanakeun sami.

papanggihan

Skéma anu dijelaskeun cocog pikeun ampir sadaya kasus nalika urang kedah migrasi RabbitMQ atanapi ngan saukur ngalih ka klaster énggal.

Dina kasus urang, kasusah timbul ngan sakali, nalika RMQ diaksés ti loba tempat, sarta kami teu boga kasempetan pikeun ngarobah alamat RMQ ka nu anyar madhab. Teras kami ngaluncurkeun RMQ énggal dina rohangan nami anu sami sareng labél anu sami supados éta bakal aya dina jasa sareng Ingresses anu tos aya, sareng nalika ngaluncurkeun pod kami ngamanipulasi labél ku tangan, ngaleungitkeun éta di awal supados pamundut henteu tumiba dina RMQ kosong, sareng nambihanana deui saatos pesen disingkronkeun.

Kami nganggo strategi anu sami nalika ngamutahirkeun RabbitMQ kana versi énggal kalayan konfigurasi anu dirobih - sadayana damel sapertos jam.

PS

Salaku tuluyan logis tina bahan ieu, urang nyiapkeun artikel ngeunaan MongoDB (migrasi ti server hardware ka Kubernetes) jeung MySQL (kumaha urang nyiapkeun DBMS ieu di jero Kubernetes). Aranjeunna bakal diterbitkeun dina bulan datang.

PPS

Baca ogé dina blog urang:

sumber: www.habr.com

Tambahkeun komentar