Kubernetes miqrasiyasına qüsursuz RabbitMQ

Kubernetes miqrasiyasına qüsursuz RabbitMQ

RabbitMQ Erlanq dilində yazılmış mesaj brokeridir ki, o, hər bir qovşağın oxumaq və yazma sorğularına xidmət göstərə biləcəyi bir çox qovşaqda tam məlumat replikasiyası ilə əvəzetmə klasterini təşkil etməyə imkan verir. İstehsalatda çoxlu Kubernetes klasterlərinə malik olmaqla, biz çoxlu sayda RabbitMQ qurğusunu dəstəkləyirik və fasiləsiz olaraq məlumatları bir klasterdən digərinə köçürmək ehtiyacı ilə üzləşdik.

Bu əməliyyat bizə ən azı iki halda lazım idi:

  1. Kubernetes-də yerləşməyən RabbitMQ klasterindən məlumatların yeni - artıq "kubernetləşdirilmiş" (yəni K8s podlarında fəaliyyət göstərən) klasterinə ötürülməsi.
  2. RabbitMQ-nun Kubernetes daxilində bir ad məkanından digərinə miqrasiyası (məsələn, sxemlər ad boşluqları ilə ayrılıbsa, infrastrukturu bir dövrədən digərinə köçürmək üçün).

Məqalədə təklif olunan resept ya artıq K3-lərdə və ya bəzi köhnə serverlərdə yerləşən köhnə RabbitMQ klasterinin (məsələn, 8 qovşaqdan) olduğu vəziyyətlərə (lakin onlarla məhdudlaşmır) yönəlmişdir. Kubernetes-də yerləşdirilən proqram (artıq orada və ya gələcəkdə) onunla işləyir:

Kubernetes miqrasiyasına qüsursuz RabbitMQ

... və biz onu Kubernetesdə yeni istehsala köçürmək vəzifəsi ilə qarşı-qarşıyayıq.

Əvvəlcə miqrasiyanın özünə ümumi yanaşma təsvir ediləcək və bundan sonra onun həyata keçirilməsinin texniki detalları təsvir olunacaq.

Miqrasiya alqoritmi

Hər hansı bir hərəkətdən əvvəl ilk, ilkin mərhələ köhnə RabbitMQ quraşdırmasında yüksək əlçatanlıq rejiminin işə salındığını yoxlamaqdır (HA). Səbəb aydındır - biz heç bir məlumatı itirmək istəmirik. Bu yoxlamanı həyata keçirmək üçün siz RabbitMQ admin panelinə keçə bilərsiniz və Admin → Siyasətlər sekmesinde dəyərin təyin olunduğundan əmin olun. ha-mode: all:

Kubernetes miqrasiyasına qüsursuz RabbitMQ

Növbəti addım Kubernetes podlarında yeni RabbitMQ klasterini qaldırmaqdır (bizim vəziyyətimizdə, məsələn, 3 qovşaqdan ibarətdir, lakin onların sayı fərqli ola bilər).

Bundan sonra köhnə və yeni RabbitMQ klasterlərini birləşdirərək tək bir çoxluq əldə edirik (6 qovşaqdan):

Kubernetes miqrasiyasına qüsursuz RabbitMQ

Köhnə və yeni RabbitMQ klasterləri arasında məlumatların sinxronizasiyası prosesinə başlandı. Bütün məlumatlar klasterdəki bütün qovşaqlar arasında sinxronlaşdırıldıqdan sonra tətbiqi yeni klasterdən istifadə etmək üçün dəyişə bilərik:

Kubernetes miqrasiyasına qüsursuz RabbitMQ

Bu əməliyyatlardan sonra köhnə qovşaqları RabbitMQ klasterindən çıxarmaq kifayətdir və hərəkət tam hesab edilə bilər:

Kubernetes miqrasiyasına qüsursuz RabbitMQ

Biz istehsalatda bu sxemdən dəfələrlə istifadə etmişik. Bununla belə, öz rahatlığımız üçün biz onu standart RMQ konfiqurasiyalarını çoxsaylı Kubernetes klasterləri arasında paylayan ixtisaslaşmış sistem daxilində həyata keçirdik. (maraqlananlar üçün: danışırıq addon-operatorhansı haqqında bu yaxınlarda dedi). Aşağıda biz təklif olunan həlli hərəkətdə sınamaq üçün hər kəsin öz qurğularına müraciət edə biləcəyi fərdi təlimatları təqdim edəcəyik.

Gəlin bunu praktikada sınayaq

Tələblər

Detallar çox sadədir:

  1. Kubernetes klasteri (minikube də işləyəcək);
  2. RabbitMQ klasteri (çılpaq metal üzərində yerləşdirilə bilər və rəsmi Helm diaqramından Kubernetesdə adi klaster kimi hazırlana bilər).

Aşağıdakı nümunə üçün RMQ-ni Kubernetes-ə yerləşdirdim və ona zəng etdim rmq-old.

Stend hazırlığı

1. Helm diaqramını yükləyin və bir az redaktə edin:

helm fetch --untar stable/rabbitmq-ha

