Tarantool kartridjiga ilovalarni osongina va tabiiy ravishda o'rnating (1-qism)

Tarantool kartridjiga ilovalarni osongina va tabiiy ravishda o'rnating (1-qism)

Biz allaqachon gaplashdik Tarantool kartriji, bu sizga tarqatilgan ilovalarni ishlab chiqish va ularni paketlash imkonini beradi. Qolgan narsa - bu ilovalarni qanday joylashtirish va ularni boshqarishni o'rganish. Xavotir olmang, bizda hammasi bor! Biz Tarantool kartrij bilan ishlash bo'yicha barcha eng yaxshi amaliyotlarni to'pladik va yozdik muhim rol, bu paketni serverlarga tarqatadi, misollarni ishga tushiradi, ularni klasterga birlashtiradi, avtorizatsiyani sozlaydi, vshardni yuklaydi, avtomatik o'zgartirishni yoqadi va klaster konfiguratsiyasini tuzatadi.

Qiziqmi? Keyin, iltimos, kesish ostida, biz sizga hamma narsani aytib beramiz va ko'rsatamiz.

Keling, misol bilan boshlaylik

Biz rolimiz funksiyalarining faqat bir qismini ko'rib chiqamiz. Siz har doim uning barcha imkoniyatlari va kirish parametrlarining to'liq tavsifini topishingiz mumkin hujjatlar. Ammo uni yuz marta ko'rgandan ko'ra, bir marta urinib ko'rgan ma'qul, shuning uchun kichik dasturni joylashtiramiz.

Tarantool kartrij bor darslik bank mijozlari va ularning hisoblari haqidagi ma'lumotlarni saqlaydigan, shuningdek, HTTP orqali ma'lumotlarni boshqarish uchun API taqdim etadigan kichik Kartrij ilovasini yaratish. Bunga erishish uchun ilova ikkita mumkin bo'lgan rolni tavsiflaydi: api ΠΈ storage, bu misollarga tayinlanishi mumkin.

Kartrijning o'zi jarayonlarni qanday ishga tushirish haqida hech narsa aytmaydi, u faqat ishlayotgan misollarni sozlash imkoniyatini beradi. Qolganini foydalanuvchi o'zi qilishi kerak: konfiguratsiya fayllarini tartibga solish, xizmatlarni ishga tushirish va topologiyani sozlash. Ammo biz bularning barchasini qilmaymiz; Ansible buni biz uchun qiladi.

So'zdan amalgacha

Shunday qilib, keling, ilovamizni ikkita virtual mashinaga joylashtiramiz va oddiy topologiyani o'rnatamiz:

  • Replikatsiya to'plami app-1 rolini amalga oshiradi api, bu rolni o'z ichiga oladi vshard-router. Bu erda faqat bitta misol bo'ladi.
  • Replikatsiya to'plami storage-1 rolini amalga oshiradi storage (va ayni paytda vshard-storage), bu erda biz turli xil mashinalardan ikkita misol qo'shamiz.

Tarantool kartridjiga ilovalarni osongina va tabiiy ravishda o'rnating (1-qism)

Misolni ishga tushirish uchun bizga kerak Vagrant ΠΈ E'tirof etiladi (2.8 yoki undan yuqori versiya).

Rolning o'zi Ansible Galaxy. Bu sizning ishingizni almashish va tayyor rollardan foydalanish imkonini beruvchi ombordir.

Keling, omborni misol bilan klonlaylik:

$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0

Biz virtual mashinalarni ko'taramiz:

$ vagrant up

Tarantool kartrijning muhim rolini o'rnating:

$ ansible-galaxy install tarantool.cartridge,1.0.1

O'rnatilgan rolni ishga tushiring:

$ ansible-playbook -i hosts.yml playbook.yml

Biz o'yin kitobining bajarilishini kutamiz, o'ting http://localhost:8181/admin/cluster/dashboard va natijadan bahramand bo'ling:

Tarantool kartridjiga ilovalarni osongina va tabiiy ravishda o'rnating (1-qism)

Siz ma'lumotlarni yuklashingiz mumkin. Ajoyib, to'g'rimi?

Keling, bu bilan qanday ishlashni aniqlaymiz va shu bilan birga topologiyaga yana bir replika to'plamini qo'shamiz.

Keling, buni aniqlashni boshlaylik

Xo'sh, nima bo'ldi?

Biz ikkita virtual mashinani o'rnatdik va klasterimizni sozlagan foydali o'yin kitobini ishga tushirdik. Keling, faylning mazmunini ko'rib chiqaylik playbook.yml:

---
- name: Deploy my Tarantool Cartridge app
  hosts: all
  become: true
  become_user: root
  tasks:
  - name: Import Tarantool Cartridge role
    import_role:
      name: tarantool.cartridge

Bu erda hech qanday qiziq narsa sodir bo'lmaydi, keling, ansible rolni ishga tushiramiz tarantool.cartridge.

Barcha eng muhim narsalar (masalan, klaster konfiguratsiyasi) ichida joylashgan inventarizatsiya-fayl hosts.yml:

---
all:
  vars:
    # common cluster variables
    cartridge_app_name: getting-started-app
    cartridge_package_path: ./getting-started-app-1.0.0-0.rpm  # path to package

    cartridge_cluster_cookie: app-default-cookie  # cluster cookie

    # common ssh options
    ansible_ssh_private_key_file: ~/.vagrant.d/insecure_private_key
    ansible_ssh_common_args: '-o IdentitiesOnly=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

  # INSTANCES
  hosts:
    storage-1:
      config:
        advertise_uri: '172.19.0.2:3301'
        http_port: 8181

    app-1:
      config:
        advertise_uri: '172.19.0.3:3301'
        http_port: 8182

    storage-1-replica:
      config:
        advertise_uri: '172.19.0.3:3302'
        http_port: 8183

  children:
    # GROUP INSTANCES BY MACHINES
    host1:
      vars:
        # first machine connection options
        ansible_host: 172.19.0.2
        ansible_user: vagrant

      hosts:  # instances to be started on the first machine
        storage-1:

    host2:
      vars:
        # second machine connection options
        ansible_host: 172.19.0.3
        ansible_user: vagrant

      hosts:  # instances to be started on the second machine
        app-1:
        storage-1-replica:

    # GROUP INSTANCES BY REPLICA SETS
    replicaset_app_1:
      vars:  # replica set configuration
        replicaset_alias: app-1
        failover_priority:
          - app-1  # leader
        roles:
          - 'api'

      hosts:  # replica set instances
        app-1:

    replicaset_storage_1:
      vars:  # replica set configuration
        replicaset_alias: storage-1
        weight: 3
        failover_priority:
          - storage-1  # leader
          - storage-1-replica
        roles:
          - 'storage'

      hosts:   # replica set instances
        storage-1:
        storage-1-replica:

Bizga kerak bo'lgan yagona narsa bu faylning mazmunini o'zgartirish orqali misollar va replikalarni boshqarishni o'rganishdir. Keyinchalik unga yangi bo'limlar qo'shamiz. Ularni qaerga qo'shishni chalkashtirmaslik uchun siz ushbu faylning oxirgi versiyasini ko'rishingiz mumkin, hosts.updated.yml, bu misol omborida joylashgan.

Namuna boshqaruvi

Ansible nuqtai nazaridan, har bir misol xost (apparat serveri bilan adashtirmaslik kerak), ya'ni. Ansible boshqaradigan infratuzilma tuguni. Har bir xost uchun biz ulanish parametrlarini belgilashimiz mumkin (masalan ansible_host ΠΈ ansible_user), shuningdek namuna konfiguratsiyasi. Bo'limda misollarning tavsifi keltirilgan hosts.

Keling, namuna konfiguratsiyasini ko'rib chiqaylik storage-1:

all:
  vars:
    ...

  # INSTANCES
  hosts:
    storage-1:
      config:
        advertise_uri: '172.19.0.2:3301'
        http_port: 8181

  ...

O'zgaruvchida config biz misol parametrlarini aniqladik - advertise URI ΠΈ HTTP port.
Quyida misol parametrlari keltirilgan app-1 ΠΈ storage-1-replica.

Biz Ansible-ga har bir misol uchun ulanish parametrlarini aytishimiz kerak. Misollarni virtual mashina guruhlariga guruhlash mantiqiy ko'rinadi. Shu maqsadda misollar guruhlarga birlashtiriladi host1 ΠΈ host2, va bo'limdagi har bir guruhda vars qiymatlari ko'rsatilgan ansible_host ΠΈ ansible_user bitta virtual mashina uchun. Va bo'limda hosts β€” ushbu guruhga kiritilgan xostlar (aka misollar):

all:
  vars:
    ...
  hosts:
    ...
  children:
    # GROUP INSTANCES BY MACHINES
    host1:
      vars:
        # first machine connection options
        ansible_host: 172.19.0.2
        ansible_user: vagrant
       hosts:  # instances to be started on the first machine
        storage-1:

     host2:
      vars:
        # second machine connection options
        ansible_host: 172.19.0.3
        ansible_user: vagrant
       hosts:  # instances to be started on the second machine
        app-1:
        storage-1-replica:

Biz o'zgarishni boshlaymiz hosts.yml. Keling, yana ikkita misolni qo'shamiz, storage-2-replica birinchi virtual mashinada va storage-2 Ikkinchisida:

all:
  vars:
    ...

  # INSTANCES
  hosts:
    ...
    storage-2:  # <==
      config:
        advertise_uri: '172.19.0.3:3303'
        http_port: 8184

    storage-2-replica:  # <==
      config:
        advertise_uri: '172.19.0.2:3302'
        http_port: 8185

  children:
    # GROUP INSTANCES BY MACHINES
    host1:
      vars:
        ...
      hosts:  # instances to be started on the first machine
        storage-1:
        storage-2-replica:  # <==

    host2:
      vars:
        ...
      hosts:  # instances to be started on the second machine
        app-1:
        storage-1-replica:
        storage-2:  # <==
  ...

Aniq o'yin kitobini ishga tushiring:

$ ansible-playbook -i hosts.yml 
                   --limit storage-2,storage-2-replica 
                   playbook.yml

Variantga e'tibor bering --limit. Har bir klaster namunasi Ansible shartlarida xost bo'lganligi sababli, biz o'yin kitobini bajarishda qaysi misollar sozlanishi kerakligini aniq belgilashimiz mumkin.

Web UI ga qaytish http://localhost:8181/admin/cluster/dashboard va yangi holatlarimizni kuzating:

Tarantool kartridjiga ilovalarni osongina va tabiiy ravishda o'rnating (1-qism)

Keling, bu bilan to'xtab qolmay, topologiyani boshqarishni o'zlashtiraylik.

Topologiyani boshqarish

Keling, yangi misollarimizni replika to'plamiga birlashtiraylik storage-2. Keling, yangi guruh qo'shamiz replicaset_storage_2 va o'zgaruvchilardagi replikaset parametrlarini analogiya bilan tavsiflang replicaset_storage_1. Bo'limda hosts Keling, ushbu guruhga qaysi misollar kiritilishini ko'rsatamiz (ya'ni, bizning replika to'plamimiz):

---
all:
  vars:
    ...
  hosts:
    ...
  children:
    ...
    # GROUP INSTANCES BY REPLICA SETS
    ...
    replicaset_storage_2:  # <==
      vars:  # replicaset configuration
        replicaset_alias: storage-2
        weight: 2
        failover_priority:
          - storage-2
          - storage-2-replica
        roles:
          - 'storage'

      hosts:   # replicaset instances
        storage-2:
        storage-2-replica:

Keling, o'yin kitobini yana boshlaylik:

$ ansible-playbook -i hosts.yml 
                   --limit replicaset_storage_2 
                   --tags cartridge-replicasets 
                   playbook.yml

Parametrda --limit Bu safar biz replikasetimizga mos keladigan guruh nomini oldik.

Keling, variantni ko'rib chiqaylik tags.

