Бид аль хэдийн ярьсан
Сонирхолтой юу? Дараа нь би захын доор асууж, бид бүгдийг хэлж, харуулах болно.
Нэг жишээгээр эхэлье
Бид үүргийнхээ зөвхөн нэг хэсгийг л авч үзэх болно. Та түүний бүх функцууд болон оролтын параметрүүдийн бүрэн тайлбарыг үргэлж эндээс олох боломжтой
Tarantool Cartridge байна api
и storage
тохиолдлуудад оноож болно.
Cartridge нь өөрөө процессыг хэрхэн эхлүүлэх талаар юу ч хэлдэггүй бөгөөд энэ нь зөвхөн ажиллаж байгаа тохиолдлуудыг тохируулах боломжийг олгодог. Хэрэглэгч үлдсэнийг нь өөрөө хийх ёстой: тохиргооны файлуудыг задлах, үйлчилгээг эхлүүлэх, топологийг тохируулах. Гэхдээ бид энэ бүгдийг хийхгүй, Ansible бидний төлөө хийх болно.
Үгнээс нь үйлдэл хүртэл
Тиймээс, програмаа хоёр виртуал машинд байрлуулж, энгийн топологийг тохируулцгаая.
- Хуулбарлах багц
app-1
дүрд тоглох болноapi
үүнд үүрэг багтдагvshard-router
. Энд зөвхөн нэг тохиолдол байх болно. - хуулбарласан багц
storage-1
үүргийг хэрэгжүүлдэгstorage
(мөн нэгэн зэрэгvshard-storage
), энд бид өөр өөр машинуудын хоёр жишээг нэмнэ.
Жишээ ажиллуулахын тулд бидэнд хэрэгтэй
Дүр нь өөрөө
Хадгалах газрыг жишээгээр хуулбарлана уу:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Бид виртуал машинуудыг өсгөдөг:
$ vagrant up
Tarantool Cartridge-г суулгах боломжтой:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Суулгасан үүргийг ажиллуулна уу:
$ ansible-playbook -i hosts.yml playbook.yml
Бид тоглоомын дэвтрийн гүйцэтгэлийн төгсгөлийг хүлээж байна, очно уу
Та өгөгдөл асгаж болно. Гайхалтай, тийм үү?
Одоо үүнтэй хэрхэн ажиллахаа олж мэдье, мөн үүнтэй зэрэгцэн топологид өөр нэг хуулбарыг нэмье.
Бид ойлгож эхэлдэг
Тэгээд юу болсон бэ?
Бид хоёр VM-ийг ажиллуулж, кластераа тохируулах боломжтой тоглоомын номыг ажиллуулж байна. Файлын агуулгыг харцгаая 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
Энд ямар ч сонирхолтой зүйл тохиолдохгүй, бид ansible-дүрийг эхлүүлдэг tarantool.cartridge
.
Хамгийн чухал нь (жишээлбэл, кластерийн тохиргоо) дотор байрладаг 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:
Бидэнд хэрэгтэй зүйл бол энэ файлын агуулгыг өөрчлөх замаар жишээнүүд болон хуулбаруудыг хэрхэн удирдах талаар сурах явдал юм. Дараа нь бид түүнд шинэ хэсгүүдийг нэмэх болно. Хаана нэмэх талаар эргэлзэхгүйн тулд та энэ файлын эцсийн хувилбарыг үзэж болно. hosts.updated.yml
, энэ нь жишээ репозиторт байгаа.
Instance Management
Ansible-ийн хувьд жишээ бүр нь хост (төмөр сервертэй андуурч болохгүй), i.e. Ansible-ийн удирдах дэд бүтцийн зангилаа. Хост бүрийн хувьд бид холболтын параметрүүдийг (жишээ нь ansible_host
и ansible_user
), түүнчлэн жишээний тохиргоо. Тохиолдлын тайлбарыг хэсэгт оруулсан болно hosts
.
Жишээ тохиргоог авч үзье storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
Хувьсагчаар config
бид жишээний параметрүүдийг тодорхойлсон - advertise URI
и HTTP port
.
Доорх жишээний параметрүүд байна app-1
и storage-1-replica
.
Бид Ansible-д тохиолдол бүрийн холболтын параметрүүдийг хэлэх хэрэгтэй. Виртуал машины бүлгүүдэд тохиолдлуудыг бүлэглэх нь логик юм шиг санагддаг. Үүнийг хийхийн тулд тохиолдлуудыг бүлэгт нэгтгэдэг. host1
и host2
, мөн хэсэг дэх бүлэг бүрт vars
үнэт зүйлс ansible_host
и ansible_user
нэг виртуал машинд зориулагдсан. Мөн хэсэгт hosts
- энэ бүлэгт багтсан хостууд (тэдгээр нь жишээнүүд):
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:
Бид өөрчлөгдөж эхэлдэг hosts.yml
. Өөр хоёр тохиолдлыг нэмье, storage-2-replica
анхны виртуал машин дээр болон storage-2
Хоёр дахь нь:
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: # <==
...
Тоглуулах номыг ажиллуулах:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Сонголтод анхаарлаа хандуулаарай --limit
. Кластерын жишээ бүр нь Ansible-ийн нэр томъёогоор хост байдаг тул бид тоглуулах номыг ажиллуулахдаа аль тохиолдлуудыг тохируулахыг тодорхой зааж өгч болно.
Вэб UI руу буцах
Бид амжилтад хүрэхгүй, топологийн хяналтыг эзэмших болно.
Топологийн менежмент
Шинэ тохиолдлуудаа хуулбарласан багц болгон нэгтгэцгээе storage-2
. Шинэ бүлэг нэмнэ үү replicaset_storage_2
болон хувьсагчид нь хуулбарласан олонлогийн параметрүүдийг аналогиар тайлбарлана replicaset_storage_1
. хэсэгт hosts
Энэ бүлэгт ямар тохиолдлууд багтахыг зааж өгнө үү (өөрөөр хэлбэл манай хуулбарын багц):
---
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:
Тоглоомын номоо дахин эхлүүлье:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Сонголт бүрт --limit
Бид энэ удаад манай хуулбарт тохирох бүлгийн нэрийг дамжууллаа.
Сонголтыг анхаарч үзээрэй tags
.
Бидний үүрэг дараах шошгуудаар тэмдэглэгдсэн янз бүрийн ажлуудыг дараалан гүйцэтгэдэг.
cartridge-instances
: инстанцийн удирдлага (тохиргоо, гишүүнчлэлийн холболт);cartridge-replicasets
: топологийн удирдлага (хуулбарын удирдлага болон кластераас тохиолдлуудыг бүрмөсөн устгах (хөөх));cartridge-config
: кластерийн бусад параметрүүдийг удирдах (vshard ачаалах, автоматаар ачаалах горим, зөвшөөрлийн параметрүүд болон програмын тохиргоо).
Бид ажлынхаа аль хэсгийг хийхийг хүсч байгаагаа тодорхой зааж өгч болно, дараа нь үүрэг нь үлдсэн ажлуудыг алгасах болно. Манай тохиолдолд бид зөвхөн топологитой ажиллахыг хүсч байгаа тул бид зааж өгсөн cartridge-replicasets
.
Хичээл зүтгэлийнхээ үр дүнг дүгнэе. Шинэ хуулбарыг хайж байна
Баяртай!
Инстанцууд болон хуулбаруудыг дахин тохируулах талаар туршилт хийж, кластер топологи хэрхэн өөрчлөгдөж байгааг хараарай. Та янз бүрийн үйлдлийн хувилбаруудыг туршиж үзэж болно, жишээлбэл, memtx_memory
. Энэ үүрэг нь таны аппликешны сул зогсолтыг багасгахын тулд жишээг дахин эхлүүлэхгүйгээр үүнийг хийхийг оролдох болно.
Гүйхээ бүү мартаарай vagrant halt
VM-уудыг ашиглаж дууссаны дараа зогсоох.
Дээлний доор юу байна?
Туршилтын үеэр би дүрийн далд дор юу тохиолдсон талаар энд дэлгэрэнгүй ярих болно.
Cartridge програмыг алхам алхмаар байршуулахыг харцгаая.
Багцыг суулгаж, жишээг эхлүүлж байна
Эхлээд та багцаа серверт хүргэж, суулгах хэрэгтэй. Одоо үүрэг нь RPM болон DEB багцуудтай ажиллах боломжтой.
Дараа нь бид тохиолдлуудыг эхлүүлнэ. Энд бүх зүйл маш энгийн: тохиолдол бүр тусдаа байдаг systemd
-үйлчилгээ. Би жишээний тухай ярьж байна:
$ systemctl start myapp@storage-1
Энэ тушаал нь жишээг эхлүүлэх болно storage-1
апп-ууд myapp
. Эхэлсэн инстанс нь түүнийг хайх болно /etc/tarantool/conf.d/
. Жишээ логуудыг ашиглан харж болно journald
.
Нэгж файл /etc/systemd/system/[email protected]
системийн үйлчилгээний хувьд багцын хамт хүргэгдэнэ.
Ansible нь багц суулгах, системийн үйлчилгээг удирдахад зориулагдсан модулиудтай тул бид энд шинэ зүйл зохион бүтээгээгүй.
Кластерын топологийг тохируулах
Эндээс хамгийн сонирхолтой нь эхэлнэ. Зөвшөөрч байна, багцуудыг суулгах, ажиллуулах тусгай үүрэг хариуцлагын талаар санаа зовох нь хачирхалтай байх болно systemd
-үйлчилгээ.
Та кластерыг гараар тохируулж болно:
- Эхний сонголт: Web UI-г нээж, товчлуурууд дээр дарна уу. Хэд хэдэн тохиолдлыг нэг удаа эхлүүлэхэд энэ нь маш тохиромжтой.
- Хоёрдахь сонголт: та GraphQl API ашиглаж болно. Энд та аль хэдийн ямар нэг зүйлийг автоматжуулж болно, жишээлбэл, Python дээр скрипт бичиж болно.
- Гурав дахь сонголт (хүчирхэг хүмүүсийн хувьд): сервер рүү очиж, ашиглаж буй тохиолдлуудын аль нэгэнд холбогдоно уу
tarantoolctl connect
мөн Lua модулийн тусламжтайгаар шаардлагатай бүх залруулга хийхcartridge
.
Бидний шинэ бүтээлийн гол ажил бол үүнийг хийх явдал бөгөөд таны хувьд ажлын хамгийн хэцүү хэсэг юм.
Ansible нь танд өөрийн модулийг бичиж, дүрд ашиглах боломжийг олгодог. Бидний үүрэг эдгээр модулиудыг кластерын янз бүрийн бүрэлдэхүүн хэсгүүдийг удирдахад ашигладаг.
Хэрхэн ажилладаг? Та кластерын хүссэн төлөвийг тунхаглалын тохиргоонд дүрслэх ба үүрэг нь модуль бүрийг өөрийн тохиргооны хэсгийг оролт болгон өгдөг. Модуль нь кластерын одоогийн төлөвийг хүлээн авч, оролттой харьцуулдаг. Дараа нь жишээнүүдийн аль нэгнийх нь залгуураар кодыг ажиллуулж, кластерыг хүссэн төлөвт хүргэдэг.
Үр дүн
Өнөөдөр бид Tarantool Cartridge дээр програмаа хэрхэн байрлуулж, энгийн топологийг тохируулах талаар хэлж, үзүүлэв. Үүнийг хийхийн тулд бид ашиглахад хялбар хүчирхэг хэрэгсэл болох Ansible-г ашигласан бөгөөд олон дэд бүтцийн зангилаануудыг нэгэн зэрэг тохируулах боломжийг олгодог (манай тохиолдолд эдгээр нь кластерийн тохиолдол юм).
Дээр бид Ansible ашиглан кластерийн тохиргоог тайлбарлах олон арга замуудын нэгийг авч үзсэн. Та цааш явахад бэлэн гэдгээ мэдсэнийхээ дараа сур group_vars
и host_vars
.
Тун удахгүй бид танд топологиос инстанцуудыг хэрхэн бүрмөсөн устгах (хөөх), ачаалах vshard, автомат ажиллагаагүй горимыг удирдах, зөвшөөрлийг тохируулах, кластерийн тохиргоог нөхөх талаар танд хэлэх болно. Энэ хооронд та өөрөө суралцах боломжтой
Хэрэв ямар нэг зүйл ажиллахгүй байвал итгэлтэй байгаарай
Эх сурвалж: www.habr.com