Tayari tumezungumza
Inavutia? Kisha tafadhali, chini ya kukata, tutakuambia na kukuonyesha kila kitu.
Hebu tuanze na mfano
Tutaangalia tu sehemu ya utendaji wa jukumu letu. Unaweza kupata maelezo kamili ya uwezo wake wote na vigezo vya kuingiza ndani
Tarantool Cartridge ina api
ΠΈ storage
, ambayo inaweza kupewa matukio.
Cartridge yenyewe haisemi chochote kuhusu jinsi ya kuzindua michakato, inatoa tu uwezo wa kusanidi matukio tayari yanayoendesha. Mtumiaji lazima afanye mapumziko mwenyewe: kupanga faili za usanidi, anza huduma na usanidi topolojia. Lakini hatutafanya haya yote; Ansible atatufanyia.
Kutoka kwa maneno hadi kwa vitendo
Kwa hivyo, hebu tupeleke maombi yetu kwa mashine mbili pepe na tuweke topolojia rahisi:
- Kuiga
app-1
itatekeleza jukumu hiloapi
, ambayo inajumuisha jukumuvshard-router
. Kutakuwa na mfano mmoja tu hapa. - Kuiga
storage-1
kutekeleza jukumustorage
(na wakati huo huovshard-storage
), hapa tutaongeza matukio mawili kutoka kwa mashine tofauti.
Kuendesha mfano tunaohitaji
Jukumu lenyewe liko ndani
Wacha tutengeneze hazina na mfano:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Tunainua mashine za kawaida:
$ vagrant up
Sakinisha jukumu linalofaa la Cartridge ya Tarantool:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Anzisha jukumu lililowekwa:
$ ansible-playbook -i hosts.yml playbook.yml
Tunasubiri kitabu cha kucheza kukamilisha utekelezaji, nenda kwa
Unaweza kupakia data. Baridi, sawa?
Sasa hebu tujue jinsi ya kufanya kazi na hili, na wakati huo huo kuongeza replica nyingine iliyowekwa kwenye topolojia.
Wacha tuanze kuigundua
Basi nini kilitokea?
Tulianzisha mashine mbili pepe na kuzindua kitabu cha kucheza kinachofaa ambacho kilisanidi kundi letu. Wacha tuangalie yaliyomo kwenye faili 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
Hakuna kitu cha kufurahisha kinachotokea hapa, wacha tuzindue jukumu linaloitwa tarantool.cartridge
.
Vitu vyote muhimu zaidi (yaani, usanidi wa nguzo) ziko ndani 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:
Tunachohitaji ni kujifunza jinsi ya kudhibiti matukio na nakala kwa kubadilisha maudhui ya faili hii. Ifuatayo tutaongeza sehemu mpya kwake. Ili usichanganyikiwe wapi kuziongeza, unaweza kuangalia toleo la mwisho la faili hii, hosts.updated.yml
, ambayo iko kwenye hazina ya mfano.
Usimamizi wa Matukio
Kwa maneno yasiyofaa, kila mfano ni mwenyeji (sio kuchanganyikiwa na seva ya vifaa), i.e. nodi ya miundombinu ambayo Ansible itasimamia. Kwa kila mwenyeji tunaweza kutaja vigezo vya uunganisho (kama vile ansible_host
ΠΈ ansible_user
), pamoja na usanidi wa mfano. Maelezo ya matukio ni katika sehemu hosts
.
Wacha tuangalie usanidi wa mfano storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
Katika kutofautiana config
tulitaja vigezo vya mfano - advertise URI
ΠΈ HTTP port
.
Chini ni vigezo vya mfano app-1
ΠΈ storage-1-replica
.
Tunahitaji kuwaambia Ansible vigezo vya uunganisho kwa kila mfano. Inaonekana ni sawa kuweka matukio katika vikundi vya mashine pepe. Kwa kusudi hili, matukio yanajumuishwa katika vikundi host1
ΠΈ host2
, na katika kila kikundi katika sehemu hiyo vars
maadili yanaonyeshwa ansible_host
ΠΈ ansible_user
kwa mashine moja ya mtandaoni. Na katika sehemu hosts
- wapangishi (aka matukio) ambao wamejumuishwa katika kikundi hiki:
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:
Tunaanza kubadilika hosts.yml
. Wacha tuongeze mifano miwili zaidi, storage-2-replica
kwenye mashine ya kwanza ya mtandaoni na storage-2
Kwa pili:
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: # <==
...
Zindua kitabu cha kucheza kinachofaa:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Tafadhali kumbuka chaguo --limit
. Kwa kuwa kila mfano wa kundi ni seva pangishi katika masharti Yanayofaa, tunaweza kubainisha kwa uwazi ni matukio gani yanapaswa kusanidiwa wakati wa kutekeleza kitabu cha kucheza.
Kurudi kwenye UI ya Wavuti
Tusiishie hapo na master topology management.
Usimamizi wa Topolojia
Hebu tuunganishe matukio yetu mapya katika seti ya replica storage-2
. Hebu tuongeze kikundi kipya replicaset_storage_2
na ueleze vigezo vya kunakili katika vigeu vyake kwa mlinganisho na replicaset_storage_1
. Katika sehemu hosts
Hebu tuonyeshe ni matukio gani yatajumuishwa katika kikundi hiki (yaani, seti yetu ya nakala):
---
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:
Wacha tuanze kitabu cha kucheza tena:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Katika parameter --limit
Wakati huu tulipitisha jina la kikundi ambalo linalingana na nakala yetu.
Hebu fikiria chaguo tags
.
Jukumu letu kwa mpangilio hufanya kazi mbalimbali, ambazo zimewekwa alama zifuatazo:
cartridge-instances
: usimamizi wa mfano (usanidi, uunganisho kwa uanachama);cartridge-replicasets
: usimamizi wa topolojia (usimamizi wa nakala na uondoaji wa kudumu (kufukuza) wa matukio kutoka kwa nguzo);cartridge-config
: usimamizi wa vigezo vingine vya nguzo (vshard bootstrapping, mode moja kwa moja ya kushindwa, vigezo vya idhini na usanidi wa programu).
Tunaweza kubainisha kwa uwazi ni sehemu gani ya kazi tunayotaka kufanya, kisha jukumu litaruka majukumu mengine. Kwa upande wetu, tunataka kufanya kazi tu na topolojia, kwa hivyo tulibainisha cartridge-replicasets
.
Hebu tutathmini matokeo ya juhudi zetu. Tunapata nakala mpya ikiwa imewashwa
Hooray!
Jaribu kubadilisha usanidi wa matukio na seti za nakala na uone jinsi topolojia ya nguzo inavyobadilika. Unaweza kujaribu hali tofauti za uendeshaji, k.m. memtx_memory
. Jukumu litajaribu kufanya hivi bila kuanzisha tena mfano ili kupunguza muda wa chini wa programu yako.
Usisahau kukimbia vagrant halt
kusimamisha mashine pepe unapomaliza kufanya kazi nazo.
Na nini chini ya kofia?
Hapa nitakuambia zaidi juu ya kile kilichokuwa kikifanyika chini ya kifuniko cha jukumu linalofaa wakati wa majaribio yetu.
Wacha tuangalie kupeleka programu ya Cartridge hatua kwa hatua.
Kufunga kifurushi na matukio ya kuanzia
Kwanza unahitaji kutoa kifurushi kwa seva na kuiweka. Hivi sasa jukumu linaweza kufanya kazi na vifurushi vya RPM na DEB.
Ifuatayo, tunazindua mifano. Kila kitu ni rahisi sana hapa: kila mfano ni tofauti systemd
-huduma. Nitakupa mfano:
$ systemctl start myapp@storage-1
Amri hii itazindua mfano storage-1
programu myapp
. Mfano uliozinduliwa utatafuta yake /etc/tarantool/conf.d/
. Kumbukumbu za matukio zinaweza kutazamwa kwa kutumia journald
.
Faili ya kitengo /etc/systemd/system/[email protected]
kwa huduma ya mfumo itatolewa pamoja na kifurushi.
Ansible ina moduli zilizojengewa ndani za kusakinisha vifurushi na kudhibiti huduma za mfumo; hatujavumbua chochote kipya hapa.
Kuanzisha topolojia ya nguzo
Hapa ndipo furaha huanza. Kukubaliana, itakuwa ya kushangaza kujisumbua na jukumu maalum la Ansible la kusakinisha vifurushi na kukimbia systemd
-huduma.
Unaweza kusanidi nguzo kwa mikono:
- Chaguo la kwanza: fungua UI ya Wavuti na ubofye vifungo. Inafaa kabisa kwa mwanzo wa wakati mmoja wa matukio kadhaa.
- Chaguo la pili: unaweza kutumia GraphQl API. Hapa unaweza tayari kubinafsisha kitu, kwa mfano, andika hati katika Python.
- Chaguo la tatu (kwa wenye nia kali): nenda kwa seva, unganisha kwenye mojawapo ya matukio kwa kutumia
tarantoolctl connect
na fanya hila zote muhimu na moduli ya Luacartridge
.
Kazi kuu ya uvumbuzi wetu ni kufanya hasa hii, sehemu ngumu zaidi ya kazi kwako.
Ansible hukuruhusu kuandika moduli yako mwenyewe na kuitumia kama jukumu. Jukumu letu hutumia moduli kama hizi kudhibiti vipengee mbalimbali vya nguzo.
Inavyofanya kazi? Unaelezea hali inayohitajika ya nguzo katika usanidi wa kutangaza, na jukumu hutoa kila moduli na sehemu yake ya usanidi kama ingizo. Moduli hupokea hali ya sasa ya nguzo na kuilinganisha na kile kilichopokelewa kama ingizo. Ifuatayo, msimbo unazinduliwa kupitia tundu la mojawapo ya matukio, ambayo huleta nguzo kwa hali inayotakiwa.
Matokeo ya
Leo tuliambia na kuonyesha jinsi ya kupeleka maombi yako kwa Tarantool Cartridge na kuweka topolojia rahisi. Ili kufanya hivyo, tulitumia Ansible - chombo chenye nguvu ambacho ni rahisi kutumia na hukuruhusu kusanidi nodi nyingi za miundombinu (kwa upande wetu, matukio ya nguzo).
Hapo juu tuliangalia mojawapo ya njia nyingi za kuelezea usanidi wa nguzo kwa kutumia Ansible. Mara tu unapohisi kuwa uko tayari kuendelea, chunguza group_vars
ΠΈ host_vars
.
Hivi karibuni tutakuambia jinsi ya kufuta kabisa (kufukuza) matukio kutoka kwa topolojia, bootstrap vshard, kudhibiti hali ya kushindwa kiotomatiki, kusanidi idhini na kuweka kiraka usanidi wa nguzo. Wakati huo huo, unaweza kusoma peke yako
Ikiwa kitu haifanyi kazi, hakikisha
Chanzo: mapenzi.com