Lako i prirodno postavljanje aplikacija na Tarantool Cartridge (1. dio)

Lako i prirodno postavljanje aplikacija na Tarantool Cartridge (1. dio)

Već smo razgovarali o tome Tarantool Cartridge, koji vam omogućava da razvijete distribuirane aplikacije i pakujete ih. Ništa više nije ostalo: naučite kako da implementirate i upravljate ovim aplikacijama. Ne brinite, mislili smo na sve! Sastavili smo sve najbolje prakse za rad sa Tarantool Cartridge-om i napisali ansible-role, koji će dekomponovati paket na servere, pokrenuti instance, kombinovati ih u klaster, konfigurisati autorizaciju, bootstrap vshard, omogućiti automatski prelazak na grešku i zakrpiti konfiguraciju klastera.

Zanimljivo? Onda pitam ispod reza, sve ćemo ispričati i pokazati.

Počnimo s primjerom

Pokriti ćemo samo dio funkcionalnosti naše uloge. Kompletan opis svih njegovih karakteristika i ulaznih parametara uvijek možete pronaći u dokumentaciju. Ali bolje je pokušati jednom nego vidjeti stotinu puta, pa hajde da implementiramo malu aplikaciju.

Tarantool Cartridge ima tutorial da kreirate malu aplikaciju Cartridge koja pohranjuje informacije o klijentima banke i njihovim računima, a također pruža API za upravljanje podacima putem HTTP-a. Da biste to učinili, aplikacija opisuje dvije moguće uloge: api и storagekoji se mogu dodijeliti instancama.

Sam Cartridge ne govori ništa o tome kako pokrenuti procese, već samo pruža mogućnost konfiguriranja već pokrenutih instanci. Ostalo korisnik mora učiniti sam: dekomponirati konfiguracijske datoteke, pokrenuti usluge i postaviti topologiju. Ali mi nećemo sve ovo učiniti, Ansible će to učiniti umjesto nas.

Od riječi do djela

Dakle, hajde da postavimo našu aplikaciju na dve virtuelne mašine i postavimo jednostavnu topologiju:

  • Replicaset app-1 će igrati ulogu apišto uključuje ulogu vshard-router. Ovdje će biti samo jedan primjer.
  • replicaset storage-1 implementira ulogu storage (i u isto vreme vshard-storage), ovdje dodajemo dvije instance sa različitih mašina.

Lako i prirodno postavljanje aplikacija na Tarantool Cartridge (1. dio)

Za pokretanje primjera nam je potrebno Vagrant и Ansible (verzija 2.8 ili novija).

Sama uloga jeste Ansible Galaxy. Ovo je spremište koje vam omogućava da dijelite svoj rad i koristite gotove uloge.

Klonirajte spremište s primjerom:

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

Podižemo virtuelne mašine:

$ vagrant up

Instalirajte ansible ulogu Tarantool Cartridgea:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Pokrenite instaliranu ulogu:

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

Čekamo kraj izvođenja knjige, idite na http://localhost:8181/admin/cluster/dashboard i uživajte u rezultatu:

Lako i prirodno postavljanje aplikacija na Tarantool Cartridge (1. dio)

Možete sipati podatke. Cool, zar ne?

Sada hajde da shvatimo kako da radimo sa ovim i da u isto vreme dodamo još jedan skup replika u topologiju.

Počinjemo da razumemo

Šta se desilo?

Postavili smo dva VM-a i pokrenuli ansible playbook koji je postavio naš klaster. Pogledajmo sadržaj datoteke 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

Ovdje se ne događa ništa zanimljivo, pokrećemo ansible-ulogu, koja se zove tarantool.cartridge.

Sve najvažnije (naime, konfiguracija klastera) nalazi se u inventar-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:

Sve što trebamo je naučiti kako upravljati instancama i skupovima replika mijenjanjem sadržaja ove datoteke. Zatim ćemo mu dodati nove sekcije. Kako ne biste bili zbunjeni gdje ih dodati, možete zaviriti u konačnu verziju ovog fajla, hosts.updated.yml, koji se nalazi u spremištu primjera.

Upravljanje instancama

U smislu Ansiblea, svaka instanca je host (ne treba se brkati sa željeznim serverom), tj. infrastrukturni čvor kojim će Ansible upravljati. Za svaki host možemo specificirati parametre veze (npr ansible_host и ansible_user), kao i konfiguraciju instance. Opis slučajeva nalazi se u odjeljku hosts.

Razmotrite konfiguraciju instance storage-1:

all:
  vars:
    ...

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

  ...

U varijablu config specificirali smo parametre instance - advertise URI и HTTP port.
Ispod su parametri instance app-1 и storage-1-replica.

Moramo reći Ansibleu parametre veze za svaku instancu. Čini se logičnim grupirati instance u grupe virtuelnih mašina. Da biste to učinili, instance se kombiniraju u grupe. host1 и host2, iu svakoj grupi u odjeljku vars vrijednosti ansible_host и ansible_user za jednu virtuelnu mašinu. I u sekciji hosts - hostovi (oni su instance) koji su uključeni u ovu grupu:

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:

Počinjemo da se menjamo hosts.yml. Dodajmo još dvije instance, storage-2-replica na prvoj virtuelnoj mašini i storage-2 na drugom:

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

Pokreni ansible playbook:

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

Obratite pažnju na opciju --limit. Pošto je svaka instanca klastera domaćin u Ansible terminima, možemo eksplicitno odrediti koje instance treba konfigurisati kada se pokreće playbook.

Povratak na web korisničko sučelje http://localhost:8181/admin/cluster/dashboard i pogledajte naše nove instance:

Lako i prirodno postavljanje aplikacija na Tarantool Cartridge (1. dio)

Nećemo ostati na lovorikama i savladaćemo kontrolu topologije.

Upravljanje topologijom

Hajde da spojimo naše nove instance u skup replika storage-2. Dodajte novu grupu replicaset_storage_2 i opisati u svojim varijablama parametre skupa replika po analogiji sa replicaset_storage_1. U sekciji hosts navedite koje će instance biti uključene u ovu grupu (tj. naš skup replika):

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

Počnimo ponovo sa igrokazom:

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

Po opciji --limit ovaj put smo proslijedili ime grupe koja odgovara našem skupu replika.

Razmotrite opciju tags.

Naša uloga uzastopno obavlja različite zadatke, koji su označeni sljedećim oznakama:

  • cartridge-instances: upravljanje instancama (konfiguracija, povezivanje sa članstvom);
  • cartridge-replicasets: upravljanje topologijom (upravljanje skupovima replika i trajno uklanjanje (izbacivanje) instanci iz klastera);
  • cartridge-config: upravlja drugim parametrima klastera (vshard bootstrapping, automatski način prelaska na grešku, parametri autorizacije i konfiguracija aplikacije).

Možemo eksplicitno odrediti koji dio posla želimo obaviti, tada će uloga preskočiti ostale zadatke. U našem slučaju želimo da radimo samo sa topologijom, pa smo precizirali cartridge-replicasets.

Ocijenimo rezultat naših napora. Pronalaženje novog skupa replika http://localhost:8181/admin/cluster/dashboard.

Lako i prirodno postavljanje aplikacija na Tarantool Cartridge (1. dio)

Ura!

Eksperimentirajte s rekonfiguracijom instanci i skupova replika i pogledajte kako se mijenja topologija klastera. Možete isprobati različite operativne scenarije, npr. tekuće ažuriranje ili povećati memtx_memory. Uloga će pokušati to učiniti bez ponovnog pokretanja instance kako bi smanjila moguće vrijeme zastoja vaše aplikacije.

Ne zaboravi da trčiš vagrant haltda zaustavite VM-ove kada završite s njima.

Šta je ispod haube?

Ovdje ću govoriti više o tome šta se dešavalo ispod haube ansible uloge tokom naših eksperimenata.

Pogledajmo korak po korak implementaciju aplikacije Cartridge.

Instaliranje paketa i pokretanje instanci

Prvo morate isporučiti paket na server i instalirati ga. Sada uloga može raditi sa RPM i DEB paketima.

Zatim pokrećemo instance. Ovdje je sve vrlo jednostavno: svaka instanca je zasebna systemd-servis. Govorim o primjeru:

$ systemctl start myapp@storage-1

Ova komanda će pokrenuti instancu storage-1 aplikacije myapp. Pokrenuta instanca će je potražiti konfiguraciju в /etc/tarantool/conf.d/. Dnevnici instance se mogu pregledati pomoću journald.

Jedinični fajl /etc/systemd/system/[email protected] za sistemsku uslugu će biti isporučen sa paketom.

Ansible ima ugrađene module za instalaciju paketa i upravljanje systemd servisima, ovdje nismo izmislili ništa novo.

Konfiguriranje topologije klastera

I tu počinje ono najzanimljivije. Slažem se, bilo bi čudno zamarati se posebnom ansible-ulogom za instaliranje paketa i pokretanje systemd-usluge.

Klaster možete postaviti ručno:

  • Prva opcija: otvorite Web UI i kliknite na dugmad. Za jednokratno pokretanje nekoliko slučajeva, sasvim je prikladno.
  • Druga opcija: možete koristiti GraphQl API. Ovdje već možete nešto automatizirati, na primjer, napisati skriptu u Pythonu.
  • Treća opcija (za jake duhom): idite na server, povežite se na jednu od instanci koristeći tarantoolctl connect i izvršite sve potrebne manipulacije sa Lua modulom cartridge.

Glavni zadatak našeg izuma je da uradimo ovaj, najteži dio posla za vas.

Ansible vam omogućava da napišete vlastiti modul i koristite ga u ulozi. Naša uloga koristi ove module za upravljanje različitim komponentama klastera.

Kako radi? Vi opisujete željeno stanje klastera u deklarativnoj konfiguraciji, a uloga svakom modulu daje njegov odjeljak za konfiguraciju kao ulaz. Modul prima trenutno stanje klastera i upoređuje ga sa ulazom. Zatim se kroz soket jedne od instanci izvodi kod, koji dovodi klaster u željeno stanje.

Ishodi

Danas smo rekli i pokazali kako da implementirate svoju aplikaciju na Tarantool Cartridge i postavite jednostavnu topologiju. Da bismo to učinili, koristili smo Ansible, moćan alat koji je jednostavan za korištenje i koji vam omogućava da istovremeno konfigurirate mnoge infrastrukturne čvorove (u našem slučaju to su instance klastera).

Iznad smo se pozabavili jednim od mnogih načina za opisivanje konfiguracije klastera koristeći Ansible. Kada saznate da ste spremni da krenete dalje, učite najbolje prakse za pisanje knjiga. Možda će vam biti zgodnije upravljati topologijom group_vars и host_vars.

Vrlo brzo ćemo vam reći kako da trajno uklonite (izbacite) instance iz topologije, bootstrap vshard, upravljate automatskim načinom prelaska na greške, konfigurirate autorizaciju i zakrpite konfiguraciju klastera. U međuvremenu, možete sami učiti dokumentaciju i eksperimentirati s promjenom parametara klastera.

Ako nešto ne radi, budite sigurni informisati nas o problemu. Brzo ćemo ga razbiti!

izvor: www.habr.com

Dodajte komentar