Uża applikazzjonijiet b'mod faċli u naturali għal Tarantool Cartridge (parti 1)

Uża applikazzjonijiet b'mod faċli u naturali għal Tarantool Cartridge (parti 1)

Diġà tkellimna dwarhom Skartoċċ Tarantool, li jippermettilek tiżviluppa applikazzjonijiet distribwiti u tippakkjahom. Kulma fadal huwa li titgħallem kif tuża dawn l-applikazzjonijiet u timmaniġġjahom. Tinkwetax, aħna ltqajna kollox kopert! Aħna għaqqadna l-aħjar prattiki kollha biex naħdmu ma 'Tarantool Cartridge u ktibna ansible-rwol, li se jqassam il-pakkett għal servers, iniedi istanzi, jgħaqqadhom fi cluster, kkonfigurat awtorizzazzjoni, bootstrap vshard, jippermetti failover awtomatiku u garża l-konfigurazzjoni tal-cluster.

Interessanti? Imbagħad jekk jogħġbok, taħt il-qatgħa, ngħidulek u nuruk kollox.

Nibdew b'eżempju

Aħna se nħarsu biss lejn parti mill-funzjonalità tar-rwol tagħna. Dejjem tista' ssib deskrizzjoni sħiħa tal-kapaċitajiet kollha tagħha u l-parametri tad-dħul dokumentazzjoni. Iżda huwa aħjar li tipprova darba milli taraha mitt darba, allura ejja niskjeraw applikazzjoni żgħira.

Tarantool Skartoċċ għandu tutorja biex toħloq applikazzjoni żgħira tal-Iskartoċċ li taħżen informazzjoni dwar il-klijenti tal-bank u l-kontijiet tagħhom, u tipprovdi wkoll API għall-ġestjoni tad-dejta permezz ta 'HTTP. Biex jinkiseb dan, l-appendiċi jiddeskrivi żewġ rwoli possibbli: api и storage, li jistgħu jiġu assenjati lill-istanzi.

L-iskartoċċ innifsu ma jgħid xejn dwar kif tniedi proċessi, jipprovdi biss il-ħila li jiġi kkonfigurat istanzi li diġà qed jaħdmu. L-utent għandu jagħmel il-bqija hu stess: jirranġa fajls ta 'konfigurazzjoni, jibda s-servizzi u kkonfigura t-topoloġija. Imma dan kollu mhux se nagħmlu; Ansible se jagħmel dan għalina.

Mill-kliem għall-fatti

Allura, ejja nużaw l-applikazzjoni tagħna għal żewġ magni virtwali u waqqaf topoloġija sempliċi:

  • Replicaset app-1 se timplimenta r-rwol api, li jinkludi r-rwol vshard-router. Hawn se jkun hemm istanza waħda biss.
  • Replicaset storage-1 jimplimenta r-rwol storage (u fl-istess ħin vshard-storage), hawnhekk se nżidu żewġ każijiet minn magni differenti.

Uża applikazzjonijiet b'mod faċli u naturali għal Tarantool Cartridge (parti 1)

Biex inmexxu l-eżempju li għandna bżonn Vagrant и Ansible (verżjoni 2.8 jew anzjani).

Ir-rwol innifsu huwa fih Galaxy Ansible. Dan huwa repożitorju li jippermettilek taqsam ix-xogħol tiegħek u tuża rwoli lesti.

Ejja nikklonu r-repożitorju b'eżempju:

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

Aħna ngħollu magni virtwali:

$ vagrant up

Installa r-rwol ansible tal-Cartridge Tarantool:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Niedi r-rwol installat:

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

Nistennew li l-playbook jitlesta l-eżekuzzjoni, mur http://localhost:8181/admin/cluster/dashboard u gawdi r-riżultat:

Uża applikazzjonijiet b'mod faċli u naturali għal Tarantool Cartridge (parti 1)

Tista 'ttella' data. Kessaħ, hux?

Issa ejja nsemmu kif naħdmu ma 'dan, u fl-istess ħin żid sett replika ieħor mat-topoloġija.

Ejja nibdew insemmu

Allura x'ġara?

Waqqafna żewġ magni virtwali u nedejna playbook ansible li kkonfigura l-cluster tagħna. Ejja nħarsu lejn il-kontenut tal-fajl 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

Ma jiġri xejn interessanti hawn, ejja nniedu rwol ansible msejjaħ tarantool.cartridge.

L-aktar affarijiet importanti kollha (jiġifieri, il-konfigurazzjoni tal-cluster) jinsabu fihom inventarju-fajl 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:

Kulma għandna bżonn huwa li nitgħallmu kif timmaniġġja l-istanzi u r-repliki billi nbiddlu l-kontenut ta’ dan il-fajl. Sussegwentement inżidu sezzjonijiet ġodda magħha. Sabiex ma titħawwadx fejn iżżidhom, tista' tħares lejn il-verżjoni finali ta' dan il-fajl, hosts.updated.yml, li jinsab fir-repożitorju tal-eżempju.

