Vendosni lehtësisht dhe natyrshëm aplikacionet në Tarantool Cartridge (pjesa 1)

Vendosni lehtësisht dhe natyrshëm aplikacionet në Tarantool Cartridge (pjesa 1)

Ne kemi folur tashmë për Fisheku Tarantool, i cili ju lejon të zhvilloni aplikacione të shpërndara dhe t'i paketoni ato. Gjithçka që mbetet është të mësoni se si t'i vendosni këto aplikacione dhe t'i menaxhoni ato. Mos u shqetësoni, ne i kemi mbuluar të gjitha! Ne bashkuam të gjitha praktikat më të mira për të punuar me Tarantool Cartridge dhe shkruam ansible-rol, i cili do të shpërndajë paketën te serverët, do të nisë instancat, do t'i bashkojë ato në një grup, do të konfigurojë autorizimin, do të bootstrap vshard, do të aktivizojë dështimin automatik dhe do të korrigjojë konfigurimin e grupit.

Interesante? Atëherë ju lutemi, nën prerje, ne do t'ju tregojmë dhe do t'ju tregojmë gjithçka.

Le të fillojmë me një shembull

Ne do të shohim vetëm një pjesë të funksionalitetit të rolit tonë. Gjithmonë mund të gjeni një përshkrim të plotë të të gjitha aftësive dhe parametrave të tij të hyrjes dokumentacionin. Por është më mirë të provosh një herë sesa ta shohësh njëqind herë, kështu që le të vendosim një aplikacion të vogël.

Fisheku Tarantool ka tutorial për të krijuar një aplikacion të vogël Cartridge që ruan informacione për klientët e bankave dhe llogaritë e tyre, si dhe ofron një API për menaxhimin e të dhënave nëpërmjet HTTP. Për ta arritur këtë, shtojca përshkruan dy role të mundshme: api и storage, të cilat mund t'u caktohen instancave.

Vetë fisheku nuk thotë asgjë për mënyrën e nisjes së proceseve, ai ofron vetëm mundësinë për të konfiguruar instancat tashmë të ekzekutuara. Përdoruesi duhet të bëjë vetë pjesën tjetër: të rregullojë skedarët e konfigurimit, të fillojë shërbimet dhe të konfigurojë topologjinë. Por ne nuk do t'i bëjmë të gjitha këto; Ansible do ta bëjë atë për ne.

Nga fjalët në vepra

Pra, le të vendosim aplikacionin tonë në dy makina virtuale dhe të vendosim një topologji të thjeshtë:

  • Replikaset app-1 do të zbatojë rolin api, e cila përfshin rolin vshard-router. Këtu do të ketë vetëm një rast.
  • Replikaset storage-1 zbaton rolin storage (dhe në të njëjtën kohë vshard-storage), këtu do të shtojmë dy instanca nga makina të ndryshme.

Vendosni lehtësisht dhe natyrshëm aplikacionet në Tarantool Cartridge (pjesa 1)

Për të ekzekutuar shembullin që na nevojitet endacak и Ansible (versioni 2.8 ose më i vjetër).

Vetë roli është në Galaxy Ansible. Ky është një depo që ju lejon të ndani punën tuaj dhe të përdorni role të gatshme.

Le të klonojmë depon me një shembull:

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

Ne krijojmë makina virtuale:

$ vagrant up

Instaloni rolin e duhur të fishekut Tarantool:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Nisni rolin e instaluar:

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

Ne presim që libri i lojërave të përfundojë ekzekutimin, shkoni te http://localhost:8181/admin/cluster/dashboard dhe shijoni rezultatin:

Vendosni lehtësisht dhe natyrshëm aplikacionet në Tarantool Cartridge (pjesa 1)

Mund të ngarkoni të dhëna. E bukur, apo jo?

Tani le të kuptojmë se si të punojmë me këtë, dhe në të njëjtën kohë të shtojmë një grup tjetër kopje në topologji.

Le të fillojmë ta kuptojmë

Pra, çfarë ndodhi?

Ne konfiguruam dy makina virtuale dhe lançuam një libër të paanshëm që konfiguroi grupin tonë. Le të shohim përmbajtjen e skedarit 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

Asgjë interesante nuk ndodh këtu, le të lançojmë një rol të besueshëm të quajtur tarantool.cartridge.

Të gjitha gjërat më të rëndësishme (domethënë, konfigurimi i grupit) janë të vendosura në inventar- dosje 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:

Gjithçka që na duhet është të mësojmë se si të menaxhojmë instancat dhe grupet e kopjeve duke ndryshuar përmbajtjen e këtij skedari. Më pas do të shtojmë seksione të reja në të. Për të mos u ngatërruar se ku t'i shtoni ato, mund të shikoni versionin përfundimtar të këtij skedari, hosts.updated.yml, e cila është në depon e shembullit.

Menaxhimi i shembullit

Në terma Ansible, çdo shembull është një host (që nuk duhet ngatërruar me një server harduer), d.m.th. nyja e infrastrukturës që do të menaxhojë Ansible. Për çdo host ne mund të specifikojmë parametrat e lidhjes (si p.sh ansible_host и ansible_user), si dhe konfigurimin e shembullit. Përshkrimi i rasteve është në seksion hosts.

Le të shohim konfigurimin e shembullit storage-1:

all:
  vars:
    ...

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

  ...

Në variabël config ne specifikuam parametrat e shembullit - advertise URI и HTTP port.
Më poshtë janë parametrat e shembullit app-1 и storage-1-replica.

Ne duhet t'i tregojmë Ansible parametrat e lidhjes për çdo shembull. Duket logjike të grupohen instancat në grupe të makinave virtuale. Për këtë qëllim, instancat kombinohen në grupe host1 и host2, dhe në secilin grup në seksion vars tregohen vlerat ansible_host и ansible_user për një makinë virtuale. Dhe në seksion hosts — hostet (aka raste) që përfshihen në këtë grup:

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:

Ne fillojmë të ndryshojmë hosts.yml. Le të shtojmë edhe dy raste të tjera, storage-2-replica në makinën e parë virtuale dhe storage-2 Në të dytën:

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

Hapni librin e lojërave ansible:

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

Ju lutemi vini re opsionin --limit. Meqenëse çdo shembull i grupit është një host në termat e Ansible, ne mund të specifikojmë në mënyrë eksplicite se cilat instanca duhet të konfigurohen gjatë ekzekutimit të librit të luajtjes.

Duke u kthyer në ndërfaqen e internetit të uebit http://localhost:8181/admin/cluster/dashboard dhe shikoni shembujt tanë të rinj:

Vendosni lehtësisht dhe natyrshëm aplikacionet në Tarantool Cartridge (pjesa 1)

Le të mos ndalemi këtu dhe të zotërojmë menaxhimin e topologjisë.

Menaxhimi i topologjisë

Le të kombinojmë shembujt tanë të rinj në një grup kopjesh storage-2. Le të shtojmë një grup të ri replicaset_storage_2 dhe përshkruani parametrat e replicaset në variablat e tij në analogji me replicaset_storage_1. Në seksion hosts Le të tregojmë se cilat raste do të përfshihen në këtë grup (d.m.th., grupi ynë i kopjeve):

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

Le të fillojmë përsëri librin e lojërave:

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

Në parametër --limit Këtë herë kaluam emrin e grupit që korrespondon me replikaset tonë.

Le të shqyrtojmë opsionin tags.

Roli ynë kryen në mënyrë sekuenciale detyra të ndryshme, të cilat shënohen me etiketat e mëposhtme:

  • cartridge-instances: menaxhimi i shembullit (konfigurimi, lidhja me anëtarësimin);
  • cartridge-replicasets: menaxhimi i topologjisë (menaxhimi i replikaseteve dhe heqja (përjashtimi) i përhershëm i instancave nga grupi);
  • cartridge-config: menaxhimi i parametrave të tjerë të grupimit (bootstrapping vshard, modaliteti i dështimit automatik, parametrat e autorizimit dhe konfigurimi i aplikacionit).

Ne mund të specifikojmë në mënyrë eksplicite se cilën pjesë të punës duam të bëjmë, atëherë roli do të kalojë pjesën tjetër të detyrave. Në rastin tonë, ne duam të punojmë vetëm me topologjinë, kështu që ne specifikuam cartridge-replicasets.

Le të vlerësojmë rezultatin e përpjekjeve tona. Ne gjejmë një replicaset të ri në http://localhost:8181/admin/cluster/dashboard.

Vendosni lehtësisht dhe natyrshëm aplikacionet në Tarantool Cartridge (pjesa 1)

Hooray!

Eksperimentoni me ndryshimin e konfigurimit të instancave dhe grupeve të kopjeve dhe shikoni se si ndryshon topologjia e grupimit. Mund të provoni skenarë të ndryshëm operacional, p.sh. përditësim i vazhdueshëm ose rritje memtx_memory. Roli do të përpiqet ta bëjë këtë pa rifilluar shembullin në mënyrë që të zvogëlojë kohën e mundshme joproduktive të aplikacionit tuaj.

