Lihtsalt ja mugavalt deponeerime rakendusi Tarantool Cartridge'ile (osa 1)

Lihtsalt ja mugavalt deponeerime rakendusi Tarantool Cartridge'ile (osa 1)

Oleme juba rÀÀkinud Tarantool Cartridge, mis vĂ”imaldab arendada ja pakkida jaotatud rakendusi. JÀÀnud on veel vaid Ă”ppida, kuidas neid rakendusi juurutada ja nendega töötada. Ärge muretsege, me oleme kĂ”ik ette nĂ€inud! Oleme kokku kogunud kĂ”ik parimad tavad Tarantool Cartridge'i kasutamiseks ja kirjutanud ansible-rolle, mis paigaldab paketi serveritele, kĂ€ivitab instantsid, ĂŒhendab need klastriks, seadistab autoriseerimise, bootstrab vshard'i, lubab automaatse viivituse ja vĂ€rskendab klastri konfiguratsiooni.

Huvitav? Siis tulge edasi, rÀÀgime ja nÀitame kÔike.

Alustame nÀitest

KÀsitleme ainult osa meie rolli funktsionaalsusest. TÀieliku kirjelduse kÔikidest selle vÔimalustest ja sisendparameetritest leiate alati dokumentatsioon. Kuid parem on kord proovida, kui sada korda nÀha, seega lÀhme ja juurutame vÀikese rakenduse.

Tarantool Cartridge'il on tutvustus nÀide vÀikese Cartridge-rakenduse loomiseks, mis salvestab teavet panga klientide ja nende kontode kohta ning pakub API-t andmete haldamiseks lÀbi HTTP. Selleks kirjeldatakse rakenduses kahte vÔimalikku rolle: api ja salvestusruum, mis vÔivad omistada instantsidele.

Ise Cartridge ei ĂŒtle midagi protsesside kĂ€ivitamise kohta, ta ainult vĂ”imaldab juba kĂ€ivitatud instantside seadistamist. ÜlejÀÀnud peab kasutaja ise tegema: konfigureerimisfailid paigutama, teenuseid kĂ€ivitama ja topoloogiat seadistama. Kuid me ei pea selle kĂ”igega tegelema, Ansible teeb meie eest.

Tegemist on asjadega

Nii et juurutame meie rakenduse kahele virtuaalmasinale ja seadistame lihtsa topoloogia:

  • Replikasett app-1 rakendab rolli api, mis sisaldab rolli vshard-router. Siin on ainult ĂŒks instants.
  • Replikasett storage-1 rakendab rolli salvestusruum (ja samal ajal vshard-storage), siia lisame kaks instantsit erinevatelt masinatelt.

Lihtsalt ja mugavalt deponeerime rakendusi Tarantool Cartridge'ile (osa 1)

NÀite kÀivitamiseks vajame Vagrant ja Ansible (versioon 2.8 vÔi vanem).

Ise roll asub Ansible Galaxy. See on hoidla, mis vÔimaldab jagada oma arengutöid ja kasutada valmis rolle.

Kloonime nÀidise hoidla:

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

KĂ€ivitame virtuaalmasinad:

$ vagrant up

Paigaldame ansible-rolle Tarantool Cartridge:

$ ansible-galaxy install tarantool.cartridge,1.0.1

KĂ€ivitame paigaldatud rolli:

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

Ootame mÀnguplaani tÀitmise lÔppu, liikume edasi http://localhost:8181/admin/cluster/dashboard ja naudime tulemust:

Lihtsalt ja mugavalt deponeerime rakendusi Tarantool Cartridge'ile (osa 1)

Saame andmeid voolata. Lahe, eks?

NĂŒĂŒd hakkame aru saama, kuidas sellega töötada, ja lisame samal ajal veel ĂŒhe replikaatsarja topoloogiasse.

Hakkame uurima

Niisiis, mis juhtus?

Me tĂ”stsime ĂŒles kaks virtuaalmasinat ja jooksutasime ansiblei mĂ€ngu, mis seadistab meie klastrit. Vaatame faili sisu 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

Siin ei toimub midagi huvitavat, kÀivitame ansiblei rolli, mis nimetatakse tarantool.cartridge.

KÔik tÀhtsam (nimelt, klastrikonfiguratsioon) asub inventory-failis 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:

KÔik, mida vajame, on Ôppida hallata instantsse ja replikaatsarju, muutes selle faili sisu. Edasi lisame sellesse uusi sektsioone. Et mitte segadusse minna, kuhu neid lisada, vÔite piiluda selle faili lÔppversiooni hosts.updated.yml, mis asub nÀidisrepozitarius.

Instantside haldamine

Ansible'i terminoloogias on iga instants host (mitte segi ajada fĂŒĂŒsilise serveriga), st infrastruktuuri sĂ”lme, mida Ansible haldab. Iga hosti puhul saame mÀÀrata ĂŒhendusparameetrid (nt ansible_host ja ansible_user), ja ka instantsi konfiguratsioon. Instantside kirjeldus asub jaotises hostid.