Ġestjoni tal-istanza

F'termini Ansible, kull istanza hija host (ma tridx tiġi konfuża ma' server hardware), i.e. in-node infrastrutturali li Ansible se jamministra. Għal kull host nistgħu nispeċifikaw il-parametri tal-konnessjoni (bħal ansible_host и ansible_user), kif ukoll il-konfigurazzjoni tal-istanza. Deskrizzjoni tal-każijiet tinsab fit-taqsima hosts.

Ejja nħarsu lejn il-konfigurazzjoni tal-istanza storage-1:

all:
  vars:
    ...

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

  ...

Fil-varjabbli config speċifikajna l-parametri tal-istanza - advertise URI и HTTP port.
Hawn taħt jinsabu l-parametri tal-istanza app-1 и storage-1-replica.

Irridu ngħidu lil Ansible il-parametri tal-konnessjoni għal kull istanza. Jidher loġiku li l-istanzi jiġu miġbura fi gruppi ta 'magni virtwali. Għal dan il-għan, l-istanzi huma magħquda fi gruppi host1 и host2, u f'kull grupp fit-taqsima vars valuri huma indikati ansible_host и ansible_user għal magna virtwali waħda. U fit-taqsima hosts — hosts (magħruf ukoll bħala każijiet) li huma inklużi f'dan il-grupp:

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:

Nibdew inbiddlu hosts.yml. Ejja nżidu żewġ każijiet oħra, storage-2-replica fuq l-ewwel magna virtwali u storage-2 Fit-tieni:

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

Nieda l-playbook ansible:

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

Jekk jogħġbok innota l-għażla --limit. Peress li kull istanza ta 'cluster hija ospitanti f'termini Ansible, nistgħu nispeċifikaw b'mod espliċitu liema istanzi għandhom jiġu kkonfigurati meta tesegwixxi l-playbook.

Tmur lura għall-UI tal-Web http://localhost:8181/admin/cluster/dashboard u ara l-istanzi l-ġodda tagħna:

Uża applikazzjonijiet b'mod faċli u naturali għal Tarantool Cartridge (parti 1)

Ejja ma nieqfux hemm u nikkontrollaw il-ġestjoni tat-topoloġija.

Ġestjoni tat-topoloġija

Ejja ngħaqqdu l-istanzi l-ġodda tagħna f'sett replika storage-2. Ejja nżidu grupp ġdid replicaset_storage_2 u ddeskrivi l-parametri replicaset fil-varjabbli tagħha b'analoġija ma' replicaset_storage_1. Fit-taqsima hosts Ejja nindikaw liema każijiet se jiġu inklużi f'dan il-grupp (jiġifieri, is-sett tar-repliki tagħna):

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

Ejja nerġgħu nibdew il-playbook:

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

Għal kull parametru --limit Din id-darba għadda l-isem tal-grupp li jikkorrispondi għar-replikaset tagħna.

Ejja nikkunsidraw l-għażla tags.

Ir-rwol tagħna sekwenzjali jwettaq diversi kompiti, li huma mmarkati bit-tikketti li ġejjin:

  • cartridge-instances: ġestjoni tal-istanzi (konfigurazzjoni, konnessjoni mas-sħubija);
  • cartridge-replicasets: ġestjoni tat-topoloġija (ġestjoni ta' replicaset u tneħħija permanenti (tkeċċija) ta' istanzi mill-cluster);
  • cartridge-config: ġestjoni ta' parametri oħra ta' cluster (vshard bootstrapping, mod awtomatiku ta' failover, parametri ta' awtorizzazzjoni u konfigurazzjoni ta' applikazzjoni).

Nistgħu nispeċifikaw b'mod espliċitu liema parti tax-xogħol irridu nagħmlu, allura r-rwol se taqbeż il-bqija tal-kompiti. Fil-każ tagħna, irridu naħdmu biss mat-topoloġija, għalhekk speċifikajna cartridge-replicasets.

Ejja nevalwaw ir-riżultat tal-isforzi tagħna. Insibu replicaset ġdid fuq http://localhost:8181/admin/cluster/dashboard.

Uża applikazzjonijiet b'mod faċli u naturali għal Tarantool Cartridge (parti 1)

Hooray!

Esperimenta bil-bdil tal-konfigurazzjoni ta 'istanzi u settijiet ta' repliki u ara kif tinbidel it-topoloġija tal-cluster. Tista' tipprova xenarji operattivi differenti, eż. aġġornament rolling jew tiżdied memtx_memory. Ir-rwol se jipprova jagħmel dan mingħajr ma jerġa' jibda l-istanza sabiex inaqqas il-perijodi ta' waqfien possibbli tal-applikazzjoni tiegħek.

Tinsiex tiġri vagrant haltbiex twaqqaf il-magni virtwali meta tkun spiċċajt taħdem magħhom.

U x’hemm taħt il-kappa?

Hawnhekk ser ngħidlek aktar dwar dak li kien qed jiġri taħt il-barnuża tar-rwol ansible matul l-esperimenti tagħna.

Ejja nħarsu lejn l-iskjerament tal-applikazzjoni tal-Iskartoċċ pass pass.

L-installazzjoni tal-pakkett u l-istanzi tal-bidu

L-ewwel trid twassal il-pakkett lis-server u tinstallah. Bħalissa r-rwol jista 'jaħdem ma' pakketti RPM u DEB.

Sussegwentement inniedu l-istanzi. Hawnhekk kollox huwa sempliċi ħafna: kull istanza hija separata systemd-servizz. Nagħtik eżempju:

$ systemctl start myapp@storage-1

Dan il-kmand se jniedi l-istanza storage-1 apps myapp. L-istanza mnedija se tfittex tagħha konfigurazzjoni в /etc/tarantool/conf.d/. Istanza zkuk jistgħu jitqiesu bl-użu journald.

Fajl tal-unità /etc/systemd/system/[email protected] għas-servizz systemd se jitwassal flimkien mal-pakkett.

Ansible għandu moduli integrati għall-installazzjoni tal-pakketti u l-ġestjoni tas-servizzi tas-sistema; hawn ma ivvintajna xejn ġdid.

Twaqqif ta' topoloġija ta' cluster

Dan huwa fejn jibda l-gost. Naqbel, ikun stramba li tolqot bi rwol speċjali ta 'Ansible għall-installazzjoni ta' pakketti u t-tħaddim systemd-servizzi.

Tista' tikkonfigura l-cluster manwalment:

  • L-ewwel għażla: tiftaħ il-Web UI u kklikkja fuq il-buttuni. Huwa pjuttost adattat għal bidu ta 'darba ta' diversi każijiet.
  • It-tieni għażla: tista 'tuża l-API GraphQl. Hawnhekk diġà tista 'awtomatizza xi ħaġa, pereżempju, tikteb skript f'Python.
  • It-tielet għażla (għal rieda qawwija): mur fis-server, qabbad ma 'wieħed mill-istanzi bl-użu tarantoolctl connect u wettaq il-manipulazzjonijiet kollha meħtieġa bil-modulu Lua cartridge.

Il-kompitu ewlieni tal-invenzjoni tagħna huwa li tagħmel eżattament dan, l-aktar parti diffiċli tax-xogħol għalik.

Ansible jippermettilek tikteb il-modulu tiegħek stess u tużah fi rwol. Ir-rwol tagħna juża moduli bħal dawn biex jimmaniġġjaw diversi komponenti tal-clusters.

Kif taħdem? Inti tiddeskrivi l-istat mixtieq tal-cluster f'konfigurazzjoni dikjarattiva, u r-rwol jipprovdi lil kull modulu bit-taqsima tal-konfigurazzjoni tiegħu bħala input. Il-modulu jirċievi l-istat attwali tar-raggruppament u jqabbel ma' dak li ġie riċevut bħala input. Sussegwentement, jiġi mniedi kodiċi permezz tas-sokit ta 'wieħed mill-istanzi, li jġib il-cluster fl-istat mixtieq.

Riżultati ta '

Illum għedna u wrejna kif tuża l-applikazzjoni tiegħek għal Tarantool Cartridge u twaqqaf topoloġija sempliċi. Biex tagħmel dan, użajna Ansible - għodda b'saħħitha li hija faċli biex tużah u tippermettilek tikkonfigura simultanjament ħafna nodi tal-infrastruttura (fil-każ tagħna, istanzi ta 'clusters).

Hawn fuq ħares lejn wieħed mill-ħafna modi kif niddeskrivu konfigurazzjoni ta 'cluster bl-użu ta' Ansible. Ladarba tħossok lest biex timxi 'l quddiem, esplora aħjar prattiki dwar il-kitba tal-playbooks. Tista' ssibha aktar faċli biex timmaniġġja t-topoloġija tiegħek bl-użu group_vars и host_vars.

Dalwaqt ngħidulek kif tħassar (tkeċċi) istanzi mit-topoloġija b'mod permanenti, bootstrap vshard, timmaniġġja l-modalità ta' failover awtomatiku, tikkonfigura l-awtorizzazzjoni u twaħħal il-konfigurazzjoni tal-cluster. Sadanittant, tista' tistudja waħdek dokumentazzjoni u esperiment b'parametri ta 'cluster li jinbidlu.

Jekk xi ħaġa ma taħdimx, kun żgur li infurmani magħna dwar il-problema. Aħna ser issolvi kollox malajr!

Sors: www.habr.com

Żid kumment