Bizning rolimiz quyidagi teglar bilan belgilangan turli vazifalarni ketma-ket bajaradi:

  • cartridge-instances: misollarni boshqarish (konfiguratsiya, a'zolikka ulanish);
  • cartridge-replicasets: topologiyani boshqarish (takroriy to'plamlarni boshqarish va klasterdan namunalarni doimiy ravishda olib tashlash (chiqarish));
  • cartridge-config: boshqa klaster parametrlarini boshqarish (vshard bootstrapping, avtomatik yuklash rejimi, avtorizatsiya parametrlari va dastur konfiguratsiyasi).

Biz ishning qaysi qismini bajarishni xohlayotganimizni aniq belgilashimiz mumkin, keyin rol qolgan vazifalarni o'tkazib yuboradi. Bizning holatda, biz faqat topologiya bilan ishlashni xohlaymiz, shuning uchun biz ko'rsatdik cartridge-replicasets.

Keling, harakatlarimiz natijasini baholaylik. Biz yangi replikasetni topamiz http://localhost:8181/admin/cluster/dashboard.

Tarantool kartridjiga ilovalarni osongina va tabiiy ravishda o'rnating (1-qism)

Hooray!

Misollar va replika to'plamlari konfiguratsiyasini o'zgartirish bilan tajriba qiling va klaster topologiyasi qanday o'zgarishini ko'ring. Siz turli xil operatsion stsenariylarni sinab ko'rishingiz mumkin, masalan. aylanma yangilanish yoki oshirish memtx_memory. Rol ilovangizning mumkin bo'lgan uzilish vaqtini kamaytirish uchun misolni qayta ishga tushirmasdan buni qilishga harakat qiladi.

Yugurishni unutmang vagrant haltvirtual mashinalar bilan ishlashni tugatgandan so'ng ularni to'xtatish.

Va kaput ostida nima bor?

Bu erda men eksperimentlarimiz davomida rolli rol ostida nima sodir bo'lganligi haqida ko'proq aytib beraman.

Keling, Cartridge dasturini bosqichma-bosqich joylashtirishni ko'rib chiqaylik.

Paketni o'rnatish va misollarni boshlash

Avval paketni serverga yetkazishingiz va uni o'rnatishingiz kerak. Hozirda rol RPM va DEB paketlari bilan ishlashi mumkin.

Keyinchalik biz misollarni ishga tushiramiz. Bu erda hamma narsa juda oddiy: har bir misol alohida systemd-xizmat. Men sizga bir misol keltiraman:

$ systemctl start myapp@storage-1

Bu buyruq misolni ishga tushiradi storage-1 ilovalar myapp. Ishga tushirilgan namuna uni qidiradi konfiguratsiya Π² /etc/tarantool/conf.d/. Namuna jurnallari yordamida ko'rish mumkin journald.

Birlik fayli /etc/systemd/system/[email protected] systemd xizmati paketi bilan birga yetkazib beriladi.

Ansible paketlarni o'rnatish va tizim xizmatlarini boshqarish uchun o'rnatilgan modullarga ega; biz bu erda yangi hech narsa ixtiro qilganimiz yo'q.

Klaster topologiyasini o'rnatish

Qiziq shu erda boshlanadi. Qabul qiling, paketlarni o'rnatish va ishga tushirish uchun maxsus Ansible roli bilan bezovta qilish g'alati bo'lar edi systemd-xizmatlar.

Klasterni qo'lda sozlashingiz mumkin:

  • Birinchi variant: Web UI-ni oching va tugmalarni bosing. Bu bir nechta holatlarning bir martalik boshlanishi uchun juda mos keladi.
  • Ikkinchi variant: GraphQl API dan foydalanishingiz mumkin. Bu yerda siz allaqachon biror narsani avtomatlashtirishingiz mumkin, masalan, Python-da skript yozishingiz mumkin.
  • Uchinchi variant (irodalilar uchun): serverga o'ting, misollardan biriga ulaning tarantoolctl connect va Lua moduli bilan barcha kerakli manipulyatsiyalarni bajaring cartridge.

Bizning ixtiromizning asosiy vazifasi - aynan shu ishni bajarish, siz uchun ishning eng qiyin qismi.

Ansible sizga o'z modulingizni yozish va uni rolda ishlatish imkonini beradi. Bizning rolimiz turli xil klaster komponentlarini boshqarish uchun bunday modullardan foydalanadi.

U qanday ishlaydi? Klasterning kerakli holatini deklarativ konfiguratsiyada tasvirlaysiz va rol har bir modulni o'zining konfiguratsiya bo'limi bilan kirish sifatida ta'minlaydi. Modul klasterning joriy holatini oladi va uni kirish sifatida qabul qilingan bilan solishtiradi. Keyinchalik, misollardan birining rozetkasi orqali kod ishga tushiriladi, bu klasterni kerakli holatga keltiradi.

natijalar

Bugun biz Tarantool kartridjiga ilovangizni qanday joylashtirishni va oddiy topologiyani o'rnatishni aytdik va ko'rsatdik. Buning uchun biz Ansible-dan foydalandik - ulardan foydalanish oson va bir vaqtning o'zida ko'plab infratuzilma tugunlarini (bizning holatlarimizda klaster misollari) sozlash imkonini beruvchi kuchli vosita.

Yuqorida biz Ansible yordamida klaster konfiguratsiyasini tavsiflashning ko'p usullaridan birini ko'rib chiqdik. O'zingizni davom ettirishga tayyor bo'lgach, o'rganing eng yaxshi amaliyotlar o'yin kitoblarini yozish haqida. Siz topologiyangizni boshqarishni osonlashtirishingiz mumkin group_vars ΠΈ host_vars.

Tez orada biz topologiyadan misollarni butunlay yo'q qilish (chiqarib tashlash), vshardni yuklash, avtomatik uzilish rejimini boshqarish, avtorizatsiyani sozlash va klaster konfiguratsiyasini tuzatishni aytib beramiz. Ayni paytda siz o'zingiz o'rganishingiz mumkin hujjatlar va klaster parametrlarini o'zgartirish bilan tajriba o'tkazing.

Agar biror narsa ishlamasa, ishonch hosil qiling menga xabar bering muammo haqida bizga. Biz hamma narsani tezda hal qilamiz!

Manba: www.habr.com

a Izoh qo'shish