Vaadakem instantsi konfiguratsiooni storage-1:

kÔik:
  muutuja:
    ...

  # INSTANSDID
  hostid:
    storage-1:
      konfiguratsioon:
        advertise_uri: '172.19.0.2:3301'
        http_port: 8181

  ...

Mu variables failist, saadab need andmed serverisse oleme mÀÀranud instantsi parameetrid — advertise URI ja HTTP port.
Allpool on instantside parameetrid app-1 ja storage-1-replica.

Peame Ansiblele edastama ĂŒhenduse parameetrid iga instantsi jaoks. Tundub loogiline gruppida instantsid virtuaalmasinate kaupa. Selle jaoks on instantsid grupeeritud host1 ja host2, ja igas grupis jaotises muutuja on mÀÀratud vÀÀrtused ansible_host ja ansible_user ĂŒhe virtuaalmasina jaoks. Ja jaotises hostid — hostid (mis on ka instantsid), mis kuuluvad sellesse gruppi:

kÔik:
  muutuja:
    ...
  hostid:
    ...
  lapsed:
    # GRUPPEERI INSTANSDID MASINATE KAUPA
    host1:
      muutuja:
        # esimese masina ĂŒhendamise vĂ”imalused
        ansible_host: 172.19.0.2
        ansible_user: vagrant
       hostid:  # instantsid, mis kÀivitatakse esimesel masinal
        storage-1:

     host2:
      muutuja:
        # teise masina ĂŒhendamise vĂ”imalused
        ansible_host: 172.19.0.3
        ansible_user: vagrant
       hostid:  # instantsid, mis kÀivitatakse teisel masinal
        app-1:
        storage-1-replica:

Alustame muutmist hosts.yml. Lisame veel kaks instantsi, storage-2-replica esimesel virtuaalmasinal ja storage-2 teisel:

kÔik:
  muutuja:
    ...

  # INSTANSDID
  hostid:
    ...
    storage-2:  # <==
      konfiguratsioon:
        advertise_uri: '172.19.0.3:3303'
        http_port: 8184

    storage-2-replica:  # <==
      konfiguratsioon:
        advertise_uri: '172.19.0.2:3302'
        http_port: 8185

  lapsed:
    # GRUPPEERI INSTANSDID MASINATE KAUPA
    host1:
      muutuja:
        ...
      hostid:  # instantsid, mis kÀivitatakse esimesel masinal
        storage-1:
        storage-2-replica:  # <==

    host2:
      muutuja:
        ...
      hostid:  # instantsid, mis kÀivitatakse teisel masinal
        app-1:
        storage-1-replica:
        storage-2:  # <==
  ...

KĂ€ivitage ansible-playbook:

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

Pöörake tÀhelepanu valikule --limit. Kuna iga klastrite instants on Ansible'i mÔisted host, vÔime selgelt nÀidata, milliseid instantsse tuleb seadistada playbooki kÀitamisel.

Siseneme taas Web UI-sse http://localhost:8181/admin/cluster/dashboard ja vaatame meie uusi instantsse:

Lihtsalt ja mugavalt deponeerime rakendusi Tarantool Cartridge'ile (osa 1)

Ärme jÀÀge saavutatu juurde ja Ă”ppigem tutvustama topoloogiat.

Topoloogia haldamine

Kombineerime meie uued instantsid replikakomplekti storage-2. Lisame uue grupi replicaset_storage_2 ja kirjeldame tema muutujates replikakomplekti parameetreid sarnaselt replicaset_storage_1. Sektsioonis hostid mÀÀra, millised instantsid kuuluvad sellesse gruppi (st meie replikakomplekti):

---
all:
  vars:
    ...
  hosts:
    ...
  children:
    ...
    # RÜHMA INSTANTSID KLOONIDE KAUDEL
    ...
    replicaset_storage_2:  # <==
      vars:  # replikaseti konfiguratsioon
        replicaset_alias: storage-2
        weight: 2
        failover_priority:
          - storage-2
          - storage-2-replica
        roles:
          - 'storage'

      hosts:   # replikaseti instantsid
        storage-2:
        storage-2-replica:

KÀivitame mÀnguaktiivi uuesti:

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

Parameeter --limit sellel korral edastame grupi nime, mis vastab meie replikasetile.

Vaatame valikut tags.

Meie roll tĂ€idab jĂ€rjest erinevaid ĂŒlesandeid, millel on jĂ€rgmised sildid:

  • cartridge-instances: instantside haldamine (seadistamine, ĂŒhendamine membershipiga);
  • cartridge-replicasets: topoloogia haldamine (replikasettide haldamine ja instantside pöördumatud eemaldamine (expel) klastrist);
  • cartridge-config: teiste klastriparametrite haldamine (vshard bootstrapping, automaatse failoveri reĆŸiim, autentimise parameetrid ja rakenduse konfiguratsioon).