Rahatlıq üçün parol təyin etdik, ErlangCookie və siyasət qurur ha-allBelə ki, standart olaraq növbələr RMQ klasterinin bütün qovşaqları arasında sinxronlaşdırılır:

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. Diaqramı quraşdırın:

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

3. RabbitMQ admin panelinə keçin, yeni növbə yaradın və bir neçə mesaj əlavə edin. Onlara ehtiyac olacaq ki, köçdükdən sonra bütün məlumatların qorunduğuna və heç nə itirmədiyimizə əmin ola bilək:

Kubernetes miqrasiyasına qüsursuz RabbitMQ

Test dəzgahı hazırdır: bizdə ötürülməsi lazım olan məlumatları olan "köhnə" RabbitMQ var.

RabbitMQ klasterinin köçürülməsi

1. Əvvəlcə yeni RabbitMQ-ni yerləşdirək другом ilə ad sahəsi eyni ErlangCookie və istifadəçi üçün parol. Bunu etmək üçün yuxarıda təsvir edilən əməliyyatları yerinə yetirəcəyik, RMQ quraşdırmaq üçün son əmri aşağıdakılara dəyişdirəcəyik:

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

2. İndi yeni klasteri köhnəsi ilə birləşdirməlisiniz. Bunu etmək üçün podların hər birinə keçin yeni RabbitMQ və əmrləri yerinə yetirin:

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

Dəyişəndə OLD_RMQ qovşaqlardan birinin ünvanı tapılır köhnə RMQ çoxluğu.

Bu əmrlər cari nodu dayandıracaq yeni RMQ çoxluğu, onu köhnə klasterə əlavə edin və yenidən işə salın.

3. 6 qovşaqdan ibarət RMQ çoxluğu hazırdır:

Kubernetes miqrasiyasına qüsursuz RabbitMQ

Mesajlar bütün qovşaqlar arasında sinxronizasiya olunana qədər gözləməlisiniz. Mesajın sinxronizasiya vaxtının klasterin yerləşdirildiyi aparatın tutumundan və mesajların sayından asılı olduğunu təxmin etmək çətin deyil. Təsvir edilən ssenaridə onlardan yalnız 10-u var, buna görə də məlumatlar dərhal sinxronlaşdırıldı, lakin kifayət qədər çox sayda mesajla sinxronizasiya saatlarla davam edə bilər.

Beləliklə, sinxronizasiya vəziyyəti:

Kubernetes miqrasiyasına qüsursuz RabbitMQ

Burada +5 mesajların artıq daxil olduğunu bildirir daha çox 5 qovşaqda (sahədə göstərilənlər istisna olmaqla Node). Beləliklə, sinxronizasiya uğurlu oldu.

4. Tətbiqdəki RMQ ünvanını yeni klasterə keçirmək qalır (burada xüsusi hərəkətlər istifadə etdiyiniz texnologiya yığınından və tətbiqin digər xüsusiyyətlərindən asılıdır), bundan sonra köhnəsi ilə vidalaşa bilərsiniz.

Son əməliyyat üçün (yəni artıq sonra tətbiqi yeni klasterə köçürmək) hər bir node gedin köhnə klaster edin və əmrləri yerinə yetirin:

rabbitmqctl stop_app
rabbitmqctl reset

Klaster köhnə qovşaqları "unudu": köhnə RMQ-ni silə bilərsiniz, bu zaman hərəkət tamamlanacaq.

Qeyd: Əgər siz RMQ-dan sertifikatlarla istifadə edirsinizsə, onda heç nə əsaslı şəkildə dəyişməyəcək - daşınma prosesi tam olaraq eyni şəkildə həyata keçiriləcək.

Tapıntılar

Təsvir edilən sxem, RabbitMQ-ni köçürməli və ya sadəcə yeni bir çoxluğa keçməli olduğumuz demək olar ki, bütün hallar üçün uyğundur.

Bizdə isə çətinliklər yalnız bir dəfə, RMQ-ya bir çox yerdən daxil olanda yaranıb və RMQ ünvanını hər yerdə yenisinə dəyişmək imkanımız olmayıb. Sonra biz eyni etiketlərlə eyni ad məkanında yeni RMQ-ni işə saldıq ki, o, mövcud xidmətlər və Girişlər altına düşsün və podu işə salarkən etiketləri əl ilə manipulyasiya etdik və sorğuların üzərinə düşməməsi üçün onları əvvəldən çıxardıq. boş RMQ və mesajlar sinxronlaşdırıldıqdan sonra onları geri əlavə edin.

RabbitMQ-u dəyişdirilmiş konfiqurasiya ilə yeni versiyaya yeniləyərkən eyni strategiyadan istifadə etdik - hər şey saat kimi işləyirdi.

PS

Bu materialın məntiqi davamı olaraq biz MongoDB (aparat serverindən Kubernetesə köçürmə) və MySQL (bu DBMS-ni Kubernetes daxilində necə hazırlayırıq) haqqında məqalələr hazırlayırıq. Onlar yaxın aylarda nəşr olunacaq.

PPS

Bloqumuzda da oxuyun:

Mənbə: www.habr.com

Добавить комментарий