
Biz allaqachon gaplashdik , 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 , 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 . Ammo uni yuz marta ko'rgandan ko'ra, bir marta urinib ko'rgan ma'qul, shuning uchun kichik dasturni joylashtiramiz.
Tarantool kartrij bor 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-1rolini amalga oshiradiapi, bu rolni o'z ichiga oladivshard-router. Bu erda faqat bitta misol bo'ladi. - Replikatsiya to'plami
storage-1rolini amalga oshiradistorage(va ayni paytdavshard-storage), bu erda biz turli xil mashinalardan ikkita misol qo'shamiz.

Misolni ishga tushirish uchun bizga kerak и (2.8 yoki undan yuqori versiya).
Rolning o'zi . 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.0Biz virtual mashinalarni ko'taramiz:
$ vagrant upTarantool kartrijning muhim rolini o'rnating:
$ ansible-galaxy install tarantool.cartridge,1.0.1O'rnatilgan rolni ishga tushiring:
$ ansible-playbook -i hosts.yml playbook.ymlBiz o'yin kitobining bajarilishini kutamiz, o'ting va natijadan bahramand bo'ling:

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.cartridgeBu erda hech qanday qiziq narsa sodir bo'lmaydi, keling, ansible rolni ishga tushiramiz tarantool.cartridge.
Barcha eng muhim narsalar (masalan, klaster konfiguratsiyasi) ichida joylashgan -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.ymlVariantga 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 va yangi holatlarimizni kuzating:

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.ymlParametrda --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 .

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. 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-1Bu buyruq misolni ishga tushiradi storage-1 ilovalar myapp. Ishga tushirilgan namuna uni qidiradi в /etc/tarantool/conf.d/. Namuna jurnallari yordamida ko'rish mumkin journald.
Birlik fayli /etc/systemd/system/myapp@.sevice 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 connectva Lua moduli bilan barcha kerakli manipulyatsiyalarni bajaringcartridge.
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 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 va klaster parametrlarini o'zgartirish bilan tajriba o'tkazing.
Agar biror narsa ishlamasa, ishonch hosil qiling muammo haqida bizga. Biz hamma narsani tezda hal qilamiz!
Manba: www.habr.com
