Biz allaqachon gaplashdik
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
Tarantool kartrij bor 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 oshiradiapi
, bu rolni o'z ichiga oladivshard-router
. Bu erda faqat bitta misol bo'ladi. - Replikatsiya to'plami
storage-1
rolini amalga oshiradistorage
(va ayni paytdavshard-storage
), bu erda biz turli xil mashinalardan ikkita misol qo'shamiz.
Misolni ishga tushirish uchun bizga kerak
Rolning o'zi
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
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 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
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
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. memtx_memory
. Rol ilovangizning mumkin bo'lgan uzilish vaqtini kamaytirish uchun misolni qayta ishga tushirmasdan buni qilishga harakat qiladi.
Yugurishni unutmang vagrant halt
virtual 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 /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 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 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
Agar biror narsa ishlamasa, ishonch hosil qiling
Manba: www.habr.com