Мо аллакай дар бораи он сухан ронда будем
Ҷолиб? Пас, лутфан, дар зери буриш, мо ба шумо мегӯям ва ҳама чизро ба шумо нишон медиҳем.
Биёед бо як мисол оғоз кунем
Мо танҳо як қисми функсияи нақши худро дида мебароем. Шумо ҳамеша метавонед тавсифи пурраи тамоми қобилиятҳо ва параметрҳои вуруди онро дар
Картриджи Tarantool дорад api
и storage
, ки ба инстансияҳо таъин кардан мумкин аст.
Худи картридж дар бораи чӣ гуна оғоз кардани равандҳо чизе намегӯяд, он танҳо қобилияти танзим кардани мисолҳои аллакай иҷрошавандаро фароҳам меорад. Истифодабаранда бояд боқимондаро худаш анҷом диҳад: файлҳои конфигуратсияро тартиб диҳад, хидматҳоро оғоз кунад ва топологияро танзим кунад. Аммо мо ин ҳамаро иҷро намекунем; 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
Нақши имконпазири Cartridge Tarantool-ро насб кунед:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Нақши насбшударо оғоз кунед:
$ ansible-playbook -i hosts.yml playbook.yml
Мо интизорем, ки китоби бозӣ ба анҷом расад, ба
Шумо метавонед маълумотро бор кунед. Хуб, дуруст?
Акнун биёед бифаҳмем, ки чӣ тавр бо ин кор кардан лозим аст ва ҳамзамон ба топология як нусхаи дигарро илова кунед.
Биёед ба муайян кардани он шурӯъ кунем
Пас, чӣ шуд?
Мо ду мошини маҷозӣ насб кардем ва як китоби ҷолиберо оғоз кардем, ки кластери моро танзим мекунад. Биёед ба мундариҷаи файл назар андозем 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
, ки дар анбори мисол мавҷуд аст.
Идоракунии мисол
Дар истилоҳҳои Ansible, ҳар як мисол ҳост аст (бо сервери сахтафзор омехта нашавад), яъне. гиреҳи инфрасохторӣ, ки 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 мизбон аст, мо метавонем ба таври возеҳ муайян кунем, ки ҳангоми иҷрои китоби бозӣ кадом инстансияҳо бояд танзим карда шаванд.
Бозгашт ба Web 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 bootstrapping, ҳолати нокомии худкор, параметрҳои авторизатсия ва конфигуратсияи барнома).
Мо метавонем ба таври возеҳ муайян кунем, ки кадом қисми кореро, ки мо иҷро кардан мехоҳем, пас нақш аз боқимондаи вазифаҳо мегузарад. Дар ҳолати мо, мо мехоҳем танҳо бо топология кор кунем, бинобар ин мо муайян кардем cartridge-replicasets
.
Биёед, ба натицаи саъю кушиши худ бахо дихем. Мо як нусхаи навро дар он пайдо мекунем
Hooray!
Бо тағир додани конфигуратсияи мисолҳо ва маҷмӯаҳои реплика таҷриба кунед ва бубинед, ки топологияи кластер чӣ гуна тағир меёбад. Шумо метавонед сенарияҳои гуногуни амалиётиро санҷед, масалан. memtx_memory
. Нақш кӯшиш мекунад, ки ин корро бидуни аз нав оғоз кардани мисол иҷро кунад, то вақти бекории эҳтимолии барномаи шуморо кам кунад.
Давиданро фаромӯш накунед vagrant halt
барои қатъ кардани мошинҳои виртуалӣ вақте ки шумо бо онҳо кор мекунед.
Ва дар зери сарпӯш чӣ аст?
Дар ин ҷо ман ба шумо бештар дар бораи он чизе, ки дар зери сарпӯши нақши муҳим ҳангоми таҷрибаҳои мо рӯй дод, нақл мекунам.
Биёед ба зина ба зина ҷойгир кардани замимаи Картриджро бубинем.
Насб кардани баста ва оғози мисолҳо
Аввал шумо бояд бастаро ба сервер интиқол диҳед ва онро насб кунед. Дар айни замон нақш метавонад бо бастаҳои RPM ва DEB кор кунад.
Минбаъд мо мисолҳоро оғоз мекунем. Дар ин ҷо ҳама чиз хеле оддӣ аст: ҳар як мисол алоҳида аст systemd
-хизматрасонӣ. Ман ба шумо мисол меорам:
$ systemctl start myapp@storage-1
Ин фармон мисолро оғоз мекунад storage-1
Барномаҳои myapp
. Намунаи оғозшуда онро ҷустуҷӯ мекунад /etc/tarantool/conf.d/
. Бо истифода аз сабтҳои мисол метавон дидан мумкин аст journald
.
Файли воҳиди /etc/systemd/system/[email protected]
барои хидмати systemd дар якҷоягӣ бо баста расонида мешавад.
Ansible дорои модулҳои дарунсохт барои насб кардани бастаҳо ва идоракунии хидматҳои системавӣ мебошад; мо дар ин ҷо ягон чизи навро ихтироъ накардаем.
Ташкили топологияи кластер
Дар ин ҷо фароғат оғоз мешавад. Розӣ шавед, ташвишовар бо нақши махсуси Ansible барои насб кардани бастаҳо ва кор кардан аҷиб мебуд systemd
-хизматҳо.
Шумо метавонед кластерро дастӣ танзим кунед:
- Варианти аввал: Web UI-ро кушоед ва тугмаҳоро клик кунед. Он барои оғози якдафъаинаи якчанд маврид хеле мувофиқ аст.
- Варианти дуюм: шумо метавонед API-и GraphQl -ро истифода баред. Дар ин ҷо шумо аллакай метавонед чизеро автоматӣ кунед, масалан, дар Python скрипт нависед.
- Варианти сеюм (барои иродаи қавӣ): ба сервер равед, ба яке аз инстансияҳо пайваст шавед
tarantoolctl connect
ва бо модули Lua ҳама амалҳои заруриро иҷро кунедcartridge
.
Вазифаи асосии ихтироъкории мо махз хамин аст, ки барои шумо душвортарин кисми кор.
Ansible ба шумо имкон медиҳад, ки модули худро нависед ва онро дар нақш истифода баред. Нақши мо чунин модулҳоро барои идоракунии ҷузъҳои гуногуни кластер истифода мебарад.
Он чӣ гуна кор мекунад? Шумо ҳолати дилхоҳи кластерро дар конфигуратсияи декларативӣ тавсиф мекунед ва нақш ҳар як модулро бо бахши конфигуратсияи худ ҳамчун вуруд таъмин мекунад. Модул ҳолати кунунии кластерро қабул мекунад ва онро бо он чизе, ки ҳамчун вуруд гирифта шудааст, муқоиса мекунад. Баъдан, код тавассути розеткаи яке аз инстансияҳо оғоз карда мешавад, ки кластерро ба ҳолати дилхоҳ меорад.
Натиҷаҳо
Имрӯз мо гуфтем ва нишон додем, ки чӣ гуна барномаи худро дар Cartridge Tarantool ҷойгир кардан ва топологияи оддиро насб кардан лозим аст. Барои ин, мо Ansible - як абзори пурқувватеро истифода бурдем, ки истифодааш осон аст ва ба шумо имкон медиҳад ҳамзамон бисёр гиреҳҳои инфрасохторро танзим кунед (дар ҳолати мо, мисолҳои кластер).
Дар боло мо яке аз роҳҳои зиёди тавсифи конфигуратсияи кластерро бо истифода аз Ansible дида баромадем. Вақте ки шумо худро барои ҳаракат кардан омода ҳис мекунед, кашф кунед group_vars
и host_vars
.
Ба зудӣ мо ба шумо мегӯям, ки чӣ гуна инстанҳоро аз топология ба таври доимӣ нест кардан (хориҷ кардан), bootstrap vshard, идора кардани режими интиқоли худкор, танзим кардани авторизатсия ва часпонидани конфигуратсияи кластер. Дар айни замон, шумо метавонед мустақилона таҳсил кунед
Агар чизе кор накунад, боварӣ ҳосил кунед
Манбаъ: will.com