Sovellusten käyttöönotto helposti ja luonnollisesti Tarantool-kasetilla (osa 1)

Sovellusten käyttöönotto helposti ja luonnollisesti Tarantool-kasetilla (osa 1)

Olemme jo puhuneet Tarantool patruuna, jonka avulla voit kehittää hajautettuja sovelluksia ja pakata niitä. Mitään ei ole jäljellä: opi ottamaan käyttöön ja hallitsemaan näitä sovelluksia. Älä huoli, olemme ajatelleet kaiken! Olemme koonneet kaikki parhaat käytännöt Tarantool Cartridgen kanssa työskentelemiseen ja kirjoittaneet mahdollinen rooli, joka hajottaa paketin palvelimiksi, käynnistää ilmentymät, yhdistää ne klusteriksi, määrittää valtuutuksen, bootstrap vshardin, ottaa käyttöön automaattisen vikasietoisuuden ja korjaa klusterin asetukset.

Mielenkiintoista? Sitten kysyn alaspäin, kerromme ja näytämme kaiken.

Aloitetaan esimerkillä

Katamme vain osan roolimme toimivuudesta. Löydät aina täydellisen kuvauksen kaikista sen ominaisuuksista ja syöttöparametreista dokumentointi. Mutta on parempi yrittää kerran kuin nähdä sata kertaa, joten otetaan käyttöön pieni sovellus.

Tarantool-patruunassa on opetusohjelma luoda pienen Cartridge-sovelluksen, joka tallentaa tietoja pankkiasiakkaista ja heidän tileistään sekä tarjoaa API:n tietojen hallintaan HTTP:n kautta. Tätä varten sovellus kuvaa kaksi mahdollista roolia: api и storagejotka voidaan määrittää ilmentymille.

Kasetti itsessään ei kerro mitään prosessien käynnistämisestä, se tarjoaa vain mahdollisuuden määrittää jo käynnissä olevat ilmentymät. Käyttäjän tulee tehdä loput itse: hajottaa konfiguraatiotiedostot, käynnistää palvelut ja asettaa topologia. Mutta me emme tee kaikkea tätä, Ansible tekee sen puolestamme.

Sanoista tekoihin

Joten otetaan käyttöön sovelluksemme kahdelle virtuaalikoneelle ja määritetään yksinkertainen topologia:

  • Replicaset app-1 tulee näyttelemään roolia apijoka sisältää roolin vshard-router. Tässä on vain yksi tapaus.
  • replikaatti storage-1 toteuttaa roolia storage (ja samalla vshard-storage), lisäämme tähän kaksi esiintymää eri koneista.

Sovellusten käyttöönotto helposti ja luonnollisesti Tarantool-kasetilla (osa 1)

Jotta voimme suorittaa esimerkin, tarvitsemme Kulkuri и Ansible (versio 2.8 tai uudempi).

Rooli itsessään on Ansible Galaxy. Tämä on arkisto, jonka avulla voit jakaa työsi ja käyttää valmiita rooleja.

Kloonaa arkisto esimerkin avulla:

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

Kasvatamme virtuaalikoneita:

$ vagrant up

Asenna Tarantool-kasetti sopiva rooli:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Suorita asennettu rooli:

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

Odotamme pelikirjan suorittamisen loppua, siirry kohtaan http://localhost:8181/admin/cluster/dashboard ja nauti lopputuloksesta:

Sovellusten käyttöönotto helposti ja luonnollisesti Tarantool-kasetilla (osa 1)

Voit kaataa tietoja. Siistiä, eikö?

Selvitetään nyt, kuinka työskennellä tämän kanssa, ja samalla lisätään toinen kopiojoukko topologiaan.

Alamme ymmärtää

Mitä tapahtui?

Meillä on kaksi virtuaalikonetta ja käytössämme mahdollinen ohjekirja, joka perusti klusterin. Katsotaanpa tiedoston sisältöä 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

Täällä ei tapahdu mitään mielenkiintoista, aloitamme ansible-roolin, jota kutsutaan tarantool.cartridge.

Kaikki tärkeimmät (eli klusterin kokoonpano) sijaitsevat sisällä inventaario-tiedosto 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:

