Биз буга чейин сүйлөшкөнбүз
Кызыктуубу? Анда сураныч, кесип астында, биз сага баарын айтып жана көрсөтөбүз.
Келгиле, бир мисал менен баштайлы
Биз ролубуздун функционалдуулугунун бир бөлүгүн гана карайбыз. Сиз ар дайым анын бардык мүмкүнчүлүктөрүн жана киргизүү параметрлерин толук сүрөттөлүшүн таба аласыз
Tarantool картридж бар api
и storage
, инстанцияларга дайындалышы мүмкүн.
Картридждин өзү процесстерди кантип ишке киргизүү керектиги жөнүндө эч нерсе айтпайт, ал иштеп жаткан инстанцияларды конфигурациялоо мүмкүнчүлүгүн гана берет. Калганын колдонуучу өзү аткарышы керек: конфигурация файлдарын уюштуруу, кызматтарды баштоо жана топологияны конфигурациялоо. Бирок биз мунун баарын кылбайбыз; Ansible биз үчүн жасайт.
иш-аракет кылууга сөздөрдөн
Ошентип, келгиле, биздин тиркемени эки виртуалдык машинага жайгаштырып, жөнөкөй топологияны орнотолу:
- Replicaset
app-1
ролун ишке ашыратapi
ролун камтыйтvshard-router
. Бул жерде бир гана мисал болот. - Replicaset
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 картриджинин маанилүү ролун орнотуу:
$ 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
Бул жерде эч кандай кызыктуу эч нерсе болбойт, келгиле деген анссиль ролду ишке киргизели 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 менен айтканда, ар бир инстанция хост (аппараттык сервер менен чаташтырбоо керек), б.а. 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 ойнотуу китебин ишке киргизиңиз:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Опцияга көңүл буруңуз --limit
. Ар бир кластер инстанциясы Ansible терминдеринде хост болгондуктан, биз ойнотуу китебин аткарууда кайсы инстанцияларды конфигурациялоо керектигин ачык көрсөтө алабыз.
Веб интерфейсине кайтуу
Муну менен эле токтоп калбай, топологияны башкарууну өздөштүрүп алалы.
Топологияны башкаруу
Келгиле, жаңы инстанцияларыбызды реплика топтомуна бириктирели 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
алар менен иштеп бүткөндөн кийин виртуалдык машиналарды токтотуу үчүн.
Капоттун астында эмне бар?
Бул жерде мен биздин эксперименттер учурунда ansible ролу капоттун астында эмне болгондугу жөнүндө көбүрөөк айтып берем.
Картридж тиркемесин этап-этабы менен жайылтууну карап көрөлү.
Пакетти орнотуу жана инстанцияларды баштоо
Алгач пакетти серверге жеткирип, орнотуу керек. Учурда рол RPM жана DEB пакеттери менен иштей алат.
Андан кийин биз инстанцияларды ишке киргизебиз. Бул жерде баары абдан жөнөкөй: ар бир инстанция өзүнчө systemd
-кызмат. Мен сизге бир мисал келтирейин:
$ systemctl start myapp@storage-1
Бул буйрук инстанцияны ишке киргизет storage-1
колдонмолор myapp
. Ишке киргизилген инстанция аны издейт /etc/tarantool/conf.d/
. Instance журналдарын колдонуу менен көрүүгө болот journald
.
Бирдик файлы /etc/systemd/system/[email protected]
системасы үчүн кызматы пакет менен бирге жеткирилет.
Ansible пакеттерди орнотуу жана системалык кызматтарды башкаруу үчүн орнотулган модулдары бар; биз бул жерде жаңы эч нерсе ойлоп тапкан жокпуз.
Кластердин топологиясын орнотуу
Бул кызыктуу жерде башталат. Макулмун, пакеттерди орнотуу жана иштетүү үчүн атайын Ansible ролу менен убара болуу кызык болот systemd
-сервистер.
Сиз кластерди кол менен конфигурациялай аласыз:
- Биринчи параметр: Web UI ачып, баскычтарды чыкылдатыңыз. Бул бир нече учурларды бир жолку баштоо үчүн абдан ылайыктуу.
- Экинчи параметр: сиз GraphQl API колдоно аласыз. Бул жерде сиз бир нерсени автоматташтыра аласыз, мисалы, Python тилинде скрипт жаза аласыз.
- Үчүнчү вариант (эрктүүлөр үчүн): серверге өтүңүз, инстанциялардын бирине кошулуңуз
tarantoolctl connect
жана Lua модулу менен бардык керектүү манипуляцияларды аткарыңызcartridge
.
Биздин ойлоп табуунун негизги милдети дал ушул ишти аткаруу, сиз үчүн иштин эң татаал бөлүгү.
Ansible өз модулуңузду жазууга жана аны ролдо колдонууга мүмкүндүк берет. Биздин ролубуз ар кандай кластердин компоненттерин башкаруу үчүн ушундай модулдарды колдонот.
Бул кандай иштейт? Сиз декларативдик конфигурацияда кластердин каалаган абалын сүрөттөп бересиз жана рол ар бир модулду киргизүү катары өзүнүн конфигурация бөлүмү менен камсыз кылат. Модуль кластердин учурдагы абалын алат жана аны киргизүү катары кабыл алынган менен салыштырат. Андан кийин инстанциялардын биринин розеткасынан код ишке киргизилет, ал кластерди керектүү абалга алып келет.
натыйжалары
Бүгүн биз Tarantool картриджине тиркемеңизди кантип жайгаштырууну жана жөнөкөй топологияны орнотууну айттык жана көрсөттүк. Бул үчүн биз Ansible колдондук - колдонууга оңой жана бир эле учурда көптөгөн инфраструктура түйүндөрүн конфигурациялоого мүмкүндүк берүүчү күчтүү курал (биздин учурда кластердик инстанциялар).
Жогоруда биз Ansible аркылуу кластер конфигурациясын сүрөттөөнүн көптөгөн жолдорунун бирин карап чыктык. Уланууга даяр сезилгенден кийин, изилдеңиз group_vars
и host_vars
.
Жакында биз сизге топологиядан инстанцияларды кантип биротоло жок кылууну (чыгаруу), bootstrap vshard, автоматтык түрдө жаңылыштык режимин башкаруу, авторизацияны конфигурациялоо жана кластердин конфигурациясын оңдоону айтып беребиз. Ал ортодо өз алдынча окууга болот
Эгер бир нерсе иштебесе, сөзсүз түрдө аткарыңыз
Source: www.habr.com