{"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\/pl\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","title":{"rendered":"\u0141atwe i bezproblemowe wdra\u017canie aplikacji na Tarantool Cartridge (cz\u0119\u015b\u0107 1)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\u0141atwe i bezproblemowe wdra\u017canie aplikacji na Tarantool Cartridge (cz\u0119\u015b\u0107 1)\" src=\"\/wp-content\/uploads\/2019\/12\/0493b6c8d60253352bc971b216e9b63e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ju\u017c pisali\u015bmy o <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/465503\/\">Tarantool Cartridge<\/a><\/noindex>, kt\u00f3ry umo\u017cliwia rozw\u00f3j aplikacji rozproszonych i ich pakowanie. Zosta\u0142o tylko nauczy\u0107 si\u0119 wdra\u017ca\u0107 te aplikacje i nimi zarz\u0105dza\u0107. Nie martw si\u0119, wszystko przewidzieli\u015bmy! Zebrali\u015bmy najlepsze praktyki dotycz\u0105ce pracy z Tarantool Cartridge i napisali\u015bmy <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/tarantool\/cartridge\">rol\u0119 ansible<\/a><\/noindex>, kt\u00f3ra zainstaluje pakiet na serwerach, uruchomi instancje, po\u0142\u0105czy je w klaster, skonfiguruje autoryzacj\u0119, zainicjuje vshard, w\u0142\u0105czy automatyczny failover i zaktualizuje konfiguracj\u0119 klastra.<\/p>\n<p><\/p>\n<p>Ciekawi? Zapraszam do rozwini\u0119cia, wszystko opowiemy i poka\u017cemy.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"nachnem-s-primera\">Zacznijmy od przyk\u0142adu<\/h1>\n<p><\/p>\n<p>Zastanowimy si\u0119 tylko nad cz\u0119\u015bci\u0105 funkcjonalno\u015bci naszej roli. Pe\u0142ny opis wszystkich jej mo\u017cliwo\u015bci i parametr\u00f3w wej\u015bciowych znajdziesz zawsze w <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">dokumentacji<\/a><\/noindex>. Ale lepiej raz spr\u00f3bowa\u0107 ni\u017c sto razy zobaczy\u0107, wi\u0119c zainstalujmy ma\u0142\u0105 aplikacj\u0119.<\/p>\n<p><\/p>\n<p>Tarantool Cartridge ma <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> do stworzenia niewielkiej aplikacji Cartridge, kt\u00f3ra przechowuje informacje o klientach banku i ich kontach, a tak\u017ce udost\u0119pnia API do zarz\u0105dzania danymi przez HTTP. W aplikacji opisane s\u0105 dwie mo\u017cliwe role: <code>api<\/code> i <code>magazyn<\/code>, kt\u00f3re mog\u0105 by\u0107 przypisane do instancji.<\/p>\n<p><\/p>\n<p>Sam Cartridge nic nie m\u00f3wi o tym, jak uruchamia\u0107 procesy, udost\u0119pnia jedynie mo\u017cliwo\u015b\u0107 konfiguracji ju\u017c uruchomionych instancji. Reszt\u0119 u\u017cytkownik musi zrobi\u0107 sam: rozstawi\u0107 pliki konfiguracyjne, uruchomi\u0107 us\u0142ugi i skonfigurowa\u0107 topologi\u0119. Ale tym wszystkim zajmie si\u0119 za nas Ansible.<\/p>\n<p><\/p>\n<h3 id=\"ot-slov-k-delu\">Od s\u0142\u00f3w do czyn\u00f3w<\/h3>\n<p><\/p>\n<p>Zatem zainstalujemy nasz\u0105 aplikacj\u0119 na dw\u00f3ch maszynach wirtualnych i skonfigurujemy prost\u0105 topologi\u0119:<\/p>\n<p><\/p>\n<ul>\n<li>Replika zestaw <code>app-1<\/code> b\u0119dzie realizowa\u0107 rol\u0119 <code>api<\/code>, kt\u00f3ra obejmuje rol\u0119 <code>vshard-router<\/code>. B\u0119dzie tylko jedna instancja.<\/li>\n<li>Replika zestaw <code>storage-1<\/code> realizuje rol\u0119 <code>magazyn<\/code> (a jednocze\u015bnie <code>vshard-storage<\/code>), dodamy tutaj dwie instancje z r\u00f3\u017cnych maszyn.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u0141atwe i bezproblemowe wdra\u017canie aplikacji na Tarantool Cartridge (cz\u0119\u015b\u0107 1)\" src=\"\/wp-content\/uploads\/2019\/12\/62d20050e2d7a6358002ecd758222f1f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aby uruchomi\u0107 przyk\u0142ad potrzebujemy <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vagrantup.com\/\">Vagrant<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ansible.com\">Ansible<\/a><\/noindex> (wersje 2.8 lub wy\u017csze).<\/p>\n<p><\/p>\n<p>Rola znajduje si\u0119 w <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/docs\/\">Ansible Galaxy<\/a><\/noindex>. To takie repozytorium, kt\u00f3re pozwala dzieli\u0107 si\u0119 swoimi osi\u0105gni\u0119ciami i korzysta\u0107 z gotowych r\u00f3l.<\/p>\n<p><\/p>\n<p>Sklonujmy repozytorium z przyk\u0142adem:<\/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>Uruchamiamy maszyny wirtualne:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ vagrant up<\/code><\/pre>\n<p><\/p>\n<p>Instalujemy rol\u0119 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>Uruchamiamy zainstalowan\u0105 rol\u0119:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-playbook -i hosts.yml playbook.yml<\/code><\/pre>\n<p><\/p>\n<p>Czekamy na zako\u0144czenie wykonania playbooka, przechodzimy do <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> i cieszymy si\u0119 rezultatem:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u0141atwe i bezproblemowe wdra\u017canie aplikacji na Tarantool Cartridge (cz\u0119\u015b\u0107 1)\" src=\"\/wp-content\/uploads\/2019\/12\/6563ddf2f2bfc85714f327c8d6b2d1c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mo\u017cna przesy\u0142a\u0107 dane. Fajnie, prawda?<\/p>\n<p><\/p>\n<p>A teraz rozwi\u0105\u017cmy, jak to dzia\u0142a, a przy okazji dodamy jeszcze jeden replikaset do topologii.<\/p>\n<p><\/p>\n<h3 id=\"nachinaem-razbiratsya\">Zaczynamy si\u0119 rozgl\u0105da\u0107<\/h3>\n<p><\/p>\n<p>Zatem, co si\u0119 wydarzy\u0142o?<\/p>\n<p><\/p>\n<p>Utworzyli\u015bmy dwie maszyny wirtualne i uruchomili\u015bmy playbook ansible, kt\u00f3ry skonfigurowa\u0142 nasz klaster. Zobaczmy zawarto\u015b\u0107 pliku <code>playbook.yml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n- name: Wdra\u017cam moj\u0105 aplikacj\u0119 Tarantool Cartridge\n  hosts: all\n  become: true\n  become_user: root\n  tasks:\n  - name: Importuj rol\u0119 Tarantool Cartridge\n    import_role:\n      name: tarantool.cartridge<\/code><\/pre>\n<p><\/p>\n<p>Tu nic interesuj\u0105cego si\u0119 nie dzieje, uruchamiamy rol\u0119 ansible, kt\u00f3ra nazywa si\u0119 <code>tarantool.cartridge<\/code>.<\/p>\n<p><\/p>\n<p>Wszystko, co najwa\u017cniejsze (a mianowicie, konfiguracja klastra) znajduje si\u0119 w <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/intro_inventory.html\">inventory<\/a><\/noindex>-pliku <code>hosts.yml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\nall:\n  vars:\n    # wsp\u00f3lne zmienne klastra\n    cartridge_app_name: getting-started-app\n    cartridge_package_path: .\\\/getting-started-app-1.0.0-0.rpm  # \u015bcie\u017cka do pakietu\n\n    cartridge_cluster_cookie: app-default-cookie  # cookie klastra\n\n    # wsp\u00f3lne opcje ssh\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  # INSTANCJE\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    # GRUPUJ INSTANCJE WG MASZYN\n    host1:\n      vars:\n        # opcje po\u0142\u0105czenia z pierwsz\u0105 maszyn\u0105\n        ansible_host: 172.19.0.2\n        ansible_user: vagrant\n\n      hosts:  # instancje, kt\u00f3re b\u0119d\u0105 uruchamiane na pierwszej maszynie\n        storage-1:\n\n    host2:\n      vars:\n        # opcje po\u0142\u0105czenia z drug\u0105 maszyn\u0105\n        ansible_host: 172.19.0.3\n        ansible_user: vagrant\n\n      hosts:  # instancje, kt\u00f3re b\u0119d\u0105 uruchamiane na drugiej maszynie\n        app-1:\n        storage-1-replica:\n\n    # GRUPUJ INSTANCJE WG REPLIKASET\u00d3W\n    replicaset_app_1:\n      vars:  # konfiguracja repliki\n        replicaset_alias: app-1\n        failover_priority:\n          - app-1  # lider\n        roles:\n          - 'api'\n\n      hosts:  # instancje repliki\n        app-1:\n\n    replicaset_storage_1:\n      vars:  # konfiguracja repliki\n        replicaset_alias: storage-1\n        weight: 3\n        failover_priority:\n          - storage-1  # lider\n          - storage-1-replica\n        roles:\n          - 'storage'\n\n      hosts:   # instancje repliki\n        storage-1:\n        storage-1-replica:<\/code><\/pre>\n<p><\/p>\n<p>Wszystko, czego potrzebujemy, to nauczy\u0107 si\u0119 zarz\u0105dza\u0107 instancjami i replikasetami, zmieniaj\u0105c zawarto\u015b\u0107 tego pliku. Dalej dodamy w nim nowe sekcje. Aby si\u0119 nie pogubi\u0107, gdzie je dodawa\u0107, mo\u017cecie zerkn\u0105\u0107 na ostateczn\u0105 wersj\u0119 tego pliku, <code>hosts.updated.yml<\/code>, kt\u00f3ry znajduje si\u0119 w repozytorium z przyk\u0142adem.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-instansami\">Zarz\u0105dzanie instancjami<\/h3>\n<p><\/p>\n<p>W terminologii Ansible ka\u017cdy instans to host (nie myli\u0107 z fizycznym serwerem), tj. w\u0119ze\u0142 infrastruktury, kt\u00f3rym Ansible b\u0119dzie zarz\u0105dza\u0107. Dla ka\u017cdego hosta mo\u017cemy okre\u015bli\u0107 parametry po\u0142\u0105czenia (takie jak <code>ansible_host<\/code> i <code>ansible_user<\/code>), a tak\u017ce konfiguracj\u0119 instansa. Opis instans\u00f3w znajduje si\u0119 w sekcji <code>hosts<\/code>.<\/p>\n<p><\/p>\n<p>Rozwa\u017cmy konfiguracj\u0119 instansa <code>storage-1<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n\n  # INSTANCJE\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>W zmiennej <code>config<\/code> okre\u015blili\u015bmy parametry instansa \u2014 <code>advertise URI<\/code> i <code>HTTP port<\/code>.<br \/>\nPoni\u017cej znajduj\u0105 si\u0119 parametry instans\u00f3w <code>app-1<\/code> i <code>storage-1-replica<\/code>.<\/p>\n<p><\/p>\n<p>Musimy poinformowa\u0107 Ansible o parametrach po\u0142\u0105czenia dla ka\u017cdego instansa. Wydaje si\u0119 logiczne, aby po\u0142\u0105czy\u0107 instansy w grupy wed\u0142ug maszyn wirtualnych. W tym celu instansy zosta\u0142y zgrupowane w grupy <code>host1<\/code> i <code>host2<\/code>, a w ka\u017cdej grupie w sekcji <code>vars<\/code> okre\u015blone s\u0105 warto\u015bci <code>ansible_host<\/code> i <code>ansible_user<\/code> dla jednej wirtualki. A w sekcji <code>hosts<\/code> \u2014 hosts (czyli instansy), kt\u00f3re wchodz\u0105 w sk\u0142ad tej grupy:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n  hosts:\n    ...\n  children:\n    # GRUPUJ INSTANCJE WED\u0141UG MASZYN\n    host1:\n      vars:\n        # opcje po\u0142\u0105czenia dla pierwszej maszyny\n        ansible_host: 172.19.0.2\n        ansible_user: vagrant\n       hosts:  # instancje, kt\u00f3re b\u0119d\u0105 uruchomione na pierwszej maszynie\n        storage-1:\n\n     host2:\n      vars:\n        # opcje po\u0142\u0105czenia dla drugiej maszyny\n        ansible_host: 172.19.0.3\n        ansible_user: vagrant\n       hosts:  # instancje, kt\u00f3re b\u0119d\u0105 uruchomione na drugiej maszynie\n        app-1:\n        storage-1-replica:<\/code><\/pre>\n<p><\/p>\n<p>Zaczynamy wprowadza\u0107 zmiany <code>hosts.yml<\/code>. Dodamy jeszcze dwa instansy, <code>storage-2-replica<\/code> na pierwszej wirtualce i <code>storage-2<\/code> na drugiej:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n\n  # INSTANCJE\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    # GRUPUJ INSTANCJE WED\u0141UG MASZYN\n    host1:\n      vars:\n        ...\n      hosts:  # instancje, kt\u00f3re b\u0119d\u0105 uruchomione na pierwszej maszynie\n        storage-1:\n        storage-2-replica:  # &lt;==\n\n    host2:\n      vars:\n        ...\n      hosts:  # instancje, kt\u00f3re b\u0119d\u0105 uruchomione na drugiej maszynie\n        app-1:\n        storage-1-replica:\n        storage-2:  # &lt;==\n  ...<\/code><\/pre>\n<p><\/p>\n<p>Uruchamiamy 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>Zwr\u00f3\u0107 uwag\u0119 na opcj\u0119 <code>--limit<\/code>. Poniewa\u017c ka\u017cdy instans klastra jest hostem w terminologii Ansible, mo\u017cemy jawnie okre\u015bla\u0107, kt\u00f3re instansy maj\u0105 by\u0107 skonfigurowane podczas wykonywania playbooka.<\/p>\n<p><\/p>\n<p>Ponownie wchodzimy do interfejsu Web UI <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> i obserwujemy nasze nowe instansy:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u0141atwe i bezproblemowe wdra\u017canie aplikacji na Tarantool Cartridge (cz\u0119\u015b\u0107 1)\" src=\"\/wp-content\/uploads\/2019\/12\/6181c359e4e5ec4adaee8737600a27e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nie zatrzymujmy si\u0119 na osi\u0105gni\u0119tym celu i nauczmy si\u0119 zarz\u0105dza\u0107 topologi\u0105.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-topologiey\">Zarz\u0105dzanie topologi\u0105<\/h3>\n<p><\/p>\n<p>Po\u0142\u0105czmy nasze nowe instansy w replikaset <code>storage-2<\/code>. Dodamy now\u0105 grup\u0119 <code>replicaset_storage_2<\/code> i opiszemy w jej zmiennych parametry replikasetu analogicznie do <code>replicaset_storage_1<\/code>. W sekcji <code>hosts<\/code> Okre\u015blamy, kt\u00f3re instancje b\u0119d\u0105 nale\u017ce\u0107 do tej grupy (to znaczy nasz zestaw replik):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\nall:\n  vars:\n    ...\n  hosts:\n    ...\n  children:\n    ...\n    # GRUPUJ INSTANCJE W ZESTAWY REPLIK\n    ...\n    replicaset_storage_2:  # &lt;==\n      vars:  # konfiguracja zestawu replik\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:   # instancje zestawu replik\n        storage-2:\n        storage-2-replica:<\/code><\/pre>\n<p><\/p>\n<p>Ponownie uruchamiamy playbook:<\/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>W parametrze <code>--limit<\/code> tym razem przekazali\u015bmy nazw\u0119 grupy, kt\u00f3ra odpowiada naszemu zestawowi replik.<\/p>\n<p><\/p>\n<p>Rozwa\u017cmy opcj\u0119 <code>tags<\/code>.<\/p>\n<p><\/p>\n<p>Nasza rola stopniowo wykonuje r\u00f3\u017cne zadania, kt\u00f3re s\u0105 oznaczone nast\u0119puj\u0105cymi tagami:<\/p>\n<p><\/p>\n<ul>\n<li><code>cartridge-instances<\/code>: zarz\u0105dzanie instancjami (konfiguracja, pod\u0142\u0105czenie do membership);<\/li>\n<li><code>cartridge-replicasets<\/code>: zarz\u0105dzanie topologi\u0105 (zarz\u0105dzanie zestawami replik i nieodwracalne usuwanie (expel) instancji z klastra);<\/li>\n<li><code>cartridge-config<\/code>: zarz\u0105dzanie pozosta\u0142ymi parametrami klastra (vshard bootstrapping, tryb automatycznego failover, parametry autoryzacji i konfiguracja aplikacji).<\/li>\n<\/ul>\n<p><\/p>\n<p>Mo\u017cemy wyra\u017anie okre\u015bli\u0107, kt\u00f3r\u0105 cz\u0119\u015b\u0107 pracy chcemy wykona\u0107, wtedy rola pominie wykonanie pozosta\u0142ych zada\u0144. W naszym przypadku chcemy pracowa\u0107 tylko z topologi\u0105, dlatego okre\u015blili\u015bmy <code>cartridge-replicasets<\/code>.<\/p>\n<p><\/p>\n<p>Oce\u0144my wynik naszych wysi\u0142k\u00f3w. Znajdujemy nowy zestaw replik na <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=\"\u0141atwe i bezproblemowe wdra\u017canie aplikacji na Tarantool Cartridge (cz\u0119\u015b\u0107 1)\" src=\"\/wp-content\/uploads\/2019\/12\/20da99480df519b1ee239cd81f67b786.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hurra!<\/p>\n<p><\/p>\n<p>Eksperymentuj z zmian\u0105 konfiguracji instancji i zestaw\u00f3w replik oraz zobacz, jak zmienia si\u0119 topologia klastra. Mo\u017cesz przetestowa\u0107 r\u00f3\u017cne scenariusze operacyjne, na przyk\u0142ad, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_delegation.html#rolling-update-batch-size\">rolling update<\/a><\/noindex> lub zwi\u0119kszenie <code>memtx_memory<\/code>. Rola spr\u00f3buje to zrobi\u0107 bez restartu instancji, aby zminimalizowa\u0107 mo\u017cliwy czas przestoju aplikacji.<\/p>\n<p><\/p>\n<p>Nie zapomnij uruchomi\u0107 <code>vagrant halt<\/code>, aby zatrzyma\u0107 wirtualki, gdy sko\u0144czysz z nimi pracowa\u0107.<\/p>\n<p><\/p>\n<h1 id=\"a-chto-pod-kapotom\">A co pod mask\u0105?<\/h1>\n<p><\/p>\n<p>Tutaj szczeg\u00f3\u0142owo opowiem, co dzia\u0142o si\u0119 pod mask\u0105 roli ansible podczas naszych eksperyment\u00f3w.<\/p>\n<p><\/p>\n<p>Rozwa\u017cmy krok po kroku wdro\u017cenie aplikacji Cartridge.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-paketa-i-start-instansov\">Instalacja pakietu i uruchomienie instancji<\/h3>\n<p><\/p>\n<p>Najpierw musisz dostarczy\u0107 pakiet na serwer i go zainstalowa\u0107. Obecnie rola potrafi pracowa\u0107 z pakietami RPM i DEB.<\/p>\n<p><\/p>\n<p>Nast\u0119pnie uruchamiamy instancje. Tutaj wszystko jest bardzo proste: ka\u017cda instancja to osobny <code>systemd<\/code>-serwis. Opowiem na przyk\u0142adzie:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ systemctl start myapp@storage-1<\/code><\/pre>\n<p><\/p>\n<p>To polecenie uruchomi instancj\u0119 <code>storage-1<\/code> aplikacji <code>myapp<\/code>. Uruchomiona instancja b\u0119dzie szuka\u0107 swojej <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tarantool.io\/ru\/doc\/2.2\/book\/cartridge\/cartridge_dev\/#configuring-instances\">konfiguracji<\/a><\/noindex> do <code>\/etc\/tarantool\/conf.d\/<\/code>. Dzienniki instancji mo\u017cna b\u0119dzie przegl\u0105da\u0107 za pomoc\u0105 <code>journald<\/code>.<\/p>\n<p><\/p>\n<p>Plik jednostki <code>\/etc\/systemd\/system\/myapp@.sevice<\/code> dla us\u0142ugi systemd b\u0119dzie dostarczony wraz z pakietem.<\/p>\n<p><\/p>\n<p>Ansible zawiera wbudowane modu\u0142y do instalacji pakiet\u00f3w i zarz\u0105dzania us\u0142ugami systemd, tutaj nie wymy\u015blili\u015bmy nic nowego.<\/p>\n<p><\/p>\n<h3 id=\"nastroyka-topologii-klastera\">Konfiguracja topologii klastra<\/h3>\n<p><\/p>\n<p>A tutaj zaczyna si\u0119 najciekawsza cz\u0119\u015b\u0107. Zgadzam si\u0119, by\u0142oby dziwnie martwi\u0107 si\u0119 o specjaln\u0105 rol\u0119 ansible do instalacji pakiet\u00f3w i uruchamiania <code>systemd<\/code>-us\u0142ug.<\/p>\n<p><\/p>\n<p>Klastr mo\u017cna skonfigurowa\u0107 r\u0119cznie:<\/p>\n<p><\/p>\n<ul>\n<li>Pierwsza opcja: otwieramy interfejs webowy i klikamy przyciski. Do jednorazowego uruchomienia kilku instancji b\u0119dzie to wystarczaj\u0105ce.<\/li>\n<li>Druga opcja: mo\u017cna skorzysta\u0107 z API GraphQl. Tutaj mo\u017cna co\u015b zautomatyzowa\u0107, na przyk\u0142ad napisa\u0107 skrypt w Pythonie.<\/li>\n<li>Trzecia opcja (dla odwa\u017cnych): wchodzimy na serwer, \u0142\u0105czymy si\u0119 z jedn\u0105 z instancji za pomoc\u0105 <code>tarantoolctl connect<\/code> i wykonujemy wszystkie niezb\u0119dne operacje z modu\u0142em Lua <code>cartridge<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>G\u0142\u00f3wne zadanie naszego wynalazku to w\u0142a\u015bnie ta, najbardziej skomplikowana cz\u0119\u015b\u0107 pracy.<\/p>\n<p><\/p>\n<p>Ansible pozwala napisa\u0107 w\u0142asny modu\u0142 i u\u017cy\u0107 go w roli. Nasza rola korzysta z takich modu\u0142\u00f3w do zarz\u0105dzania r\u00f3\u017cnymi komponentami klastra.<\/p>\n<p><\/p>\n<p>Jak to dzia\u0142a? Opisujesz po\u017c\u0105dany stan klastra w deklaratywnej konfiguracji, a rola podaje ka\u017cdemu modu\u0142owi jego sekcj\u0119 konfiguracji. Modu\u0142 otrzymuje aktualny stan klastra i por\u00f3wnuje go z tym, co otrzyma\u0142 na wej\u015bciu. Nast\u0119pnie przez socket jednej z instancji uruchamiany jest kod, kt\u00f3ry przekszta\u0142ca klaster w \u017c\u0105dany stan.<\/p>\n<p><\/p>\n<h1 id=\"itogi\">Podsumowanie<\/h1>\n<p><\/p>\n<p>Dzisiaj opowiedzieli\u015bmy i pokazali\u015bmy, jak wdro\u017cy\u0107 aplikacj\u0119 na Tarantool Cartridge i skonfigurowa\u0107 prost\u0105 topologi\u0119. Do tego u\u017cyli\u015bmy Ansible - pot\u0119\u017cnego narz\u0119dzia, kt\u00f3re wyr\u00f3\u017cnia si\u0119 prostot\u0105 w u\u017cyciu i pozwala jednocze\u015bnie konfigurowa\u0107 wiele w\u0119z\u0142\u00f3w infrastruktury (w naszym przypadku to instancje klastra).<\/p>\n<p><\/p>\n<p>Powy\u017cej przyjrzeli\u015bmy si\u0119 jednemu z wielu sposob\u00f3w opisu konfiguracji klastra za pomoc\u0105 Ansible. Gdy tylko zrozumiesz, \u017ce jeste\u015b gotowy i\u015b\u0107 dalej, zapoznaj si\u0119 z <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_best_practices.html\">best practices<\/a><\/noindex> pisania playbook\u00f3w. Mo\u017ce by\u0107 ci wygodniej zarz\u0105dza\u0107 topologi\u0105 za pomoc\u0105 <code>group_vars<\/code> i <code>host_vars<\/code>.<\/p>\n<p><\/p>\n<p>Wkr\u00f3tce opowiemy, jak trwale usuwa\u0107 (expel) instancje z topologii, bootstrapowa\u0107 vshard, zarz\u0105dza\u0107 trybem automatycznego failoveru, konfigurowa\u0107 autoryzacj\u0119 i patchowa\u0107 konfiguracj\u0119 klastra. Na razie mo\u017cesz samodzielnie studiowa\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">dokumentacj\u0119<\/a><\/noindex> i eksperymentowa\u0107 z modyfikowaniem parametr\u00f3w klastra.<\/p>\n<p><\/p>\n<p>Je\u015bli co\u015b nie dzia\u0142a, koniecznie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge\/issues\/new\">poinformuj<\/a><\/noindex> nas o problemie. Szybko to wyja\u015bnimy!<\/p>\n<p>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47\u0141atwo i bezproblemowo wdra\u017camy aplikacje na Tarantool Cartridge (cz\u0119\u015b\u0107 1) | ProHoster","description":"Ju\u017c jeste\u015bmy.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/53611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=53611"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/53611\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=53611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=53611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=53611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}