Tarvitsemme vain oppia hallitsemaan ilmentymiä ja kopioita muuttamalla tämän tiedoston sisältöä. Seuraavaksi lisäämme siihen uusia osioita. Jotta et joutuisi hämmennyksiin, mihin ne lisätään, voit kurkistaa tämän tiedoston lopulliseen versioon, hosts.updated.yml, joka on esimerkkiarkistossa.

Instanssien hallinta

Ansiblen kannalta jokainen esiintymä on isäntä (ei pidä sekoittaa rautapalvelimeen), ts. infrastruktuurisolmu, jota Ansible hallitsee. Jokaiselle isännälle voimme määrittää yhteysparametrit (esim ansible_host и ansible_user), sekä ilmentymän kokoonpano. Esineiden kuvaus on osiossa hosts.

Harkitse esiintymän kokoonpanoa storage-1:

all:
  vars:
    ...

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

  ...

Muuttujassa config määritimme esiintymän parametrit - advertise URI и HTTP port.
Alla on esiintymän parametrit app-1 и storage-1-replica.

Meidän on kerrottava Ansiblelle kunkin esiintymän yhteysparametrit. Näyttää loogiselta ryhmitellä esiintymät virtuaalikoneen ryhmiin. Tätä varten esiintymät yhdistetään ryhmiin. host1 и host2, ja osion jokaisessa ryhmässä vars arvot ansible_host и ansible_user yhdelle virtuaalikoneelle. Ja osiossa hosts - isännät (ne ovat esiintymiä), jotka sisältyvät tähän ryhmään:

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:

Alamme muuttua hosts.yml. Lisätään vielä kaksi tapausta, storage-2-replica ensimmäisessä virtuaalikoneessa ja storage-2 Toisessa:

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

Suorita mahdollinen pelikirja:

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

Kiinnitä huomiota vaihtoehtoon --limit. Koska jokainen klusterin ilmentymä on Ansible-termeillä isäntä, voimme nimenomaisesti määrittää, mitkä esiintymät tulee määrittää pelikirjaa suoritettaessa.

Takaisin verkkokäyttöliittymään http://localhost:8181/admin/cluster/dashboard ja tarkkaile uusia tapauksiamme:

Sovellusten käyttöönotto helposti ja luonnollisesti Tarantool-kasetilla (osa 1)

Emme jää lepäämään laakereillaan ja hallitsemme topologian hallinnan.

Topologian hallinta

Yhdistetään uudet ilmentymät replikasetiksi storage-2. Lisää uusi ryhmä replicaset_storage_2 ja kuvaa muuttujissaan replikasetin parametrit analogisesti kanssa replicaset_storage_1. Osassa hosts määritä, mitkä esiintymät sisällytetään tähän ryhmään (eli kopiosarjamme):

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

Aloitetaan pelikirja uudelleen:

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

Vaihtoehtokohtaisesti --limit ohitimme tällä kertaa replikaattiamme vastaavan ryhmän nimen.

Harkitse vaihtoehtoa tags.

Roolimme suorittaa peräkkäin erilaisia ​​tehtäviä, jotka on merkitty seuraavilla tunnisteilla:

  • cartridge-instances: ilmentymien hallinta (konfigurointi, liittyminen jäsenyyteen);
  • cartridge-replicasets: topologian hallinta (replikaattien hallinta ja ilmentymien pysyvä poistaminen (poistaminen) klusterista);
  • cartridge-config: hallitse muita klusterin parametreja (vshard bootstrapping, automaattinen vikasietotila, valtuutusparametrit ja sovelluskokoonpano).

Voimme määritellä tarkasti, minkä osan työstä haluamme tehdä, jolloin rooli ohittaa loput tehtävät. Meidän tapauksessamme haluamme työskennellä vain topologian kanssa, joten määritimme cartridge-replicasets.

Arvioidaan ponnistelujemme tulosta. Etsitään uutta replikaattia http://localhost:8181/admin/cluster/dashboard.

Sovellusten käyttöönotto helposti ja luonnollisesti Tarantool-kasetilla (osa 1)

Hurraa!

Kokeile ilmentymien ja replikaattien uudelleenmäärittämistä ja katso, miten klusterin topologia muuttuu. Voit kokeilla erilaisia ​​toimintaskenaarioita, esim. rullaava päivitys tai lisätä memtx_memory. Rooli yrittää tehdä tämän käynnistämättä ilmentymää uudelleen lyhentääkseen sovelluksesi mahdollista seisonta-aikaa.

