ãã§ã«è©±ããŸãã
é¢çœãïŒ ããããç§ã¯ã«ããã®äžã§å°ããŸããç§ãã¡ã¯ãã¹ãŠã話ããŠèŠããŸãã
äŸããå§ããŸããã
ç§ãã¡ã®åœ¹å²ã®æ©èœã®äžéšã®ã¿ã説æããŸãã ãã¹ãŠã®æ©èœãšå
¥åãã©ã¡ãŒã¿ã®å®å
šãªèª¬æã¯ã次ã®å Žæã§ãã€ã§ãèŠã€ããããšãã§ããŸãã
ã¿ã©ã³ããŒã« ã«ãŒããªããžã«ã¯ã api
О storage
ã€ã³ã¹ã¿ã³ã¹ã«å²ãåœãŠãããšãã§ããŸãã
ã«ãŒããªããžèªäœã¯ããã»ã¹ã®éå§æ¹æ³ã«ã€ããŠã¯äœã説æããããã§ã«å®è¡äžã®ã€ã³ã¹ã¿ã³ã¹ãæ§æããæ©èœã®ã¿ãæäŸããŸãã æ®ãã®äœæ¥ã¯ãŠãŒã¶ãŒãèªåã§è¡ãå¿ èŠããããŸããæ§æãã¡ã€ã«ãå解ãããµãŒãã¹ãéå§ããããããžãã»ããã¢ããããŸãã ãã ããããããã¹ãŠãç§ãã¡ãè¡ãã®ã§ã¯ãªããAnsible ã代ããã«è¡ããŸãã
èšèããè¡åãž
ããã§ãã¢ããªã±ãŒã·ã§ã³ã XNUMX å°ã®ä»®æ³ãã·ã³ã«ãããã€ããåçŽãªããããžãã»ããã¢ããããŸãããã
- ã¬ããªã«ã»ãã
app-1
圹å²ãæãããŸãapi
ããã«ã¯åœ¹å²ãå«ãŸããŸãvshard-router
ã ããã«ã¯ã€ã³ã¹ã¿ã³ã¹ã XNUMX ã€ã ããããŸãã - ã¬ããªã«ã»ãã
storage-1
圹å²ãå®è£ ããŸãstorage
(ãããŠåæã«vshard-storage
)ãããã§ã¯ç°ãªããã·ã³ãã XNUMX ã€ã®ã€ã³ã¹ã¿ã³ã¹ãè¿œå ããŸãã
äŸãå®è¡ããã«ã¯ã次ã®ãã®ãå¿
èŠã§ã
圹ãã®ãã®ã¯ã
äŸã䜿çšããŠãªããžããªã®ã¯ããŒã³ãäœæããŸãã
$ 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 ããŒã«ãã€ã³ã¹ããŒã«ããŸãã
$ ansible-galaxy install tarantool.cartridge,1.0.1
ã€ã³ã¹ããŒã«ããã圹å²ãå®è¡ããŸãã
$ ansible-playbook -i hosts.yml playbook.yml
ãã¬ã€ããã¯ã®å®è¡ãçµäºããã®ãåŸ
ã£ãŠããŸãã
ããŒã¿ãæµã蟌ãããšãã§ããŸãã ã¯ãŒã«ã§ãããïŒ
ããã§ããããæäœããåæã«å¥ã®ã¬ããªã« ã»ãããããããžã«è¿œå ããæ¹æ³ãèããŠã¿ãŸãããã
ç§ãã¡ã¯ç解ãå§ããŸã
ã©ãããã®ïŒ
XNUMX ã€ã® VM ãèµ·åããã¯ã©ã¹ã¿ãŒãã»ããã¢ãããã Ansible ãã¬ã€ããã¯ãå®è¡ããŸããã ãã¡ã€ã«ã®äžèº«ãèŠãŠã¿ãŸããã 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-role ãšåŒã°ããããŒã«ãéå§ããŸãã 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
XNUMX ã€ã®ä»®æ³ãã·ã³ã®å Žåã ãããŠã»ã¯ã·ã§ã³ã§ã¯ 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
ã ããã« XNUMX ã€ã®ã€ã³ã¹ã¿ã³ã¹ãè¿œå ããŸãããã storage-2-replica
æåã®ä»®æ³ãã·ã³äžãš storage-2
XNUMX çªç®:
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 ã®çšèªã§ã¯ãã¹ãã§ããããããã¬ã€ããã¯ã®å®è¡æã«ã©ã®ã€ã³ã¹ã¿ã³ã¹ãæ§æããå¿
èŠãããããæ瀺çã«æå®ã§ããŸãã
ãŠã§ã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 ã®äœ¿çšãå®äºããããVM ãåæ¢ããŸãã
ãã³ãããã®äžã«ã¯äœãããã®ã§ããããïŒ
ããã§ã¯ãå®éšäžã« Ansible ããŒã«ã®å éšã§äœãèµ·ãã£ããã«ã€ããŠè©³ãã説æããŸãã
ã«ãŒããªããž ã¢ããªã±ãŒã·ã§ã³ã®å±éã段éçã«èŠãŠã¿ãŸãããã
ããã±ãŒãžã®ã€ã³ã¹ããŒã«ãšã€ã³ã¹ã¿ã³ã¹ã®èµ·å
ãŸããããã±ãŒãžããµãŒããŒã«é ä¿¡ããŠã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã ããã§ããã®ããŒã«ã¯ RPM ããã³ DEB ããã±ãŒãžã§åäœã§ããããã«ãªããŸããã
次ã«ãã€ã³ã¹ã¿ã³ã¹ãèµ·åããŸãã ããã§ã¯ãã¹ãŠãéåžžã«åçŽã§ããåã€ã³ã¹ã¿ã³ã¹ã¯åå¥ã§ãã systemd
-ãµãŒãã¹ã ç§ã¯äŸã«ã€ããŠè©±ããŠããŸãã
$ systemctl start myapp@storage-1
ãã®ã³ãã³ãã¯ã€ã³ã¹ã¿ã³ã¹ãèµ·åããŸã storage-1
ã¢ããªã±ãŒã·ã§ã³ myapp
ã èµ·åãããã€ã³ã¹ã¿ã³ã¹ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãæ¢ããŸãã /etc/tarantool/conf.d/
ã ã€ã³ã¹ã¿ã³ã¹ã®ãã°ã¯æ¬¡ã䜿çšããŠè¡šç€ºã§ããŸãã journald
.
ãŠããããã¡ã€ã« /etc/systemd/system/[email protected]
systemd ãµãŒãã¹ã¯ããã±ãŒãžãšãšãã«æäŸãããŸãã
Ansible ã«ã¯ããã±ãŒãžã®ã€ã³ã¹ããŒã«ãš systemd ãµãŒãã¹ã®ç®¡çã®ããã®ã¢ãžã¥ãŒã«ãçµã¿èŸŒãŸããŠããŸãããããã§ã¯äœãæ°ãããã®ãçºæããŠããŸããã
ã¯ã©ã¹ã¿ãŒããããžãŒã®æ§æ
ãããŠããããæãèå³æ·±ãããšãå§ãŸããŸãã åæããŸããããã±ãŒãžãã€ã³ã¹ããŒã«ããŠå®è¡ããããã«ç¹å¥ãª Ansible ããŒã«ããããã䜿çšããã®ã¯å¥åŠã§ãã systemd
-ãµãŒãã¹ã
ã¯ã©ã¹ã¿ãŒã¯æåã§ã»ããã¢ããã§ããŸãã
- æåã®ãªãã·ã§ã³: Web UI ãéããŠãã¿ã³ãã¯ãªãã¯ããŸãã è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã XNUMX åã ãèµ·åããå Žåã«ã¯ãããã¯éåžžã«é©ããŠããŸãã
- XNUMX çªç®ã®ãªãã·ã§ã³: GraphQl API ã䜿çšã§ããŸãã ããã§ã¯ãããšãã° Python ã§ã¹ã¯ãªãããäœæãããªã©ããã§ã«äœããèªååã§ããŸãã
- XNUMX çªç®ã®ãªãã·ã§ã³ (粟ç¥çã«åŒ·ã人åã): ãµãŒããŒã«ç§»åãã次ã䜿çšããŠã€ã³ã¹ã¿ã³ã¹ã® XNUMX ã€ã«æ¥ç¶ããŸãã
tarantoolctl connect
ãããŠãLua ã¢ãžã¥ãŒã«ã䜿çšããŠå¿ èŠãªæäœããã¹ãŠå®è¡ããŸãcartridge
.
ç§ãã¡ã®çºæã®äž»ãªã¿ã¹ã¯ã¯ãããè¡ãããšã§ãããäœæ¥ã®äžã§æãé£ããéšåã§ãã
Ansible ã䜿çšãããšãç¬èªã®ã¢ãžã¥ãŒã«ãäœæãããããããŒã«ã§äœ¿çšã§ããŸãã ç§ãã¡ã®åœ¹å²ã¯ããããã®ã¢ãžã¥ãŒã«ã䜿çšããŠã¯ã©ã¹ã¿ãŒã®ããŸããŸãªã³ã³ããŒãã³ãã管çããŸãã
䜿ãæ¹ïŒ 宣èšåæ§æã§ã¯ã©ã¹ã¿ãŒã®æãŸããç¶æ ãèšè¿°ããããŒã«ã«ãã£ãŠåã¢ãžã¥ãŒã«ã®æ§æã»ã¯ã·ã§ã³ãå ¥åãšããŠæäŸãããŸãã ã¢ãžã¥ãŒã«ã¯ã¯ã©ã¹ã¿ãŒã®çŸåšã®ç¶æ ãåãåãããããå ¥åãšæ¯èŒããŸãã 次ã«ãããããã®ã€ã³ã¹ã¿ã³ã¹ã®ãœã±ãããéããŠã³ãŒããå®è¡ãããã¯ã©ã¹ã¿ãŒãç®çã®ç¶æ ã«ãªããŸãã
çµæ
ä»æ¥ã¯ãTarantool ã«ãŒããªããžã«ã¢ããªã±ãŒã·ã§ã³ããããã€ããåçŽãªããããžãã»ããã¢ããããæ¹æ³ã説æãã瀺ããŸããã ãããè¡ãããã«ãAnsible ã䜿çšããŸãããAnsible ã¯ã䜿ãããããå€ãã®ã€ã³ãã©ã¹ãã©ã¯ã㣠ããŒã (ãã®å Žåã¯ã¯ã©ã¹ã¿ãŒ ã€ã³ã¹ã¿ã³ã¹) ãåæã«æ§æã§ãã匷åãªããŒã«ã§ãã
äžèšã§ã¯ãAnsible ã䜿çšããŠã¯ã©ã¹ã¿ãŒæ§æãèšè¿°ããå€ãã®æ¹æ³ã®ãã¡ã® XNUMX ã€ãåãäžããŸããã 次ã«é²ãæºåãã§ãããšããã£ãããåŠç¿ããŠãã ãã group_vars
О host_vars
.
ããããžããã€ã³ã¹ã¿ã³ã¹ãæ°žä¹
ã«åé€ (è¿œæŸ) ããæ¹æ³ãvshard ãããŒãã¹ãã©ããããæ¹æ³ãèªåãã§ã€ã«ãªãŒã㌠ã¢ãŒãã管çããæ¹æ³ãèªå¯ãæ§æããæ¹æ³ãããã³ã¯ã©ã¹ã¿ãŒæ§æã«ããããé©çšããæ¹æ³ãéããªã説æããŸãã ãã®éã¯èªåã§å匷ããããšãã§ããŸã
äœããããŸããããªãå Žåã¯ãå¿
ã
åºæïŒ habr.com