{"id":53611,"date":"2019-12-06T00:00:00","date_gmt":"2019-12-05T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1"},"modified":"2020-02-18T14:01:32","modified_gmt":"2020-02-18T11:01:32","slug":"legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","title":{"rendered":"Implementarea aplica\u021biilor pe Tarantool Cartridge \u00eentr-un mod simplu \u0219i natural (partea 1)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Implementarea aplica\u021biilor pe Tarantool Cartridge \u00eentr-un mod simplu \u0219i natural (partea 1)\" src=\"\/wp-content\/uploads\/2019\/12\/0493b6c8d60253352bc971b216e9b63e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am vorbit deja despre <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/465503\/\">Tarantool Cartridge<\/a><\/noindex>, care permite dezvoltarea aplica\u021biilor distribuite \u0219i ambalarea acestora. R\u0103m\u00e2ne doar s\u0103 \u00eenv\u0103\u021b\u0103m s\u0103 desf\u0103\u0219ur\u0103m aceste aplica\u021bii \u0219i s\u0103 le gestion\u0103m. Nu v\u0103 face\u021bi griji, am prev\u0103zut totul! Am adunat cele mai bune practici pentru lucrul cu Tarantool Cartridge \u0219i am scris <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/tarantool\/cartridge\">rolul ansible<\/a><\/noindex>, care va desf\u0103\u0219ura pachetul pe servere, va porni instan\u021bele, le va aduna \u00eentr-un cluster, va configura autorizarea, va efectua bootstrap-ul vshard, va activa failover-ul automat \u0219i va aplica patch-uri pe configura\u021bia clusterului.<\/p>\n<p><\/p>\n<p>Interesant? Atunci v\u0103 invit\u0103m s\u0103 citi\u021bi mai departe, totul v\u0103 vom explica \u0219i ar\u0103ta.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"nachnem-s-primera\">Haide\u021bi s\u0103 \u00eencepem cu un exemplu<\/h1>\n<p><\/p>\n<p>Vom examina doar o parte din func\u021bionalitatea rolului nostru. O descriere complet\u0103 a tuturor capacit\u0103\u021bilor \u0219i parametrilor de intrare o pute\u021bi g\u0103si \u00eentotdeauna \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">documentation<\/a><\/noindex>. Dar este mai bine s\u0103 \u00eencerci o dat\u0103 dec\u00e2t s\u0103 vezi de o sut\u0103 de ori, a\u0219a c\u0103 s\u0103 desf\u0103\u0219ur\u0103m o mic\u0103 aplica\u021bie.<\/p>\n<p><\/p>\n<p>Tarantool Cartridge are <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/cartridge-cli\/tree\/master\/examples\/getting-started-app#application-example-based-on-tarantool-cartridge\">tutorial<\/a><\/noindex> crea\u021bia unei mici aplica\u021bii Cartridge, care stocheaz\u0103 informa\u021bii despre clien\u021bii b\u0103ncii \u0219i conturile lor, precum \u0219i ofer\u0103 un API pentru gestionarea datelor prin HTTP. Pentru aceasta, aplica\u021bia descrie dou\u0103 roluri posibile: <code>api<\/code> \u0219i <code>storage<\/code>, care pot fi atribuite instan\u021belor.<\/p>\n<p><\/p>\n<p>Cartridge-ul \u00een sine nu ofer\u0103 informa\u021bii despre cum s\u0103 se porneasc\u0103 procesele, ci doar posibilitatea de configurare a instan\u021belor deja pornite. Restul trebuie s\u0103 fie realizat de utilizator: distribuirea fi\u0219ierelor de configurare, pornirea serviciilor \u0219i configurarea topologiei. Dar nu ne vom ocupa de toate acestea, Ansible va face acest lucru pentru noi.<\/p>\n<p><\/p>\n<h3 id=\"ot-slov-k-delu\">De la vorbe la fapte<\/h3>\n<p><\/p>\n<p>A\u0219adar, s\u0103 desf\u0103\u0219ur\u0103m aplica\u021bia noastr\u0103 pe dou\u0103 ma\u0219ini virtuale \u0219i s\u0103 configur\u0103m o topologie simpl\u0103:<\/p>\n<p><\/p>\n<ul>\n<li>Replica set <code>app-1<\/code> va implementa rolul <code>api<\/code>, care include rolul <code>vshard-router<\/code>. Aici va exista doar o instan\u021b\u0103.<\/li>\n<li>Replica set <code>storage-1<\/code> implementeaz\u0103 rolul <code>storage<\/code> (\u0219i simultan <code>vshard-storage<\/code>), vom ad\u0103uga dou\u0103 instan\u021be de pe ma\u0219ini diferite.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Implementarea aplica\u021biilor pe Tarantool Cartridge \u00eentr-un mod simplu \u0219i natural (partea 1)\" src=\"\/wp-content\/uploads\/2019\/12\/62d20050e2d7a6358002ecd758222f1f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pentru a lansa exemplul avem nevoie de <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vagrantup.com\/\">Vagrant<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ansible.com\">Ansible<\/a><\/noindex> (versiunea 2.8 sau mai veche).<\/p>\n<p><\/p>\n<p>Rolul se afl\u0103 \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/docs\/\">Ansible Galaxy<\/a><\/noindex>. Acesta este un depozit care permite partajarea realiz\u0103rilor proprii \u0219i utilizarea rolurilor gata existente.<\/p>\n<p><\/p>\n<p>Vom clona repository-ul cu exemplul:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ git clone https:\/\/github.com\/dokshina\/deploy-tarantool-cartridge-app.git\n$ cd deploy-tarantool-cartridge-app &amp;&amp; git checkout 1.0.0<\/code><\/pre>\n<p><\/p>\n<p>Pornim ma\u0219inile virtuale:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ vagrant up<\/code><\/pre>\n<p><\/p>\n<p>Instal\u0103m rolul ansible Tarantool Cartridge:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-galaxy install tarantool.cartridge,1.0.1<\/code><\/pre>\n<p><\/p>\n<p>Rul\u0103m rolul instalat:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-playbook -i hosts.yml playbook.yml<\/code><\/pre>\n<p><\/p>\n<p>A\u0219tept\u0103m finalizarea execu\u021biei playbook-ului, trecem la <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> \u0219i ne bucur\u0103m de rezultat:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Implementarea aplica\u021biilor pe Tarantool Cartridge \u00eentr-un mod simplu \u0219i natural (partea 1)\" src=\"\/wp-content\/uploads\/2019\/12\/6563ddf2f2bfc85714f327c8d6b2d1c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Este posibil s\u0103 \u00eenc\u0103rc\u0103m date. Grozav, nu-i a\u0219a?<\/p>\n<p><\/p>\n<p>Acum s\u0103 vedem cum func\u021bioneaz\u0103 \u0219i s\u0103 ad\u0103ug\u0103m un alt replicaset \u00een topologie.<\/p>\n<p><\/p>\n<h3 id=\"nachinaem-razbiratsya\">\u00cencepem s\u0103 investig\u0103m<\/h3>\n<p><\/p>\n<p>Deci, ce s-a \u00eent\u00e2mplat?<\/p>\n<p><\/p>\n<p>Am ridicat dou\u0103 ma\u0219ini virtuale \u0219i am rulat un playbook ansible care a configurat clusterul nostru. S\u0103 arunc\u0103m o privire asupra con\u021binutului fi\u0219ierului <code>playbook.yml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n- name: Deploy my Tarantool Cartridge app\n  hosts: all\n  become: true\n  become_user: root\n  tasks:\n  - name: Import Tarantool Cartridge role\n    import_role:\n      name: tarantool.cartridge<\/code><\/pre>\n<p><\/p>\n<p>Aici nu se \u00eent\u00e2mpl\u0103 nimic interesant, rul\u0103m rolul ansible care se nume\u0219te <code>tarantool.cartridge<\/code>.<\/p>\n<p><\/p>\n<p>Toate detaliile importante (adic\u0103, configura\u021bia clusterului) se afl\u0103 \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/intro_inventory.html\">inventory<\/a><\/noindex>-fi\u0219ierul <code>hosts.yml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\nall:\n  vars:\n    # common cluster variables\n    cartridge_app_name: getting-started-app\n    cartridge_package_path: .\/getting-started-app-1.0.0-0.rpm  # path to package\n\n    cartridge_cluster_cookie: app-default-cookie  # cluster cookie\n\n    # common ssh options\n    ansible_ssh_private_key_file: ~\/.vagrant.d\/insecure_private_key\n    ansible_ssh_common_args: '-o IdentitiesOnly=yes -o UserKnownHostsFile=\/dev\/null -o StrictHostKeyChecking=no'\n\n  # INSTANCES\n  hosts:\n    storage-1:\n      config:\n        advertise_uri: '172.19.0.2:3301'\n        http_port: 8181\n\n    app-1:\n      config:\n        advertise_uri: '172.19.0.3:3301'\n        http_port: 8182\n\n    storage-1-replica:\n      config:\n        advertise_uri: '172.19.0.3:3302'\n        http_port: 8183\n\n  children:\n    # GROUP INSTANCES BY MACHINES\n    host1:\n      vars:\n        # first machine connection options\n        ansible_host: 172.19.0.2\n        ansible_user: vagrant\n\n      hosts:  # instances to be started on the first machine\n        storage-1:\n\n    host2:\n      vars:\n        # second machine connection options\n        ansible_host: 172.19.0.3\n        ansible_user: vagrant\n\n      hosts:  # instances to be started on the second machine\n        app-1:\n        storage-1-replica:\n\n    # GROUP INSTANCES BY REPLICA SETS\n    replicaset_app_1:\n      vars:  # replica set configuration\n        replicaset_alias: app-1\n        failover_priority:\n          - app-1  # leader\n        roles:\n          - 'api'\n\n      hosts:  # replica set instances\n        app-1:\n\n    replicaset_storage_1:\n      vars:  # replica set configuration\n        replicaset_alias: storage-1\n        weight: 3\n        failover_priority:\n          - storage-1  # leader\n          - storage-1-replica\n        roles:\n          - 'storage'\n\n      hosts:   # replica set instances\n        storage-1:\n        storage-1-replica:<\/code><\/pre>\n<p><\/p>\n<p>Tot ce ne trebuie este s\u0103 \u00eenv\u0103\u021b\u0103m s\u0103 gestion\u0103m instan\u021bele \u0219i replicaset-urile, modific\u00e2nd con\u021binutul acestui fi\u0219ier. Mai departe, vom ad\u0103uga noi sec\u021biuni \u00een el. Pentru a nu ne \u00eencurca, putem verifica versiunea final\u0103 a acestui fi\u0219ier, <code>hosts.updated.yml<\/code>, care se afl\u0103 \u00een depozitul cu exemplul.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-instansami\">Gestionarea instan\u021belor<\/h3>\n<p><\/p>\n<p>\u00cen termenii Ansible, fiecare instan\u021b\u0103 este un gazd\u0103 (nu trebuie confundat cu un server fizic), adic\u0103 un nod al infrastructurii pe care Ansible o va gestiona. Pentru fiecare gazd\u0103, putem specifica parametrii de conectare (cum ar fi <code>ansible_host<\/code> \u0219i <code>ansible_user<\/code>), precum \u0219i configura\u021bia instan\u021bei. Descrierea instan\u021belor se afl\u0103 \u00een sec\u021biunea <code>gazde<\/code>.<\/p>\n<p><\/p>\n<p>S\u0103 examin\u0103m configura\u021bia instan\u021bei <code>storage-1<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n\n  # INSTAN\u021aE\n  hosts:\n    storage-1:\n      config:\n        advertise_uri: '172.19.0.2:3301'\n        http_port: 8181\n\n  ...<\/code><\/pre>\n<p><\/p>\n<p>\u00cen variabila <code>config<\/code> am specificat parametrii instan\u021bei \u2014 <code>advertise URI<\/code> \u0219i <code>HTTP port<\/code>.<br \/>\nMai jos se afl\u0103 parametrii instan\u021belor <code>app-1<\/code> \u0219i <code>storage-1-replica<\/code>.<\/p>\n<p><\/p>\n<p>Trebuie s\u0103 inform\u0103m Ansible despre parametrii de conectare pentru fiecare instan\u021b\u0103. Pare logic s\u0103 grup\u0103m instan\u021bele \u00een func\u021bie de ma\u0219inile virtuale. Pentru aceasta, instan\u021bele sunt grupate \u00een <code>host1<\/code> \u0219i <code>host2<\/code>, iar \u00een fiecare grup \u00een sec\u021biunea <code>vars<\/code> sunt specificate valorile <code>ansible_host<\/code> \u0219i <code>ansible_user<\/code> pentru o singur\u0103 ma\u0219in\u0103 virtual\u0103. Iar \u00een sec\u021biunea <code>gazde<\/code> \u2014 gazdelor (care sunt instan\u021bele), care fac parte din acest grup:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n  hosts:\n    ...\n  children:\n    # GRUPAREA INSTAN\u021aELOR DUP\u0102 MA\u0218INI\n    host1:\n      vars:\n        # op\u021biuni de conectare pentru prima ma\u0219in\u0103\n        ansible_host: 172.19.0.2\n        ansible_user: vagrant\n       hosts:  # instan\u021bele care vor fi pornite pe prima ma\u0219in\u0103\n        storage-1:\n\n     host2:\n      vars:\n        # op\u021biuni de conectare pentru a doua ma\u0219in\u0103\n        ansible_host: 172.19.0.3\n        ansible_user: vagrant\n       hosts:  # instan\u021bele care vor fi pornite pe a doua ma\u0219in\u0103\n        app-1:\n        storage-1-replica:<\/code><\/pre>\n<p><\/p>\n<p>\u00cencepem s\u0103 modific\u0103m <code>hosts.yml<\/code>. Vom ad\u0103uga \u00eenc\u0103 dou\u0103 instan\u021be, <code>storage-2-replica<\/code> pe prima ma\u0219in\u0103 virtual\u0103 \u0219i <code>storage-2<\/code> pe a doua:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n\n  # INSTAN\u021aE\n  hosts:\n    ...\n    storage-2:  # &lt;==\n      config:\n        advertise_uri: '172.19.0.3:3303'\n        http_port: 8184\n\n    storage-2-replica:  # &lt;==\n      config:\n        advertise_uri: '172.19.0.2:3302'\n        http_port: 8185\n\n  children:\n    # GRUPAREA INSTAN\u021aELOR DUP\u0102 MA\u0218INI\n    host1:\n      vars:\n        ...\n      hosts:  # instan\u021bele care vor fi pornite pe prima ma\u0219in\u0103\n        storage-1:\n        storage-2-replica:  # &lt;==\n\n    host2:\n      vars:\n        ...\n      hosts:  # instan\u021bele care vor fi pornite pe a doua ma\u0219in\u0103\n        app-1:\n        storage-1-replica:\n        storage-2:  # &lt;==\n  ...<\/code><\/pre>\n<p><\/p>\n<p>Execut\u0103m ansible-playbook:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-playbook -i hosts.yml \n                   --limit storage-2,storage-2-replica \n                   playbook.yml<\/code><\/pre>\n<p><\/p>\n<p>Aten\u021bie la op\u021biunea <code>--limit<\/code>. Deoarece fiecare instan\u021b\u0103 din cluster este o gazd\u0103 \u00een termenii Ansible, putem specifica \u00een mod explicit care instan\u021be trebuie configurate atunci c\u00e2nd rul\u0103m playbook-ul.<\/p>\n<p><\/p>\n<p>Ne \u00eentoarcem la Web UI <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> \u0219i observ\u0103m noile noastre instan\u021be:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Implementarea aplica\u021biilor pe Tarantool Cartridge \u00eentr-un mod simplu \u0219i natural (partea 1)\" src=\"\/wp-content\/uploads\/2019\/12\/6181c359e4e5ec4adaee8737600a27e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nu ne vom opri aici \u0219i vom \u00eenv\u0103\u021ba s\u0103 gestion\u0103m topologia.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-topologiey\">Gestionarea topologiei<\/h3>\n<p><\/p>\n<p>S\u0103 unim noile noastre instan\u021be \u00eentr-un replicaset <code>storage-2<\/code>. Vom ad\u0103uga un nou grup <code>replicaset_storage_2<\/code> \u0219i vom descrie \u00een variabilele sale parametrii replicaset-ului \u00een mod similar cu <code>replicaset_storage_1<\/code>. \u00cen sec\u021biunea <code>gazde<\/code> s\u0103 indic\u0103m ce instan\u021be vor face parte din acest grup (adic\u0103 replica noastr\u0103):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\nall:\n  vars:\n    ...\n  hosts:\n    ...\n  children:\n    ...\n    # GRUPEAZ\u0102 INSTAN\u021aELE DUP\u0102 REPLICASETS\n    ...\n    replicaset_storage_2:  # &lt;==\n      vars:  # configura\u021bia replicaset-ului\n        replicaset_alias: storage-2\n        weight: 2\n        failover_priority:\n          - storage-2\n          - storage-2-replica\n        roles:\n          - 'storage'\n\n      hosts:   # instan\u021bele replicaset-ului\n        storage-2:\n        storage-2-replica:<\/code><\/pre>\n<p><\/p>\n<p>Relu\u0103m playbook-ul:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-playbook -i hosts.yml \n                   --limit replicaset_storage_2 \n                   --tags cartridge-replicasets \n                   playbook.yml<\/code><\/pre>\n<p><\/p>\n<p>\u00cen parametru <code>--limit<\/code> am transmis de data aceasta numele grupului care corespunde replicaset-ului nostru.<\/p>\n<p><\/p>\n<p>S\u0103 examin\u0103m op\u021biunea <code>tags<\/code>.<\/p>\n<p><\/p>\n<p>Rolul nostru execut\u0103 \u00een mod consecutiv diverse sarcini, marcate cu urm\u0103toarele tag-uri:<\/p>\n<p><\/p>\n<ul>\n<li><code>cartridge-instances<\/code>: gestionarea instan\u021belor (configurare, conectare la membership);<\/li>\n<li><code>cartridge-replicasets<\/code>: gestionarea topologiei (gestionarea replicaset-urilor \u0219i \u0219tergerea irevocabil\u0103 (expel) a instan\u021belor din cluster);<\/li>\n<li><code>cartridge-config<\/code>: gestionarea celorlalte parametrii ai cluster-ului (vshard bootstrapping, mod automatic de failover, parametrii de autorizare \u0219i configura\u021bia aplica\u021biei).<\/li>\n<\/ul>\n<p><\/p>\n<p>Putem specifica \u00een mod explicit ce parte a muncii dorim s\u0103 facem, atunci rolul va s\u0103ri peste executarea celorlalte sarcini. \u00cen cazul nostru, dorim s\u0103 lucr\u0103m doar cu topologia, a\u0219a c\u0103 am specificat <code>cartridge-replicasets<\/code>.<\/p>\n<p><\/p>\n<p>S\u0103 evalu\u0103m rezultatul eforturilor noastre. G\u0103sim noul replicaset pe <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Implementarea aplica\u021biilor pe Tarantool Cartridge \u00eentr-un mod simplu \u0219i natural (partea 1)\" src=\"\/wp-content\/uploads\/2019\/12\/20da99480df519b1ee239cd81f67b786.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ura!<\/p>\n<p><\/p>\n<p>Experimenta\u021bi cu modificarea configura\u021biei instan\u021belor \u0219i replicaset-urilor \u0219i observa\u021bi cum se schimb\u0103 topologia cluster-ului. Pute\u021bi testa diferite scenarii de exploatare, de exemplu, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_delegation.html#rolling-update-batch-size\">rolling update<\/a><\/noindex> sau cre\u0219terea <code>memtx_memory<\/code>. Rolul va \u00eencerca s\u0103 fac\u0103 acest lucru f\u0103r\u0103 a reporni instan\u021ba, pentru a reduce downtime-ul posibil al aplica\u021biei dumneavoastr\u0103.<\/p>\n<p><\/p>\n<p>Nu uita\u021bi s\u0103 rula\u021bi <code>vagrant halt<\/code>, pentru a opri ma\u0219inile virtuale, c\u00e2nd a\u021bi terminat de lucrat cu ele.<\/p>\n<p><\/p>\n<h1 id=\"a-chto-pod-kapotom\">\u0218i ce se afl\u0103 sub capot\u0103?<\/h1>\n<p><\/p>\n<p>Aici voi explica mai \u00een detaliu ce s-a \u00eent\u00e2mplat sub capota rolului ansible \u00een timpul experimentelor noastre.<\/p>\n<p><\/p>\n<p>S\u0103 analiz\u0103m pas cu pas implementarea aplica\u021biei Cartridge.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-paketa-i-start-instansov\">Instalarea pachetului \u0219i pornirea instan\u021belor<\/h3>\n<p><\/p>\n<p>Mai \u00eent\u00e2i trebuie s\u0103 livr\u0103m pachetul pe server \u0219i s\u0103-l instal\u0103m. Acum rolul poate lucra cu pachete RPM \u0219i DEB.<\/p>\n<p><\/p>\n<p>Apoi, pornim instan\u021bele. Aici totul este foarte simplu: fiecare instan\u021b\u0103 este un serviciu separat. V\u0103 explic prin exemplu: <code>systemd<\/code>$ systemctl start myapp@storage-1<\/p>\n<p><\/p>\n<pre><code class=\"bash\">Aceast\u0103 comand\u0103 va porni instan\u021ba<\/code><\/pre>\n<p><\/p>\n<p>aplica\u021biei <code>storage-1<\/code> myapp <code>. Instan\u021ba pornit\u0103 va c\u0103uta configurarea sa<\/code>. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tarantool.io\/ru\/doc\/2.2\/book\/cartridge\/cartridge_dev\/#configuring-instances\">configura\u021bie<\/a><\/noindex> \u00een <code>\/etc\/tarantool\/conf.d\/<\/code>. Jurnalele instan\u021bei pot fi vizualizate folosind <code>journald<\/code>.<\/p>\n<p><\/p>\n<p>Fi\u0219ierul unit\u0103\u021bii <code>\/etc\/systemd\/system\/myapp@.sevice<\/code> pentru serviciul systemd va fi livrat \u00eempreun\u0103 cu pachetul.<\/p>\n<p><\/p>\n<p>Ansible are module \u00eencorporate pentru instalarea pachetelor \u0219i gestionarea serviciilor systemd, aici nu am inventat nimic nou.<\/p>\n<p><\/p>\n<h3 id=\"nastroyka-topologii-klastera\">Configurarea topologiei clusterei<\/h3>\n<p><\/p>\n<p>Aici \u00eencepe partea cea mai interesant\u0103. S\u0103 fim de acord, ar fi ciudat s\u0103 ne complic\u0103m cu un rol ansible special pentru instalarea pachetelor \u0219i pornirea <code>systemd<\/code>-serviciilor.<\/p>\n<p><\/p>\n<p>Clusterul poate fi configurat manual:<\/p>\n<p><\/p>\n<ul>\n<li>Prima op\u021biune: deschidem interfa\u021ba Web \u0219i ap\u0103s\u0103m pe butoane. Pentru un start unic al mai multor instan\u021be, este destul de decent.<\/li>\n<li>A doua op\u021biune: putem folosi GraphQl API. Aici deja putem automatiza ceva, de exemplu, s\u0103 scriem un script \u00een Python.<\/li>\n<li>A treia op\u021biune (pentru cei puternici): ne conect\u0103m la server, ne conect\u0103m la una dintre instan\u021be folosind <code>tarantoolctl connect<\/code> \u0219i efectu\u0103m toate manevrele necesare cu modulul Lua <code>cartridge<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Principala noastr\u0103 sarcin\u0103 este s\u0103 facem pentru voi exact aceast\u0103 parte, cea mai complicat\u0103 a muncii.<\/p>\n<p><\/p>\n<p>Ansible permite scrierea propriului modul \u0219i utilizarea acestuia \u00een rol. Rolul nostru folose\u0219te astfel de module pentru a gestiona diferitele componente ale clusterei.<\/p>\n<p><\/p>\n<p>Cum func\u021bioneaz\u0103? Descrie\u021bi starea dorit\u0103 a clusterei \u00eentr-o configura\u021bie declarativ\u0103, iar rolul trimite fiec\u0103rui modul sec\u021biunea sa de configurare. Modulul prime\u0219te starea curent\u0103 a clusterei \u0219i o compar\u0103 cu ceea ce a fost furnizat. Apoi, prin socketul uneia dintre instan\u021be, se lanseaz\u0103 codul care ajusteaz\u0103 clusterul la starea dorit\u0103.<\/p>\n<p><\/p>\n<h1 id=\"itogi\">Concluzii<\/h1>\n<p><\/p>\n<p>Ast\u0103zi am prezentat \u0219i am demonstrat cum s\u0103 desf\u0103\u0219ura\u021bi aplica\u021bia dvs. pe Tarantool Cartridge \u0219i s\u0103 configura\u021bi o topologie simpl\u0103. Pentru asta am folosit Ansible - un instrument puternic, care se distinge prin u\u0219urin\u021ba \u00een utilizare \u0219i permite configurarea simultan\u0103 a multor noduri ale infrastructurii (\u00een cazul nostru, instan\u021bele clusterei).<\/p>\n<p><\/p>\n<p>Mai sus am analizat una dintre numeroasele modalit\u0103\u021bi de a descrie configura\u021bia clusterei folosind Ansible. Odat\u0103 ce \u00een\u021belege\u021bi c\u0103 sunte\u021bi preg\u0103ti\u021bi s\u0103 merge\u021bi mai departe, explora\u021bi <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_best_practices.html\">cele mai bune practici<\/a><\/noindex> pentru scrierea playbook-urilor. Poate c\u0103 v\u0103 va fi mai convenabil s\u0103 gestiona\u021bi topologia folosind <code>group_vars<\/code> \u0219i <code>host_vars<\/code>.<\/p>\n<p><\/p>\n<p>\u00cen cur\u00e2nd, v\u0103 vom ar\u0103ta cum s\u0103 elimina\u021bi definitiv instan\u021bele din topologie, s\u0103 bootstrapa\u021bi vshard, s\u0103 gestiona\u021bi modul de failover automat, s\u0103 configura\u021bi autorizarea \u0219i s\u0103 aplica\u021bi patch-uri la configura\u021bia clusterului. P\u00e2n\u0103 atunci, pute\u021bi s\u0103 studia\u021bi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">documenta\u021bie<\/a><\/noindex> \u0219i s\u0103 experimenta\u021bi cu modificarea parametrilor clusterului.<\/p>\n<p><\/p>\n<p>Dac\u0103 ceva nu func\u021bioneaz\u0103, v\u0103 rug\u0103m s\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge\/issues\/new\">ne anun\u021ba\u021bi<\/a><\/noindex> despre problem\u0103. Vom rezolva rapid totul!<\/p>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/478710\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043f\u0440\u043e Tarantool Cartridge, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0438\u0445. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e: \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438. \u041d\u0435 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0439\u0442\u0435\u0441\u044c, \u043c\u044b \u0432\u0441\u0451 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438! \u041c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0432\u0441\u0435 best practices \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 Tarantool Cartridge \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 ansible-\u0440\u043e\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442 \u043f\u0430\u043a\u0435\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u044b, \u0441\u0442\u0430\u0440\u0442\u0430\u043d\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442 \u0438\u0445 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-53611","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u044b \u0443\u0436\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041b\u0435\u0433\u043a\u043e \u0438 \u043d\u0435\u043f\u0440\u0438\u043d\u0443\u0436\u0434\u0435\u043d\u043d\u043e \u0434\u0435\u043f\u043b\u043e\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Tarantool Cartridge (\u0447\u0430\u0441\u0442\u044c 1) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0443\u0436\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-05T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:01:32+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Deplas\u0103m aplica\u021biile pe Tarantool Cartridge cu u\u0219urin\u021b\u0103 \u0219i natural (partea 1) | ProHoster","description":"Am terminat.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041b\u0435\u0433\u043a\u043e \u0438 \u043d\u0435\u043f\u0440\u0438\u043d\u0443\u0436\u0434\u0435\u043d\u043d\u043e \u0434\u0435\u043f\u043b\u043e\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Tarantool Cartridge (\u0447\u0430\u0441\u0442\u044c 1) | ProHoster","og:description":"\u041c\u044b \u0443\u0436\u0435.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-12-05T21:00:00+00:00","article:modified_time":"2020-02-18T11:01:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"53611","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 08:06:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:22:49","updated":"2026-01-24 08:06:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/53611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=53611"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/53611\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=53611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=53611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=53611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}