Biz artıq danışmışıq
Maraqlıdır? Sonra kəsimin altında soruşuram, hər şeyi söyləyəcəyik və göstərəcəyik.
Bir nümunə ilə başlayaq
Biz rolumuzun funksionallığının yalnız bir hissəsini əhatə edəcəyik. Siz həmişə onun bütün xüsusiyyətlərinin və giriş parametrlərinin tam təsvirini tapa bilərsiniz
Tarantool kartrici var api
и storage
instansiyalara təyin edilə bilər.
Kartricin özü proseslərə necə başlamaq barədə heç nə demir, o, yalnız artıq işləyən nümunələri konfiqurasiya etmək imkanı verir. Qalanını istifadəçi özü etməlidir: konfiqurasiya fayllarını parçalamaq, xidmətləri işə salmaq və topologiyanı qurmaq. Amma bütün bunları biz etməyəcəyik, Ansible bizim yerimizə edəcək.
Sözlərdən əmələ
Beləliklə, tətbiqimizi iki virtual maşına yerləşdirək və sadə bir topologiya quraq:
- Replikaset
app-1
rolunu oynayacaqapi
rolu daxildirvshard-router
. Burada yalnız bir nümunə olacaq. - replikaset
storage-1
rolunu həyata keçirirstorage
(və eyni zamandavshard-storage
), burada müxtəlif maşınlardan iki nümunə əlavə edirik.
Məsələni işə salmaq üçün bizə lazımdır
Rol özüdür
Anbarı bir nümunə ilə klonlayın:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Virtual maşınları qaldırırıq:
$ vagrant up
Tarantool Cartridge əsas rolunu quraşdırın:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Quraşdırılmış rolu işə salın:
$ ansible-playbook -i hosts.yml playbook.yml
Oyun kitabının icrasının sonunu gözləyirik, gedin
Siz data tökə bilərsiniz. Əla, hə?
İndi bununla necə işləmək lazım olduğunu anlayaq və eyni zamanda topologiyaya başqa bir replika dəsti əlavə edək.
anlamağa başlayırıq
Bəs nə baş verdi?
Biz iki VM-ni işə saldıq və klasterimizi quran ansible playbook-u işə saldıq. Faylın məzmununa baxaq 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
Burada maraqlı heç nə baş vermir, biz adlanan ansible-rolu başlayırıq tarantool.cartridge
.
Bütün ən vacibləri (yəni klaster konfiqurasiyası) yerləşir 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:
Bizə lazım olan tək şey bu faylın məzmununu dəyişdirərək nümunələri və replikasetləri idarə etməyi öyrənməkdir. Sonra ona yeni bölmələr əlavə edəcəyik. Onları hara əlavə edəcəyinizi çaşdırmamaq üçün bu faylın son versiyasına baxa bilərsiniz, hosts.updated.yml
, bu nümunə depodadır.
Nümunələrin idarə edilməsi
Ansible baxımından, hər bir nümunə bir hostdur (dəmir server ilə qarışdırılmamalıdır), yəni. Ansible-in idarə edəcəyi infrastruktur qovşağı. Hər bir host üçün biz əlaqə parametrlərini təyin edə bilərik (məsələn ansible_host
и ansible_user
), həmçinin nümunə konfiqurasiyası. Nümunələrin təsviri bölmədədir hosts
.
Nümunə konfiqurasiyasını nəzərdən keçirin storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
Dəyişəndə config
nümunə parametrlərini təyin etdik - advertise URI
и HTTP port
.
Aşağıda nümunə parametrləri verilmişdir app-1
и storage-1-replica
.
Ansible-a hər bir nümunə üçün əlaqə parametrlərini söyləməliyik. Nümunələri virtual maşın qruplarına qruplaşdırmaq məntiqli görünür. Bunun üçün nümunələr qruplara birləşdirilir. host1
и host2
, və bölmədəki hər qrupda vars
dəyərlər ansible_host
и ansible_user
bir virtual maşın üçün. Və bölmədə hosts
- bu qrupa daxil olan hostlar (onlar nümunələrdir):
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:
Dəyişməyə başlayırıq hosts.yml
. Daha iki misal əlavə edək, storage-2-replica
ilk virtual maşında və storage-2
İkincidə:
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: # <==
...
Anlamlı oyun kitabını işə salın:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Seçimə diqqət yetirin --limit
. Hər bir klaster nümunəsi Ansible şərtlərində host olduğundan, kitabçanı işlədərkən hansı nümunələrin konfiqurasiya edilməli olduğunu açıq şəkildə təyin edə bilərik.
Veb UI səhifəsinə qayıt
Biz uğurlarımızla kifayətlənməyəcəyik və topologiyaya nəzarəti mənimsəyəcəyik.
Topologiyanın idarə edilməsi
Gəlin yeni nümunələrimizi replikasetdə birləşdirək storage-2
. Yeni qrup əlavə edin replicaset_storage_2
və onun dəyişənlərində replikasetin parametrlərini analoqu ilə təsvir edin replicaset_storage_1
. Bölmədə hosts
hansı nümunələrin bu qrupa daxil ediləcəyini müəyyən edin (yəni replika dəstimiz):
---
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:
Oyun kitabına yenidən başlayaq:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Parametrə görə --limit
biz bu dəfə replikasetimizə uyğun gələn qrupun adını keçdik.
Seçimi nəzərdən keçirin tags
.
Rolumuz ardıcıl olaraq aşağıdakı teqlərlə qeyd olunan müxtəlif tapşırıqları yerinə yetirir:
cartridge-instances
: instansiyanın idarə edilməsi (konfiqurasiya, üzvlüklə əlaqə);cartridge-replicasets
: topologiyanın idarə edilməsi (replikatsetin idarə edilməsi və nümunələrin klasterdən daimi çıxarılması (çıxarılması));cartridge-config
: digər klaster parametrlərini idarə edin (vshard bootstrapping, avtomatik yüklənmə rejimi, avtorizasiya parametrləri və proqram konfiqurasiyası).
İşin hansı hissəsini görmək istədiyimizi açıq şəkildə göstərə bilərik, sonra rol qalan tapşırıqları atlayacaqdır. Bizim vəziyyətimizdə biz yalnız topologiya ilə işləmək istəyirik, ona görə də müəyyən etdik cartridge-replicasets
.
Gəlin səylərimizin nəticəsini qiymətləndirək. Yeni replikaset tapılır
Yaşasın!
Nümunələrin və replikasetlərin yenidən konfiqurasiyası ilə sınaq keçirin və klaster topologiyasının necə dəyişdiyinə baxın. Siz müxtəlif əməliyyat ssenarilərini sınaya bilərsiniz, məsələn, memtx_memory
. Rol tətbiqinizin mümkün dayanma müddətini azaltmaq üçün nümunəni yenidən başlatmadan bunu etməyə çalışacaq.
Qaçmağı unutmayın vagrant halt
onlarla işiniz bitdikdə VM-ləri dayandırmaq üçün.
Başlıq altında nə var?
Burada eksperimentlərimiz zamanı ansible rolunun başlığı altında baş verənlər haqqında daha çox danışacağam.
Gəlin addım-addım Kartric tətbiqinin yerləşdirilməsinə nəzər salaq.
Paketin quraşdırılması və nümunələrin işə salınması
Əvvəlcə paketi serverə çatdırmalı və quraşdırmalısınız. İndi rol RPM və DEB paketləri ilə işləyə bilər.
Sonra, nümunələri işə salırıq. Burada hər şey çox sadədir: hər bir nümunə ayrıdır systemd
-xidmət. Mən bir misaldan danışıram:
$ systemctl start myapp@storage-1
Bu əmr nümunəni işə salacaq storage-1
apps myapp
. Başladılan nümunə onu axtaracaq /etc/tarantool/conf.d/
. Nümunə qeydləri istifadə edərək baxıla bilər journald
.
Vahid faylı /etc/systemd/system/[email protected]
sistemli xidmət üçün paketlə birlikdə çatdırılacaq.
Ansible paketləri quraşdırmaq və sistem xidmətlərini idarə etmək üçün daxili modullara malikdir, biz burada yeni heç nə icad etməmişik.
Klaster topologiyasının konfiqurasiyası
Və burada ən maraqlısı başlayır. Razılaşın, paketləri quraşdırmaq və işə salmaq üçün xüsusi bir rolla narahat olmaq qəribə olardı systemd
-xidmetler.
Siz klasteri əl ilə qura bilərsiniz:
- Birinci seçim: Veb UI-ni açın və düymələri basın. Bir neçə nümunənin birdəfəlik başlanğıcı üçün olduqca uyğundur.
- İkinci seçim: GraphQl API-dən istifadə edə bilərsiniz. Burada artıq bir şeyi avtomatlaşdıra bilərsiniz, məsələn, Python-da skript yaza bilərsiniz.
- Üçüncü seçim (ruh baxımından güclülər üçün): serverə gedin, istifadə edərək nümunələrdən birinə qoşulun
tarantoolctl connect
və Lua modulu ilə bütün lazımi manipulyasiyaları yerinə yetirincartridge
.
İxtiramızın əsas vəzifəsi bunu etməkdir, işin sizin üçün ən çətin hissəsidir.
Ansible sizə öz modulunuzu yazmağa və ondan bir rolda istifadə etməyə imkan verir. Bizim rolumuz klasterin müxtəlif komponentlərini idarə etmək üçün bu modullardan istifadə edir.
Bu necə işləyir? Siz deklarativ konfiqurasiyada klasterin istədiyiniz vəziyyətini təsvir edirsiniz və rol hər modula giriş kimi konfiqurasiya bölməsini verir. Modul klasterin cari vəziyyətini alır və onu girişlə müqayisə edir. Bundan sonra, nümunələrdən birinin yuvasından bir kod işlədilir, bu da klasteri istədiyiniz vəziyyətə gətirir.
Nəticələri
Bu gün biz Tarantool Cartridge-də tətbiqinizi necə yerləşdirməyi və sadə bir topologiya qurmağı izah etdik və göstərdik. Bunun üçün biz istifadəsi asan və eyni zamanda bir çox infrastruktur qovşaqlarını konfiqurasiya etməyə imkan verən güclü alət olan Ansible-dan istifadə etdik (bizim vəziyyətimizdə bunlar klaster nümunələridir).
Yuxarıda, biz Ansible istifadə edərək klaster konfiqurasiyasını təsvir etməyin bir çox yollarından birini nəzərdən keçirdik. Davam etməyə hazır olduğunuzu bildikdən sonra öyrənin group_vars
и host_vars
.
Tezliklə biz sizə nümunələri topologiyadan həmişəlik olaraq necə silmək (qovmaq), vshard yükləmək, avtomatik yüklənmə rejimini idarə etmək, avtorizasiyanı konfiqurasiya etmək və klaster konfiqurasiyasını yamaq barədə məlumat verəcəyik. Bu arada siz təkbaşına təhsil ala bilərsiniz
Bir şey işləmirsə, əmin olun
Mənbə: www.habr.com