Lehtë dhe qetësisht në deploy aplikacione në Tarantool Cartridge (pjesa 1)

Lehtë dhe qetësisht në deploy aplikacione në Tarantool Cartridge (pjesa 1)

Ne kemi folur tashmë për Tarantool Cartridge, i cili lejon zhvillimin e aplikacioneve të shpërndara dhe paketimin e tyre. Ka mbetur vetëm një hap: të mësoni si të depozitoni këto aplikacione dhe t'i menaxhoni ato. Mos u shqetësoni, ne e kemi parashikuar gjithçka! Kemi mbledhur së bashku të gjitha praktikat më të mira për punën me Tarantool Cartridge dhe kemi shkruar ansible-rolin, i cili do të shpërndajë paketën në servera, do të nxisë instancat, do t'i bashkojë ato në një klaster, do të konfigurojë autorizimin, do të zbatojë vshard, do të aktivizojë automatizmin e dështimit dhe do të përditësojë konfigurimin e klasterit.

Interesant? Atëherë ju lutem vijoni poshtë, ne do t'ju tregojmë gjithçka.

Le të fillojmë me një shembull

Do të shqyrtojmë vetëm një pjesë të funksionalitetit të rolit tonë. Përshkrimi i plotë i të gjitha mundësive dhe parametrave të tij hyrës mund të gjendet gjithmonë në dokumentacion. Por është më mirë ta provoni një herë sesa ta shihni njëqind herë, prandaj le të depozojmë një aplikacion të vogël.

Tarantool Cartridge ka tutorialin për krijimin e një aplikacioni të vogël Cartridge, i cili ruan informacion në lidhje me klientët e bankës dhe llogaritë e tyre, si dhe ofron API për menaxhimin e të dhënave përmes HTTP. Për këtë, aplikacioni përshkruan dy role të mundshme: api dhe storage, të cilat mund të caktohen për instancat.

Cartridge nuk nuk thotë se si të nisin proceset, ai thjesht ofron mundësinë për të konfigurimin e instancave të tashme. Pjesa tjetër përdoruesi duhet ta bëjë vetë: të vendosë skedarët e konfigurimit, të nisin shërbimet dhe të konfigurojë topologjinë. Por ne nuk do të angazhohemi në këtë, do ta bëjë Ansible për ne.

Nga fjalët në veprim

Tani, do ta vendosim aplikacionin tonë në dy virtuale dhe do të konfigurojmë një topologji të thjeshtë:

  • Replicaset app-1 do të realizojë rolin api, që përfshin rolin vshard-router. Këtu do të ketë vetëm një instancë.
  • Replicaset storage-1 realizon rolin storage (dhe njëkohësisht vshard-storage), këtu do të shtojmë dy instanca nga makina të ndryshme.

Lehtë dhe qetësisht në deploy aplikacione në Tarantool Cartridge (pjesa 1)

Për të filluar shembullin, do të na duhen Vagrant dhe Ansible (versionet 2.8 ose më të vjetra).

Roli vetë ndodhet në Ansible Galaxy. Ky është një depo që lejon ndarjen e punëve të tua dhe përdorimin e rolëve të gatshme.

Klonojmë depozitat me shembullin:

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

Nisim virtualet:

$ vagrant up

Instalojmë ansible-rolin Tarantool Cartridge:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Nisim rolin e instaluar:

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

Presim të përfundojë ekzekutimi i playbook-ut, kalojmë në http://localhost:8181/admin/cluster/dashboard dhe shijojmë rezultatin:

Lehtë dhe qetësisht në deploy aplikacione në Tarantool Cartridge (pjesa 1)

Mund të fillojmë të dërgojmë të dhëna. Super, apo jo?

Tani le të kuptojmë si të punojmë me këtë dhe njëkohësisht të shtojmë një replikaset në topologji.

Nisim të kuptojmë

Pra, çfarë ndodhi?

Ne ngritëm dy makina virtuale dhe e çeluam playbook-un ansible, i cili konfiguronte klasterin tonë. Le të shikojmë 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

Këtu nuk ndodh asgjë interesante, nisim rolin ansible, i cili quhet tarantool.cartridge.

Të gjitha gjërat më të rëndësishme (në veçanti, konfigurimi i klasterit) ndodhen në inventory-skedarin hosts.yml:

---
all:
  vars:
    # variablat e zakonshme të klastrit
    cartridge_app_name: getting-started-app
    cartridge_package_path: ./getting-started-app-1.0.0-0.rpm  # rruga drejt paketës

    cartridge_cluster_cookie: app-default-cookie  # cookies e klastrit

    # opsionet e zakonshme ssh
    ansible_ssh_private_key_file: ~/.vagrant.d/insecure_private_key
    ansible_ssh_common_args: '-o IdentitiesOnly=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

  # INSTANCET
  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:
    # GRUPONI INSTANCET SIPAS MASHINAVE
    host1:
      vars:
        # opsionet e lidhjes për makinën e parë
        ansible_host: 172.19.0.2
        ansible_user: vagrant

      hosts:  # instancat që do të fillojnë në makinën e parë
        storage-1:

    host2:
      vars:
        # opsionet e lidhjes për makinën e dytë
        ansible_host: 172.19.0.3
        ansible_user: vagrant

      hosts:  # instancat që do të fillojnë në makinën e dytë
        app-1:
        storage-1-replica:

    # GRUPONI INSTANCET SIPAS SETEVE TE REPLIKAVE
    replicaset_app_1:
      vars:  # konfigurimi i grupit të replikave
        replicaset_alias: app-1
        failover_priority:
          - app-1  # lideri
        roles:
          - 'api'

      hosts:  # instancat e grupit të replikave
        app-1:

    replicaset_storage_1:
      vars:  # konfigurimi i grupit të replikave
        replicaset_alias: storage-1
        weight: 3
        failover_priority:
          - storage-1  # lideri
          - storage-1-replica
        roles:
          - 'storage'

      hosts:   # instancat e grupit të replikave
        storage-1:
        storage-1-replica:

E gjithë çka që na nevojitet është të mësojmë si të menaxhojmë instancat dhe replikaset, duke ndryshuar përmbajtjen e këtij skedari. Më pas do të shtojmë seksione të reja në të. Për të mos u confuzuar se ku t'i shtojmë, mund të shikoni në versionin përfundimtar të këtij skedari, hosts.updated.yml, i cili ndodhet në depozitat e shembujve.

Menaxhimi i instancave

Në terminologjinë e Ansible, çdo instancë është një host (mos e ngatërroni me serverin fizik), dmth. një nyje infrastrukturore, të cilin Ansible do ta menaxhojë. Për çdo host, ne mund të specifikojmë parametrat e lidhjes (siç janë ansible_host dhe ansible_user), si dhe konfigurimin e instancës. Përshkrimi i instancave ndodhet në seksionin hosts.

Le të shqyrtojmë konfigurimin e instancës storage-1:

all:
  vars:
    ...

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

  ...

Në variablën config ne kemi specifikuar parametrat e instancës — advertise URI dhe HTTP port.
Më poshtë ndodhen parametrat e instancave app-1 dhe storage-1-replica.

Na nevojitet të njoftojmë Ansible parametrat e lidhjes për secilën instancë. Duket logjike të grupojmë instancat sipas makinerive virtuale. Për këtë, instancat janë bashkuar në grupe host1 dhe host2, dhe në çdo grup në seksionin vars janë specifikuar vlerat ansible_host dhe ansible_user për një virtuale. Dhe në seksionin hosts — hostet (ato janë instanca) që përfshihen në këtë grup:

all:
  vars:
    ...
  hosts:
    ...
  children:
    # GRUPONI INSTANCAT SIPAS MASHINAVE
    host1:
      vars:
        # mundësitë e lidhjes për makinën e parë
        ansible_host: 172.19.0.2
        ansible_user: vagrant
       hosts:  # instancat që do të nisin në makinën e parë
        storage-1:

     host2:
      vars:
        # mundësitë e lidhjes për makinën e dytë
        ansible_host: 172.19.0.3
        ansible_user: vagrant
       hosts:  # instancat që do të nisin në makinën e dytë
        app-1:
        storage-1-replica:

Të fillojmë të ndryshojmë hosts.yml. Le të shtojmë edhe dy instanca, storage-2-replica në virtualen e parë dhe storage-2 në të dytën:

all:
  vars:
    ...

  # INSTANCAT
  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:
    # GRUPONI INSTANCAT SIPAS MASHINAVE
    host1:
      vars:
        ...
      hosts:  # instancat që do të nisin në makinën e parë
        storage-1:
        storage-2-replica:  # <==

    host2:
      vars:
        ...
      hosts:  # instancat që do të nisin në makinën e dytë
        app-1:
        storage-1-replica:
        storage-2:  # <==
  ...

Po nisim ansible-playbook:

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

Kujdesi për opsionin --limit. Duke çdo instancë e grupit është një host në kuptimin e Ansible, ne mund ta spesifikojmë me qartë se cilat instanca duhet të konfigurohen gjatë ekzekutimit të playbook-ut.

Përsëri hyjmë në Web UI http://localhost:8181/admin/cluster/dashboard dhe vëzhgojmë instancat tona të reja:

Lehtë dhe qetësisht në deploy aplikacione në Tarantool Cartridge (pjesa 1)

Nuk do të ndalemi këtu dhe do të mësojmë si të menaxhojmë topologjinë.

Menaxhimi i topologjisë

Të bashkojmë instancat tona të reja në një replicasët storage-2. Të shtojmë një grup të ri replicaset_storage_2 dhe ta përshkruajmë në variablat e saj parametrat e replicasët në mënyrë të ngjashme me replicaset_storage_1. Në seksionin hosts të tregojmë se cilat instanca do të përfshihen në këtë grup (dmth replicasët tonë):

---
all:
  vars:
    ...
  hosts:
    ...
  children:
    ...
    # GRUPONI INSTANCAT SIPAS REPLICA SETS
    ...
    replicaset_storage_2:  # <==
      vars:  # konfigurimi i replicasët
        replicaset_alias: storage-2
        weight: 2
        failover_priority:
          - storage-2
          - storage-2-replica
        roles:
          - 'storage'

      hosts:   # instancat e replicasët
        storage-2:
        storage-2-replica:

Përsëri e nisëm playbook-un:

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

Në parametrin --limit këtë herë kemi kaluar emrin e grupit që korrespondon me replicasët tonë.

Le të shqyrtojmë opsionin tags.

Roli ynë përmbush vazhdimisht detyra të ndryshme që shënohen me etiketat e mëposhtme:

  • cartridge-instances: menaxhimi i instancave (konfigurimi, lidha me anëtarësimin);
  • cartridge-replicasets: menaxhimi i topologjisë (menaxhimi i replika grupeve dhe heqja e pakthyeshme (expel) e instancave nga klasteri);
  • cartridge-config: menaxhimi i parametrave të tjerë të klasterit (vshard bootstrapping, moda e automatik të dështimit, parametrat e autorizimit dhe konfigurimi i aplikacionit).

Mund të specifikojmë qartë se cilën pjesë të punës dëshirojmë të bëjmë, atëherë roli do të kalojë përpara në realizimin e detyrave të tjera. Në rastin tonë, duam të punojmë vetëm me topologjinë, prandaj kemi shënuar cartridge-replicasets.

Le të vlerësojmë rezultatin e përpjekjeve tona. Gjejmë një grup të ri replika në http://localhost:8181/admin/cluster/dashboard.

Lehtë dhe qetësisht në deploy aplikacione në Tarantool Cartridge (pjesa 1)

Hurrah!

Eksperimentoni me ndryshimin e konfigurimeve të instancave dhe grupeve replika dhe shihni se si ndryshon topologjia e klasterit. Mund të provoni skenarë të ndryshëm operativë, si p.sh. përditësim të vazhdueshëm ose rritje memtx_memory. Roli do të përpiqet ta bëjë këtë pa rinisjen e instancës, për të zvogëluar mundësinë e downtime-it të aplikacionit tuaj.

Mos harroni të filloni vagrant halt, për të ndaluar virtualet kur përfundoni me to.

Çfarë ndodhet nën kapak?

Këtu do të flas më shumë rreth asaj që ndodhte nën kapak gjatë eksperimenteve tona me rolin ansible.

Le të shqyrtojmë hapat e zhvillimit të aplikacionit Cartridge.

Instalimi i paketës dhe fillimi i instancave

Së pari, duhet të dërgoni paketën në server dhe ta instaloni atë. Tani roli di të punojë me paketat RPM dhe DEB.

Pastaj, fillojmë instancat. Këtu gjërat janë shumë të thjeshta: çdo instancë është një systemd-shërbim. Po jap një shembull:

$ systemctl start myapp@storage-1

Kjo komandë do të nisë instancën storage-1 aplikacione myapp. Instanca e nisur do të kërkojë konfigurimit/etc/tarantool/conf.d/. Logs e instancës mund të shihen përmes journald.

Skedari i njësisë /etc/systemd/system/myapp@.sevice për shërbimin systemd do të dërgohet së bashku me paketën.

Ansible ka module të ndërtuara për instalimin e paketave dhe menaxhimin e shërbimeve systemd, këtu nuk kemi shpikur asgjë të re.

Konfigurimi i topologjisë së klasterit

Këtu fillon e gjithë argëtimi. Priteni, do të ishte çuditshme të keni një rol të veçantë ansible për instalimin e paketave dhe fillimin e systemd-shërbimeve.

Klasterin mund ta konfiguroni manualisht:

  • Opsioni i parë: hapim Web UI dhe shtypim butonat. Për një fillim të vetëm të disa instancave, është plotësisht i përshtatshëm.
  • Opsioni i dytë: mund të përdorim GraphQL API. Këtu mund të automatizojmë diçka, për shembull, të shkruajmë një skript në Python.
  • Opsioni i tretë (për ata më të fortët): hyjmë në server, lidhemi me një nga instancat përmes tarantoolctl connect dhe bëjmë të gjitha manipulimet e nevojshme me modulin Lua cartridge.

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

Ansible lejon të shkruhet moduli juaj dhe ta përdorni atë në rolin tuaj. Roli ynë përdor këta module për të menaxhuar komponentët e ndryshëm të klasterit.

Si funksionon kjo? Ju përshkruani gjendjen e dëshiruar të klasterit në një konfigurim deklarativ, dhe roli u jep secilit moduli seksionin e tij të konfigurimit. Moduli merr gjendjen aktuale të klasterit dhe e krahasohet me atë që ka ardhur në input. Pastaj, përmes socket-it të njërit prej instancave, fillohet kodi që e çon klasterin në gjendjen e dëshiruar.

Përfundimet

Sot treguam dhe treguam se si të vendosni aplikacionin tuaj në Tarantool Cartridge dhe të konfiguroni një topologji të thjeshtë. Për këtë, përdorëm Ansible — një mjet të fuqishëm, i njohur për thjeshtësinë e tij të përdorimit dhe lejon konfigurimin e shumë nyjeve të infrastrukturës në të njëjtën kohë (në rastin tonë, këto janë instancat e klasës).

Më sipër, e shqyrtuam një nga shumë mënyrat e përshkrimit të konfiguracionit të klasës përmes Ansible. Sa herë që të kuptoni se jeni gati të shkoni përpara, shqyrtoni praktikat më të mira për të shkruar playbooks. Ndoshta do t'ju jetë më lehtë të menaxhoni topologjinë me anë të group_vars dhe host_vars.

Shumë shpejt do t'ju tregojmë se si të fshini pa kthim (expel) instancat nga topologjia, si të bootstroni vshard, si të menaxhoni modalitetin e automatik të failover-it, të konfiguroni autorizimin dhe të patch-oni konfigurimin e klasës. Ndërkohë, mund të eksploroni dhe të eksperimentoni me ndryshimin e parameterëve të klasës. dokumentacioni и экспериментировать с изменением параметров кластера.

Nëse diçka nuk funksionon, sigurohuni që të na njoftoni për problem. Ne do ta zgjidhim shpejt!

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster