Lengvas ir natūralus programų diegimas Tarantool kasetėje (1 dalis)

Lengvas ir natūralus programų diegimas Tarantool kasetėje (1 dalis)

Mes jau kalbėjome apie Tarantool kasetė, kuri leidžia kurti paskirstytas programas ir jas supakuoti. Nieko neliko: išmokite įdiegti ir valdyti šias programas. Nesijaudink, mes apie viską pagalvojome! Surinkome visą geriausią darbo su Tarantool Cartridge praktiką ir parašėme galimas vaidmuo, kuris išskaidys paketą į serverius, paleis egzempliorius, sujungs juos į klasterį, sukonfigūruos autorizaciją, įkrovos vshardą, įjungs automatinį failų perkėlimą ir pataisys klasterio konfigūraciją.

Įdomus? Tada paklausiu po pjūviu, viską papasakosime ir parodysime.

Pradėkime nuo pavyzdžio

Mes apimsime tik dalį savo vaidmens funkcijų. Visada galite rasti išsamų visų jo funkcijų ir įvesties parametrų aprašymą dokumentacija. Tačiau geriau pabandyti vieną kartą, nei pamatyti šimtą kartų, todėl įdiegkime nedidelę programą.

Tarantool kasetė turi pamoka sukurti nedidelę Kasetės aplikaciją, kurioje būtų saugoma informacija apie banko klientus ir jų sąskaitas, taip pat pateikiama API duomenų tvarkymui per HTTP. Norėdami tai padaryti, programoje aprašomi du galimi vaidmenys: api и storagekuriuos galima priskirti egzemplioriams.

Pati kasetė nieko nesako apie tai, kaip pradėti procesus, tik suteikia galimybę konfigūruoti jau veikiančius egzempliorius. Visa kita vartotojas turi padaryti pats: išskaidyti konfigūracijos failus, paleisti paslaugas ir nustatyti topologiją. Bet mes viso to nepadarysime, Ansible padarys tai už mus.

Nuo žodžių prie darbų

Taigi, įdiegkime savo programą dviejose virtualiose mašinose ir nustatykime paprastą topologiją:

  • Replicaset app-1 atliks vaidmenį apikuri apima vaidmenį vshard-router. Čia bus tik vienas atvejis.
  • replikatas storage-1 įgyvendina vaidmenį storage (ir tuo pačiu vshard-storage), čia pridedame du egzempliorius iš skirtingų mašinų.

Lengvas ir natūralus programų diegimas Tarantool kasetėje (1 dalis)

Norėdami paleisti pavyzdį, mums reikia Vagrant и Galimas (2.8 ar naujesnė versija).

Pats vaidmuo yra Ansible Galaxy. Tai saugykla, leidžianti dalytis savo darbais ir naudoti paruoštus vaidmenis.

Klonuokite saugyklą naudodami pavyzdį:

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

Mes keliame virtualias mašinas:

$ vagrant up

Įdiekite galimą Tarantool kasetę:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Vykdykite įdiegtą vaidmenį:

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

Laukiame žaidimo knygos vykdymo pabaigos, eikite į http://localhost:8181/admin/cluster/dashboard ir mėgaukitės rezultatu:

Lengvas ir natūralus programų diegimas Tarantool kasetėje (1 dalis)

Galite įvesti duomenis. Šaunu, tiesa?

Dabar išsiaiškinkime, kaip su tuo dirbti, ir tuo pačiu metu į topologiją įtraukite kitą kopijų rinkinį.

Pradedame suprasti

Taigi, kas atsitiko?

Sukūrėme dvi virtualiąsias mašinas ir paleidome galimą žaidimų knygą, kuri sukūrė mūsų grupę. Pažiūrėkime į failo turinį 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

Čia nieko įdomaus nevyksta, pradedame ansible-role, kuris vadinamas tarantool.cartridge.

Visa svarbiausia (būtent klasterio konfigūracija) yra inventorius-failas 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:

Viskas, ko mums reikia, yra išmokti valdyti egzempliorius ir kopijas keičiant šio failo turinį. Toliau į jį pridėsime naujų skyrių. Kad nesusipainiotumėte, kur juos pridėti, galite žvilgtelėti į galutinę šio failo versiją, hosts.updated.yml, kuri yra pavyzdžių saugykloje.

Instancijų valdymas

Kalbant apie Ansible, kiekvienas egzempliorius yra hostas (nepainioti su geležiniu serveriu), t.y. infrastruktūros mazgas, kurį valdys Ansible. Kiekvienam kompiuteriui galime nurodyti ryšio parametrus (pvz., ansible_host и ansible_user), taip pat egzemplioriaus konfigūraciją. Atvejų aprašymas yra skyriuje hosts.

Apsvarstykite egzemplioriaus konfigūraciją storage-1:

all:
  vars:
    ...

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

  ...

Kintamajame config mes nurodėme egzemplioriaus parametrus - advertise URI и HTTP port.
Žemiau pateikiami egzempliorių parametrai app-1 и storage-1-replica.

Turime pasakyti Ansible kiekvieno atvejo ryšio parametrus. Atrodo logiška sugrupuoti egzempliorius į virtualių mašinų grupes. Norėdami tai padaryti, egzemplioriai sujungiami į grupes. host1 и host2, ir kiekvienoje skyriaus grupėje vars vertybes ansible_host и ansible_user vienai virtualiai mašinai. Ir skyriuje hosts - prieglobos (tai yra egzemplioriai), kurie yra įtraukti į šią 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:

Mes pradedame keistis hosts.yml. Pridėkime dar du atvejus, storage-2-replica pirmoje virtualioje mašinoje ir storage-2 Antroje:

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

Paleiskite galimą žaidimų knygą:

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

Atkreipkite dėmesį į parinktį --limit. Kadangi kiekvienas klasterio egzempliorius yra pagrindinis kompiuteris, kalbant apie Ansible, galime aiškiai nurodyti, kurie egzemplioriai turi būti sukonfigūruoti paleidžiant planą.

Grįžti į žiniatinklio vartotojo sąsają http://localhost:8181/admin/cluster/dashboard ir stebėkite mūsų naujus atvejus:

Lengvas ir natūralus programų diegimas Tarantool kasetėje (1 dalis)

Neužmigsime ant laurų ir įvaldysime topologijos valdymą.

Topologijos valdymas

Sujungkime naujus egzempliorius į kopiją storage-2. Pridėti naują grupę replicaset_storage_2 ir jo kintamuosiuose apibūdinkite replikacijos parametrus pagal analogiją su replicaset_storage_1. Skyriuje hosts nurodykite, kurie egzemplioriai bus įtraukti į šią grupę (tai yra, mūsų kopijų rinkinys):

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

Vėl pradėkime žaidimų knygą:

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

Pagal variantą --limit šį kartą perdavėme grupės pavadinimą, atitinkantį mūsų repliką.

Apsvarstykite variantą tags.

Mūsų vaidmuo nuosekliai atlieka įvairias užduotis, kurios yra pažymėtos šiomis žymomis:

  • cartridge-instances: egzempliorių valdymas (konfigūravimas, prisijungimas prie narystės);
  • cartridge-replicasets: topologijos valdymas (replikacijų valdymas ir egzempliorių pašalinimas (pašalinimas) visam laikui iš klasterio);
  • cartridge-config: valdyti kitus klasterio parametrus (vshard bootstrapping, automatinis perkrovos režimas, autorizacijos parametrai ir programos konfigūracija).

Galime aiškiai nurodyti, kurią darbo dalį norime atlikti, tada vaidmuo praleis likusias užduotis. Mūsų atveju norime dirbti tik su topologija, todėl patikslinome cartridge-replicasets.

Įvertinkime savo pastangų rezultatą. Ieškoma naujos kopijos http://localhost:8181/admin/cluster/dashboard.

Lengvas ir natūralus programų diegimas Tarantool kasetėje (1 dalis)

Valio!

Eksperimentuokite iš naujo sukonfigūruodami egzempliorius ir kopijas ir pažiūrėkite, kaip pasikeičia klasterio topologija. Galite išbandyti įvairius veikimo scenarijus, pvz. nuolatinis atnaujinimas arba padidinti memtx_memory. Vaidmuo bandys tai padaryti nepaleisdamas egzemplioriaus iš naujo, kad sumažintų galimą programos prastovą.

Nepamirškite bėgti vagrant haltkad sustabdytumėte VM, kai baigsite dirbti su jais.

O kas po gaubtu?

Čia pakalbėsiu daugiau apie tai, kas nutiko po ansible vaidmens gaubtu mūsų eksperimentų metu.

Pažvelkime į kasetės programos diegimą žingsnis po žingsnio.

Paketo diegimas ir egzempliorių paleidimas

Pirmiausia turite pristatyti paketą į serverį ir jį įdiegti. Dabar vaidmuo gali dirbti su RPM ir DEB paketais.

Toliau paleidžiame egzempliorius. Čia viskas labai paprasta: kiekvienas atvejis yra atskiras systemd- paslauga. Aš kalbu apie pavyzdį:

$ systemctl start myapp@storage-1

Ši komanda paleis egzempliorių storage-1 programos myapp. Pradėtas egzempliorius ieškos jo konfigūracija в /etc/tarantool/conf.d/. Egzempliorių žurnalus galima peržiūrėti naudojant journald.

Vieneto failas /etc/systemd/system/[email protected] sisteminei paslaugai bus pristatyta kartu su paketu.

Ansible turi integruotus paketų diegimo ir sisteminių paslaugų valdymo modulius, nieko naujo čia nesugalvojome.

Klasterio topologijos konfigūravimas

Ir čia prasideda įdomiausia. Sutikite, būtų keista vargti su specialiu vaidmeniu diegiant ir paleidžiant paketus systemd-paslaugos.

Klasterį galite nustatyti rankiniu būdu:

  • Pirmoji parinktis: atidarykite žiniatinklio vartotojo sąsają ir spustelėkite mygtukus. Vienkartiniam kelių egzempliorių pradžiai jis yra gana tinkamas.
  • Antroji parinktis: galite naudoti GraphQl API. Čia jau galima kažką automatizuoti, pavyzdžiui, parašyti scenarijų Python.
  • Trečias variantas (stiprioms dvasiai): eikite į serverį, prisijunkite prie vieno iš naudojamų egzempliorių tarantoolctl connect ir atlikti visas reikalingas manipuliacijas su Lua moduliu cartridge.

Pagrindinė mūsų išradimo užduotis yra tai padaryti, sunkiausia darbo dalis jums.

Ansible leidžia jums parašyti savo modulį ir naudoti jį vaidmenyje. Mūsų vaidmuo naudoja šiuos modulius įvairiems klasterio komponentams valdyti.

Kaip tai veikia? Norimą klasterio būseną aprašote deklaratyvioje konfigūracijoje, o vaidmuo kiekvienam moduliui suteikia konfigūracijos skyrių kaip įvestį. Modulis gauna esamą klasterio būseną ir lygina ją su įvestimi. Tada per vieno iš egzempliorių lizdą paleidžiamas kodas, kuris perkelia klasterį į norimą būseną.

rezultatai

Šiandien mes papasakojome ir parodėme, kaip įdiegti programą Tarantool Cartridge ir nustatyti paprastą topologiją. Tam panaudojome Ansible – galingą įrankį, kurį paprasta naudoti ir kuris leidžia vienu metu konfigūruoti daug infrastruktūros mazgų (mūsų atveju tai yra klasterių egzemplioriai).

Aukščiau aptarėme vieną iš daugelio būdų, kaip apibūdinti klasterio konfigūraciją naudojant Ansible. Kai žinote, kad esate pasirengęs judėti toliau, mokykitės geriausia praktika žaidimų knygelių rašymui. Jums gali būti patogiau valdyti topologiją group_vars и host_vars.

Labai greitai mes jums pasakysime, kaip visam laikui pašalinti (pašalinti) egzempliorius iš topologijos, įkrovos vshard, valdyti automatinį persileidimo režimą, sukonfigūruoti autorizaciją ir pataisyti klasterio konfigūraciją. Tuo tarpu galite mokytis savarankiškai dokumentacija ir eksperimentuokite su klasterio parametrų keitimu.

Jei kažkas neveikia, įsitikinkite informuoti mus apie problemą. Greitai suskaidysime!

Šaltinis: www.habr.com

Добавить комментарий