Madali at natural na mag-deploy ng mga application sa Tarantool Cartridge (part 1)

Madali at natural na mag-deploy ng mga application sa Tarantool Cartridge (part 1)

Napag-usapan na namin Tarantool Cartridge, na nagbibigay-daan sa iyong bumuo ng mga distributed na application at i-package ang mga ito. Ang natitira na lang ay upang matutunan kung paano i-deploy ang mga application na ito at pamahalaan ang mga ito. Huwag mag-alala, nasasakop na namin ang lahat! Pinagsama-sama namin ang lahat ng pinakamahusay na kasanayan para sa pagtatrabaho sa Tarantool Cartridge at nagsulat ansible-role, na ipamahagi ang package sa mga server, maglulunsad ng mga pagkakataon, pag-isahin ang mga ito sa isang cluster, i-configure ang pahintulot, bootstrap vshard, paganahin ang awtomatikong failover at i-patch ang cluster config.

Interesting? Pagkatapos ay mangyaring, sa ilalim ng hiwa, sasabihin namin sa iyo at ipapakita sa iyo ang lahat.

Magsimula tayo sa isang halimbawa

Titingnan lang natin ang bahagi ng functionality ng ating tungkulin. Makakahanap ka palagi ng kumpletong paglalarawan ng lahat ng mga kakayahan at mga parameter ng input nito dokumentasyon. Ngunit mas mahusay na subukan nang isang beses kaysa makita ito ng isang daang beses, kaya mag-deploy tayo ng isang maliit na application.

Ang Tarantool Cartridge ay mayroon pagtuturo upang lumikha ng isang maliit na application ng Cartridge na nag-iimbak ng impormasyon tungkol sa mga kliyente ng bangko at kanilang mga account, at nagbibigay din ng isang API para sa pamamahala ng data sa pamamagitan ng HTTP. Upang makamit ito, inilalarawan ng apendiks ang dalawang posibleng tungkulin: api ΠΈ storage, na maaaring italaga sa mga instance.

Ang Cartridge mismo ay walang sinasabi tungkol sa kung paano ilunsad ang mga proseso, nagbibigay lamang ito ng kakayahang i-configure ang mga tumatakbo nang pagkakataon. Dapat gawin mismo ng user ang iba: ayusin ang mga configuration file, simulan ang mga serbisyo at i-configure ang topology. Ngunit hindi namin gagawin ang lahat ng ito; gagawin ito ng Ansible para sa amin.

Mula sa salita hanggang sa gawa

Kaya, i-deploy natin ang aming application sa dalawang virtual machine at mag-set up ng isang simpleng topology:

  • Replicaset app-1 ipapatupad ang tungkulin api, na kinabibilangan ng tungkulin vshard-router. Magkakaroon lamang ng isang pagkakataon dito.
  • Replicaset storage-1 nagpapatupad ng tungkulin storage (at sa parehong oras vshard-storage), dito magdaragdag kami ng dalawang pagkakataon mula sa magkaibang mga makina.

Madali at natural na mag-deploy ng mga application sa Tarantool Cartridge (part 1)

Upang patakbuhin ang halimbawa na kailangan natin Vagrant ΠΈ Ansible (bersyon 2.8 o mas luma).

Ang papel mismo ay nasa Ansible Galaxy. Ito ay isang repositoryo na nagbibigay-daan sa iyong ibahagi ang iyong trabaho at gumamit ng mga nakahanda nang tungkulin.

I-clone natin ang repositoryo ng isang halimbawa:

$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0

Nagtataas kami ng mga virtual machine:

$ vagrant up

I-install ang Tarantool Cartridge ansible role:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Ilunsad ang naka-install na tungkulin:

$ ansible-playbook -i hosts.yml playbook.yml

Hinihintay namin ang playbook upang makumpleto ang pagpapatupad, pumunta sa http://localhost:8181/admin/cluster/dashboard at tamasahin ang resulta:

Madali at natural na mag-deploy ng mga application sa Tarantool Cartridge (part 1)

Maaari kang mag-upload ng data. Astig diba?

Ngayon, alamin natin kung paano ito gagawin, at sabay na magdagdag ng isa pang replica na set sa topology.

Simulan natin itong malaman

So anong nangyari?

Nag-set up kami ng dalawang virtual machine at naglunsad ng isang praktikal na playbook na nag-configure sa aming cluster. Tingnan natin ang mga nilalaman ng file 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

Walang kawili-wiling nangyayari dito, ilunsad natin ang isang ansible na tungkulin na tinatawag tarantool.cartridge.

Ang lahat ng pinakamahalagang bagay (ibig sabihin, ang configuration ng cluster) ay matatagpuan sa imbentaryo-file 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:

Ang kailangan lang namin ay matutunan kung paano pamahalaan ang mga instance at replicase sa pamamagitan ng pagbabago sa mga nilalaman ng file na ito. Susunod, magdaragdag kami ng mga bagong seksyon dito. Upang hindi malito kung saan idaragdag ang mga ito, maaari mong tingnan ang huling bersyon ng file na ito, hosts.updated.yml, na nasa halimbawang repositoryo.

Pamamahala ng halimbawa

Sa mga terminong Ansible, ang bawat instance ay isang host (hindi dapat ipagkamali sa isang server ng hardware), i.e. ang infrastructure node na pamamahalaan ng Ansible. Para sa bawat host maaari naming tukuyin ang mga parameter ng koneksyon (tulad ng ansible_host ΠΈ ansible_user), pati na rin ang pagsasaayos ng instance. Ang paglalarawan ng mga pagkakataon ay nasa seksyon hosts.

Tingnan natin ang pagsasaayos ng halimbawa storage-1:

all:
  vars:
    ...

  # INSTANCES
  hosts:
    storage-1:
      config:
        advertise_uri: '172.19.0.2:3301'
        http_port: 8181

  ...

Sa variable config tinukoy namin ang mga parameter ng halimbawa - advertise URI ΠΈ HTTP port.
Nasa ibaba ang mga parameter ng instance app-1 ΠΈ storage-1-replica.

Kailangan nating sabihin sa Ansible ang mga parameter ng koneksyon para sa bawat pagkakataon. Mukhang lohikal na ipangkat ang mga pagkakataon sa mga pangkat ng virtual machine. Para sa layuning ito, ang mga pagkakataon ay pinagsama sa mga pangkat host1 ΠΈ host2, at sa bawat pangkat sa seksyon vars ipinahiwatig ang mga halaga ansible_host ΠΈ ansible_user para sa isang virtual machine. At sa section hosts β€” mga host (aka instance) na kasama sa pangkat na ito:

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:

Nagsisimula tayong magbago hosts.yml. Magdagdag pa tayo ng dalawa pang pagkakataon, storage-2-replica sa unang virtual machine at storage-2 Sa pangalawa:

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:  # <==
  ...

Ilunsad ang ansible playbook:

$ ansible-playbook -i hosts.yml 
                   --limit storage-2,storage-2-replica 
                   playbook.yml

Pakitandaan ang opsyon --limit. Dahil ang bawat cluster instance ay isang host sa mga terminong Ansible, maaari naming tahasang tukuyin kung aling mga instance ang dapat i-configure kapag isinasagawa ang playbook.

Bumabalik sa Web UI http://localhost:8181/admin/cluster/dashboard at tingnan ang aming mga bagong pagkakataon:

Madali at natural na mag-deploy ng mga application sa Tarantool Cartridge (part 1)

Huwag tayong tumigil doon at master topology management.

Pamamahala ng topology

Pagsamahin natin ang ating mga bagong instance sa isang replica set storage-2. Magdagdag tayo ng bagong grupo replicaset_storage_2 at ilarawan ang mga parameter ng replicaset sa mga variable nito sa pamamagitan ng pagkakatulad sa replicaset_storage_1. Sa seksyon hosts Ipahiwatig natin kung aling mga pagkakataon ang isasama sa pangkat na ito (iyon ay, ang aming replica set):

---
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:

Simulan natin muli ang playbook:

$ ansible-playbook -i hosts.yml 
                   --limit replicaset_storage_2 
                   --tags cartridge-replicasets 
                   playbook.yml

Sa parameter --limit Sa pagkakataong ito, ipinasa namin ang pangalan ng pangkat na tumutugma sa aming replika.

Isaalang-alang natin ang pagpipilian tags.

Ang aming tungkulin ay sunud-sunod na gumaganap ng iba't ibang mga gawain, na minarkahan ng mga sumusunod na tag:

  • cartridge-instances: instance management (configuration, koneksyon sa membership);
  • cartridge-replicasets: pamamahala ng topology (pamamahala ng replicaset at permanenteng pag-alis (paalis) ng mga instance mula sa cluster);
  • cartridge-config: pamamahala ng iba pang mga parameter ng cluster (vshard bootstrapping, awtomatikong failover mode, mga parameter ng pahintulot at pagsasaayos ng application).

Maaari naming tahasang tukuyin kung aling bahagi ng gawain ang gusto naming gawin, pagkatapos ay laktawan ng tungkulin ang iba pang mga gawain. Sa aming kaso, gusto naming magtrabaho lamang sa topology, kaya tinukoy namin cartridge-replicasets.

Suriin natin ang resulta ng ating pagsisikap. Nakahanap kami ng bagong replicase http://localhost:8181/admin/cluster/dashboard.

Madali at natural na mag-deploy ng mga application sa Tarantool Cartridge (part 1)

Yehey!

Mag-eksperimento sa pagbabago ng configuration ng mga instance at replica set at tingnan kung paano nagbabago ang cluster topology. Maaari mong subukan ang iba't ibang mga sitwasyon sa pagpapatakbo, hal. rolling update o pagtaas memtx_memory. Susubukan ng tungkulin na gawin ito nang hindi na-restart ang instance upang mabawasan ang posibleng downtime ng iyong aplikasyon.