Mos harroni të vraponi vagrant haltpër të ndaluar makinat virtuale kur të keni mbaruar së punuari me to.

Dhe çfarë ka nën kapuç?

Këtu do t'ju tregoj më shumë për atë që po ndodhte nën kapuçin e rolit insible gjatë eksperimenteve tona.

Le të shohim hap pas hapi vendosjen e aplikacionit Cartridge.

Instalimi i paketës dhe fillimi i rasteve

Së pari ju duhet të dorëzoni paketën në server dhe ta instaloni atë. Aktualisht roli mund të funksionojë me paketat RPM dhe DEB.

Më pas nisim instancat. Gjithçka është shumë e thjeshtë këtu: çdo shembull është i veçantë systemd-shërbim. Unë do t'ju jap një shembull:

$ systemctl start myapp@storage-1

Kjo komandë do të nisë shembullin storage-1 Apps myapp. Shembulli i nisur do ta kërkojë atë konfigurimi в /etc/tarantool/conf.d/. Regjistrat e shembullit mund të shikohen duke përdorur journald.

Skedari i njësisë /etc/systemd/system/[email protected] për shërbimin systemd do të dorëzohet së bashku me paketën.

Ansible ka module të integruara për instalimin e paketave dhe menaxhimin e shërbimeve të sistemit; ne nuk kemi shpikur asgjë të re këtu.

Vendosja e një topologjie grupimi

Këtu fillon argëtimi. Pajtohem, do të ishte e çuditshme të shqetësohesh me një rol të veçantë Ansible për instalimin e paketave dhe ekzekutimin systemd-shërbimet.

Ju mund ta konfiguroni grupin manualisht:

  • Opsioni i parë: hapni Web UI dhe klikoni mbi butonat. Është mjaft i përshtatshëm për një fillim një herë të disa rasteve.
  • Opsioni i dytë: mund të përdorni GraphQl API. Këtu tashmë mund të automatizoni diçka, për shembull, të shkruani një skript në Python.
  • Opsioni i tretë (për personat me vullnet të fortë): shkoni te serveri, lidheni me një nga rastet duke përdorur tarantoolctl connect dhe kryeni të gjitha manipulimet e nevojshme me modulin Lua cartridge.

Detyra kryesore e shpikjes sonë është të bëjmë pikërisht këtë, pjesën më të vështirë të punës për ju.

Ansible ju lejon të shkruani modulin tuaj dhe ta përdorni atë në një rol. Roli ynë përdor module të tilla për të menaxhuar komponentë të ndryshëm të grupimit.

Si punon? Ju përshkruani gjendjen e dëshiruar të grupit në një konfigurim deklarativ dhe roli i siguron secilit modul seksionin e tij të konfigurimit si hyrje. Moduli merr gjendjen aktuale të grupit dhe e krahason atë me atë që është marrë si hyrje. Më pas, një kod lëshohet përmes prizës së njërit prej rasteve, i cili e sjell grupin në gjendjen e dëshiruar.

Rezultatet e

Sot ne treguam dhe treguam se si ta vendosni aplikacionin tuaj në Tarantool Cartridge dhe të vendosni një topologji të thjeshtë. Për ta bërë këtë, ne përdorëm Ansible - një mjet i fuqishëm që është i lehtë për t'u përdorur dhe ju lejon të konfiguroni njëkohësisht shumë nyje infrastrukturore (në rastin tonë, instancat e grupimeve).

Më sipër shikuam një nga mënyrat e shumta për të përshkruar një konfigurim grupi duke përdorur Ansible. Sapo të ndiheni gati për të vazhduar, eksploroni praktikat më të mira mbi shkrimin e librave lojërash. Mund ta keni më të lehtë të menaxhoni topologjinë tuaj duke përdorur group_vars и host_vars.

Shumë shpejt do t'ju tregojmë se si të fshini (përjashtoni) përgjithmonë instancat nga topologjia, të bootstrap vshard, të menaxhoni modalitetin automatik të dështimit, të konfiguroni autorizimin dhe të rregulloni konfigurimin e grupit. Ndërkohë, ju mund të studioni vetë dokumentacionin dhe eksperimentoni me ndryshimin e parametrave të grupimit.

Nëse diçka nuk funksionon, sigurohuni që me njofto ne për problemin. Ne do të rregullojmë gjithçka shpejt!

Burimi: www.habr.com

Shto një koment