Älä unohda juosta vagrant haltpysäyttääksesi virtuaalikoneet, kun olet lopettanut niiden käytön.

Mitä konepellin alla on?

Täällä kerron lisää siitä, mitä tapahtui ansiblen roolin alla kokeidemme aikana.

Katsotaanpa kasettisovelluksen käyttöönottoa vaihe vaiheelta.

Paketin asennus ja ilmentymien käynnistäminen

Ensin sinun on toimitettava paketti palvelimelle ja asennettava se. Nyt rooli voi toimia RPM- ja DEB-pakettien kanssa.

Seuraavaksi käynnistämme esiintymät. Kaikki on täällä hyvin yksinkertaista: jokainen esiintymä on erillinen systemd-palvelu. Puhun esimerkistä:

$ systemctl start myapp@storage-1

Tämä komento käynnistää ilmentymän storage-1 приложения myapp. Käynnistetty ilmentymä etsii sen kokoonpano в /etc/tarantool/conf.d/. Instanssilokeja voi tarkastella käyttämällä journald.

Yksikkötiedosto /etc/systemd/system/[email protected] järjestelmäpalvelulle toimitetaan paketin mukana.

Ansiblessa on sisäänrakennetut moduulit pakettien asentamiseen ja järjestelmäpalvelujen hallintaan, emme ole keksineet mitään uutta täällä.

Klusterin topologian määrittäminen

Ja tästä alkaa mielenkiintoisin. Samaa mieltä, olisi outoa vaivautua erityiseen mahdolliseen rooliin pakettien asentamiseen ja suorittamiseen systemd-palvelut.

Voit määrittää klusterin manuaalisesti:

  • Ensimmäinen vaihtoehto: avaa verkkokäyttöliittymä ja napsauta painikkeita. Se on varsin sopiva useiden tapausten kertakäynnistykseen.
  • Toinen vaihtoehto: voit käyttää GraphQl API:ta. Täällä voit jo automatisoida jotain, esimerkiksi kirjoittaa skriptin Pythonissa.
  • Kolmas vaihtoehto (vahville henkisille): mene palvelimelle, muodosta yhteys johonkin käyttävistä instansseista tarantoolctl connect ja suorita kaikki tarvittavat käsittelyt Lua-moduulilla cartridge.

Keksintömme päätehtävä on tehdä tämä, työn vaikein osa sinulle.

Ansible antaa sinun kirjoittaa oman moduulisi ja käyttää sitä roolissa. Roolimme käyttää näitä moduuleja klusterin eri komponenttien hallintaan.

Kuinka se toimii? Kuvaat klusterin halutun tilan deklaratiivisessa konfiguraatiossa, ja rooli antaa jokaiselle moduulille sen määritysosion syötteenä. Moduuli vastaanottaa klusterin nykyisen tilan ja vertaa sitä tuloon. Seuraavaksi koodi ajetaan yhden ilmentymän socketin läpi, joka tuo klusterin haluttuun tilaan.

Tulokset

Tänään kerroimme ja näytimme, kuinka voit ottaa sovelluksesi käyttöön Tarantool Cartridgessa ja määrittää yksinkertaisen topologian. Tätä varten käytimme Ansiblea, tehokasta työkalua, jota on helppo käyttää ja jonka avulla voit määrittää samanaikaisesti useita infrastruktuurisolmuja (meidän tapauksessamme nämä ovat klusteriesiintymiä).

Yllä käsittelimme yhtä monista tavoista kuvata klusterin kokoonpanoa Ansiblen avulla. Kun tiedät, että olet valmis jatkamaan, opi parhaat käytännöt leikkikirjojen kirjoittamiseen. Saatat olla helpompaa hallita topologiaa group_vars и host_vars.

Hyvin pian kerromme sinulle kuinka poistaa (poistaa) ilmentymiä pysyvästi topologiasta, bootstrap vshard, hallita automaattista vikasietotilaa, määrittää valtuutus ja korjata klusterin konfiguraatio. Sillä välin voit opiskella itsenäisesti dokumentointi ja kokeile klusterin parametrien muuttamista.

Jos jokin ei toimi, varmista ilmoittaa meille ongelmasta. Puretaan se nopeasti!

Lähde: will.com

Lisää kommentti