Huwag kalimutang tumakbo vagrant haltupang ihinto ang mga virtual machine kapag tapos ka nang magtrabaho sa kanila.

At ano ang nasa ilalim ng hood?

Dito ay sasabihin ko sa iyo ang higit pa tungkol sa kung ano ang nangyayari sa ilalim ng hood ng ansible na tungkulin sa panahon ng aming mga eksperimento.

Tingnan natin ang pag-deploy ng Cartridge application nang hakbang-hakbang.

Pag-install ng package at pagsisimula ng mga pagkakataon

Una kailangan mong ihatid ang package sa server at i-install ito. Sa kasalukuyan ang tungkulin ay maaaring gumana sa mga RPM at DEB na pakete.

Susunod na ilulunsad namin ang mga pagkakataon. Napakasimple ng lahat dito: hiwalay ang bawat pagkakataon systemd-serbisyo. Bibigyan kita ng isang halimbawa:

$ systemctl start myapp@storage-1

Ilulunsad ng command na ito ang instance storage-1 apps myapp. Hahanapin ng inilunsad na instance ang nito pagsasaayos Π² /etc/tarantool/conf.d/. Maaaring tingnan ang mga instance log gamit ang journald.

Unit file /etc/systemd/system/[email protected] para sa systemd service ay ihahatid kasama ng package.

Ang Ansible ay may mga built-in na module para sa pag-install ng mga pakete at pamamahala ng mga serbisyo ng systemd; wala kaming naimbentong bago dito.

Pagse-set up ng cluster topology

Dito nagsisimula ang saya. Sumang-ayon, kakaiba ang mag-abala sa isang espesyal na tungkulin ng Ansible para sa pag-install ng mga pakete at pagpapatakbo systemd-services.

Maaari mong i-configure nang manu-mano ang cluster:

  • Unang pagpipilian: buksan ang Web UI at mag-click sa mga pindutan. Ito ay lubos na angkop para sa isang beses na pagsisimula ng ilang mga pagkakataon.
  • Pangalawang opsyon: maaari mong gamitin ang GraphQl API. Dito maaari mo nang i-automate ang isang bagay, halimbawa, magsulat ng script sa Python.
  • Pangatlong opsyon (para sa malakas ang loob): pumunta sa server, kumonekta sa isa sa mga pagkakataong gumagamit tarantoolctl connect at isagawa ang lahat ng kinakailangang manipulasyon gamit ang Lua module cartridge.

Ang pangunahing gawain ng aming imbensyon ay gawin ito nang eksakto, ang pinakamahirap na bahagi ng trabaho para sa iyo.

Binibigyang-daan ka ng Ansible na magsulat ng sarili mong module at gamitin ito sa isang tungkulin. Gumagamit ang aming tungkulin ng mga naturang module upang pamahalaan ang iba't ibang bahagi ng cluster.

Paano ito gumagana? Inilalarawan mo ang nais na estado ng cluster sa isang deklaratibong config, at ang tungkulin ay nagbibigay sa bawat module ng seksyon ng pagsasaayos nito bilang input. Natatanggap ng module ang kasalukuyang estado ng cluster at inihahambing ito sa kung ano ang natanggap bilang input. Susunod, ang isang code ay inilunsad sa pamamagitan ng socket ng isa sa mga pagkakataon, na nagdadala ng cluster sa nais na estado.

Mga resulta ng

Ngayon sinabi namin at ipinakita kung paano i-deploy ang iyong application sa Tarantool Cartridge at mag-set up ng isang simpleng topology. Upang gawin ito, ginamit namin ang Ansible - isang makapangyarihang tool na madaling gamitin at nagbibigay-daan sa iyo na sabay na i-configure ang maraming mga node ng imprastraktura (sa aming kaso, mga cluster instance).

Sa itaas ay tiningnan namin ang isa sa maraming paraan upang ilarawan ang configuration ng cluster gamit ang Ansible. Kapag handa ka nang magpatuloy, mag-explore pinakamahusay na kasanayan sa pagsulat ng mga playbook. Maaaring mas madali mong pamahalaan ang iyong topology gamit group_vars ΠΈ host_vars.

Sa lalong madaling panahon, sasabihin namin sa iyo kung paano permanenteng tanggalin (paalisin) ang mga instance mula sa topology, bootstrap vshard, pamahalaan ang awtomatikong failover mode, i-configure ang awtorisasyon at i-patch ang cluster config. Samantala, maaari kang mag-aral nang mag-isa dokumentasyon at mag-eksperimento sa pagbabago ng mga parameter ng cluster.

Kung ang isang bagay ay hindi gumagana, siguraduhin na ipaalam sa akin sa amin tungkol sa problema. Aayusin namin ang lahat nang mabilis!

Pinagmulan: www.habr.com

Magdagdag ng komento