Me saame selgesĂ”naliselt mÀÀrata, millist osa tööst tahame teha, siis roll jĂ€tab tĂ€itmata ĂŒlejÀÀnud ĂŒlesanded. Meie juhul tahame töötada ainult topoloogiaga, seega mÀÀrasime cartridge-replicasets.

Hinnakem meie pingutuste tulemust. Otsime uut replikaseti http://localhost:8181/admin/cluster/dashboard.

Lihtsalt ja mugavalt deponeerime rakendusi Tarantool Cartridge'ile (osa 1)

Jee!

Katsuge muuta instantside ja replikasettide konfiguratsiooni ja vaadake, kuidas klassi topoloogia muutub. Saate proovida erinevaid operatsiooniskeeme, nĂ€iteks rolling update vĂ”i suurendamine memtx_memory. Roll pĂŒĂŒab seda teha ilma instantsi taaskĂ€ivitamiseta, et vĂ€hendada teie rakenduse vĂ”imaliku seisaku aega.

Ärge unustage kĂ€ivitada vagrant halt, et peatada virtuaalmasinad, kui olete nendega töötamise lĂ”petanud.

Aga mis on kapoti all?

Siin kirjeldan lÀhemalt, mis toimus ansible-rolli all meie katsete ajal.

Vaatame samm-sammult, kuidas Cartridge-rakendust paigaldada.

Paketi installimine ja instantside kÀivitamine

Esiteks tuleb pakett serverisse toimetada ja see installida. Praegu oskab roll töötada RPM- ja DEB-pakettidega.

SeejÀrel kÀivitame instantsid. Siin on kÔik vÀga lihtne: iga instants on eraldi systemd-teenus. Selgitan nÀite abil:

$ systemctl start myapp@storage-1

See kÀsk kÀivitab instantsi storage-1 rakenduse myapp. KÀivitatud instants otsib oma konfiguratsiooni ja /etc/tarantool/conf.d/. Instantsi logisid saab vaadata abil journald.

Unit-fail /etc/systemd/system/myapp@.sevice systemd-teenuse jaoks toimetatakse koos paketiga.

Ansible'il on integreeritud moodulid pakettide installimiseks ja systemd teenuste haldamiseks, siin me ei ole midagi uut vÀlja mÔelnud.

Klastri topoloogia seadistamine

Siit hakkab kÔige huvitavam osa pihta. Oli ju kummaline kasutada erilist ansible-rolli pakettide installimiseks ja kÀivitamiseks systemd-teenustest.

Klastri saab seadistada kÀsitsi:

  • Esimene variant: avame Veebi kasutajaliidese ja vajutame nuppudele. Ühe korraga mitme instantsi kĂ€ivitamiseks sobib tĂ€iesti.
  • Teine variant: saate kasutada GraphQl API-d. Siin saab automatiseerida nĂ€iteks kirjutada Pythonis skripti.
  • Kolmas variant (vĂ”imsatele vaimudele): logime sisse serverisse, ĂŒhendame ĂŒhe instantsiga kasutades tarantoolctl connect ja teeme kĂ”ik vajalikud manipulatsioonid Lua mooduliga cartridge.

Meie leiutamise peamine eesmÀrk on teha just see, kÔige keerulisem osa tööst, teie eest.

Ansible vÔimaldab kirjutada oma mooduli ja kasutada seda rollis. Meie roll kasutab selliseid mooduleid klastrite erinevate komponentide haldamiseks.

Kuidas see töötab? Te kirjeldate soovitud klastriseisundit deklaratiivselt konfigureerimises, ja roll edastab igale moodulile vastava konfiguratsioonisegmendi. Moodul saab klastrist hetkeseisundi ja vĂ”rdleb seda selle sisendiga. SeejĂ€rel kĂ€ivitab ĂŒhe instantsi socketi kaudu koodi, mis viib klastrit soovitud seisundisse.

Summary

TÀna rÀÀkisime ja nÀitasime, kuidas teie rakendust Tarantool Cartridge'il kasutada ja seadistada lihtne topoloogia. Selleks kasutasime Ansible't - vÔimekat tööriista, mis on kasutamise poolest lihtne ja vÔimaldab korraga seadistada palju infrastruktuuri sÔlmi (meie puhul on need klastrite instantsid).

Ülal oleme tutvunud ĂŒhe paljude viisidega klastrikonfiguratsiooni kirjeldamiseks Ansible abil. Niipea kui olete valmis edasi liikuma, uurige best practices pleikide kirjutamiseks. VĂ”imalik, et teil on mugavam hallata topoloogiat kasutades group_vars ja host_vars.

KĂ€esoleval ajal rÀÀgime, kuidas alates klastrist jÀÀdavalt eemaldada (expel) instantsid topoloogiast, bootstrappida vshard, hallata automaatse failover'i reĆŸiimi, seadistada autoriseerimist ja patchida klastrikonfi. Ja seni vĂ”ite iseseisvalt uurida. dokumentatsioon ja katsetada klastriparameetrite muutmist.

Kui midagi ei tööta, kindlasti teatage meile probleemist. Lahendame selle kiiresti!

Allikas: habr.com

Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster