Sambaza programu kwa urahisi na asili kwa Tarantool Cartridge (sehemu ya 1)

Sambaza programu kwa urahisi na asili kwa Tarantool Cartridge (sehemu ya 1)

Tayari tumezungumza Cartridge ya Tarantool, ambayo hukuruhusu kukuza programu zilizosambazwa na kuzifunga. Kilichosalia ni kujifunza jinsi ya kupeleka programu hizi na kuzidhibiti. Usijali, tumeshughulikia yote! Tuliweka pamoja mazoea yote bora ya kufanya kazi na Tarantool Cartridge na tukaandika ansible-jukumu, ambayo itasambaza kifurushi kwa seva, kuzindua matukio, kuchanganya kwenye kundi, kusanidi idhini, bootstrap vshard, kuwezesha kushindwa kwa moja kwa moja na kuunganisha usanidi wa nguzo.

Inavutia? Kisha tafadhali, chini ya kukata, tutakuambia na kukuonyesha kila kitu.

Hebu tuanze na mfano

Tutaangalia tu sehemu ya utendaji wa jukumu letu. Unaweza kupata maelezo kamili ya uwezo wake wote na vigezo vya kuingiza ndani nyaraka. Lakini ni bora kujaribu mara moja kuliko kuiona mara mia, basi hebu tupeleke programu ndogo.

Tarantool Cartridge ina mafunzo kuunda programu ndogo ya Cartridge ambayo huhifadhi habari kuhusu wateja wa benki na akaunti zao, na pia hutoa API ya usimamizi wa data kupitia HTTP. Ili kufanikisha hili, kiambatisho kinaelezea majukumu mawili yanayowezekana: api ΠΈ storage, ambayo inaweza kupewa matukio.

Cartridge yenyewe haisemi chochote kuhusu jinsi ya kuzindua michakato, inatoa tu uwezo wa kusanidi matukio tayari yanayoendesha. Mtumiaji lazima afanye mapumziko mwenyewe: kupanga faili za usanidi, anza huduma na usanidi topolojia. Lakini hatutafanya haya yote; Ansible atatufanyia.

Kutoka kwa maneno hadi kwa vitendo

Kwa hivyo, hebu tupeleke maombi yetu kwa mashine mbili pepe na tuweke topolojia rahisi:

  • Kuiga app-1 itatekeleza jukumu hilo api, ambayo inajumuisha jukumu vshard-router. Kutakuwa na mfano mmoja tu hapa.
  • Kuiga storage-1 kutekeleza jukumu storage (na wakati huo huo vshard-storage), hapa tutaongeza matukio mawili kutoka kwa mashine tofauti.

Sambaza programu kwa urahisi na asili kwa Tarantool Cartridge (sehemu ya 1)

Kuendesha mfano tunaohitaji Mzururaji ΠΈ Inawezekana (toleo la 2.8 au zaidi).

Jukumu lenyewe liko ndani Galaxy Ansible. Hili ni hifadhi ambalo hukuruhusu kushiriki kazi yako na kutumia majukumu yaliyotayarishwa tayari.

Wacha tutengeneze hazina na mfano:

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

Tunainua mashine za kawaida:

$ vagrant up

Sakinisha jukumu linalofaa la Cartridge ya Tarantool:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Anzisha jukumu lililowekwa:

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

Tunasubiri kitabu cha kucheza kukamilisha utekelezaji, nenda kwa http://localhost:8181/admin/cluster/dashboard na ufurahie matokeo:

Sambaza programu kwa urahisi na asili kwa Tarantool Cartridge (sehemu ya 1)

Unaweza kupakia data. Baridi, sawa?

Sasa hebu tujue jinsi ya kufanya kazi na hili, na wakati huo huo kuongeza replica nyingine iliyowekwa kwenye topolojia.

Wacha tuanze kuigundua

Basi nini kilitokea?

Tulianzisha mashine mbili pepe na kuzindua kitabu cha kucheza kinachofaa ambacho kilisanidi kundi letu. Wacha tuangalie yaliyomo kwenye faili 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

Hakuna kitu cha kufurahisha kinachotokea hapa, wacha tuzindue jukumu linaloitwa tarantool.cartridge.

Vitu vyote muhimu zaidi (yaani, usanidi wa nguzo) ziko ndani hesabu-faili 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:

Tunachohitaji ni kujifunza jinsi ya kudhibiti matukio na nakala kwa kubadilisha maudhui ya faili hii. Ifuatayo tutaongeza sehemu mpya kwake. Ili usichanganyikiwe wapi kuziongeza, unaweza kuangalia toleo la mwisho la faili hii, hosts.updated.yml, ambayo iko kwenye hazina ya mfano.

Usimamizi wa Matukio

Kwa maneno yasiyofaa, kila mfano ni mwenyeji (sio kuchanganyikiwa na seva ya vifaa), i.e. nodi ya miundombinu ambayo Ansible itasimamia. Kwa kila mwenyeji tunaweza kutaja vigezo vya uunganisho (kama vile ansible_host ΠΈ ansible_user), pamoja na usanidi wa mfano. Maelezo ya matukio ni katika sehemu hosts.

Wacha tuangalie usanidi wa mfano storage-1:

all:
  vars:
    ...

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

  ...

Katika kutofautiana config tulitaja vigezo vya mfano - advertise URI ΠΈ HTTP port.
Chini ni vigezo vya mfano app-1 ΠΈ storage-1-replica.

Tunahitaji kuwaambia Ansible vigezo vya uunganisho kwa kila mfano. Inaonekana ni sawa kuweka matukio katika vikundi vya mashine pepe. Kwa kusudi hili, matukio yanajumuishwa katika vikundi host1 ΠΈ host2, na katika kila kikundi katika sehemu hiyo vars maadili yanaonyeshwa ansible_host ΠΈ ansible_user kwa mashine moja ya mtandaoni. Na katika sehemu hosts - wapangishi (aka matukio) ambao wamejumuishwa katika kikundi hiki:

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:

Tunaanza kubadilika hosts.yml. Wacha tuongeze mifano miwili zaidi, storage-2-replica kwenye mashine ya kwanza ya mtandaoni na storage-2 Kwa pili:

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

Zindua kitabu cha kucheza kinachofaa:

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

Tafadhali kumbuka chaguo --limit. Kwa kuwa kila mfano wa kundi ni seva pangishi katika masharti Yanayofaa, tunaweza kubainisha kwa uwazi ni matukio gani yanapaswa kusanidiwa wakati wa kutekeleza kitabu cha kucheza.

Kurudi kwenye UI ya Wavuti http://localhost:8181/admin/cluster/dashboard na tazama matukio yetu mapya:

Sambaza programu kwa urahisi na asili kwa Tarantool Cartridge (sehemu ya 1)

Tusiishie hapo na master topology management.

Usimamizi wa Topolojia

Hebu tuunganishe matukio yetu mapya katika seti ya replica storage-2. Hebu tuongeze kikundi kipya replicaset_storage_2 na ueleze vigezo vya kunakili katika vigeu vyake kwa mlinganisho na replicaset_storage_1. Katika sehemu hosts Hebu tuonyeshe ni matukio gani yatajumuishwa katika kikundi hiki (yaani, seti yetu ya nakala):

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

Wacha tuanze kitabu cha kucheza tena:

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

Katika parameter --limit Wakati huu tulipitisha jina la kikundi ambalo linalingana na nakala yetu.

Hebu fikiria chaguo tags.

Jukumu letu kwa mpangilio hufanya kazi mbalimbali, ambazo zimewekwa alama zifuatazo:

  • cartridge-instances: usimamizi wa mfano (usanidi, uunganisho kwa uanachama);
  • cartridge-replicasets: usimamizi wa topolojia (usimamizi wa nakala na uondoaji wa kudumu (kufukuza) wa matukio kutoka kwa nguzo);
  • cartridge-config: usimamizi wa vigezo vingine vya nguzo (vshard bootstrapping, mode moja kwa moja ya kushindwa, vigezo vya idhini na usanidi wa programu).

Tunaweza kubainisha kwa uwazi ni sehemu gani ya kazi tunayotaka kufanya, kisha jukumu litaruka majukumu mengine. Kwa upande wetu, tunataka kufanya kazi tu na topolojia, kwa hivyo tulibainisha cartridge-replicasets.

Hebu tutathmini matokeo ya juhudi zetu. Tunapata nakala mpya ikiwa imewashwa http://localhost:8181/admin/cluster/dashboard.

Sambaza programu kwa urahisi na asili kwa Tarantool Cartridge (sehemu ya 1)

Hooray!

Jaribu kubadilisha usanidi wa matukio na seti za nakala na uone jinsi topolojia ya nguzo inavyobadilika. Unaweza kujaribu hali tofauti za uendeshaji, k.m. sasisho linaloendelea au kuongeza memtx_memory. Jukumu litajaribu kufanya hivi bila kuanzisha tena mfano ili kupunguza muda wa chini wa programu yako.

Usisahau kukimbia vagrant haltkusimamisha mashine pepe unapomaliza kufanya kazi nazo.

Na nini chini ya kofia?

Hapa nitakuambia zaidi juu ya kile kilichokuwa kikifanyika chini ya kifuniko cha jukumu linalofaa wakati wa majaribio yetu.

Wacha tuangalie kupeleka programu ya Cartridge hatua kwa hatua.

Kufunga kifurushi na matukio ya kuanzia

Kwanza unahitaji kutoa kifurushi kwa seva na kuiweka. Hivi sasa jukumu linaweza kufanya kazi na vifurushi vya RPM na DEB.

Ifuatayo, tunazindua mifano. Kila kitu ni rahisi sana hapa: kila mfano ni tofauti systemd-huduma. Nitakupa mfano:

$ systemctl start myapp@storage-1

Amri hii itazindua mfano storage-1 programu myapp. Mfano uliozinduliwa utatafuta yake usanidi Π² /etc/tarantool/conf.d/. Kumbukumbu za matukio zinaweza kutazamwa kwa kutumia journald.

Faili ya kitengo /etc/systemd/system/[email protected] kwa huduma ya mfumo itatolewa pamoja na kifurushi.

Ansible ina moduli zilizojengewa ndani za kusakinisha vifurushi na kudhibiti huduma za mfumo; hatujavumbua chochote kipya hapa.

Kuanzisha topolojia ya nguzo

Hapa ndipo furaha huanza. Kukubaliana, itakuwa ya kushangaza kujisumbua na jukumu maalum la Ansible la kusakinisha vifurushi na kukimbia systemd-huduma.

Unaweza kusanidi nguzo kwa mikono:

  • Chaguo la kwanza: fungua UI ya Wavuti na ubofye vifungo. Inafaa kabisa kwa mwanzo wa wakati mmoja wa matukio kadhaa.
  • Chaguo la pili: unaweza kutumia GraphQl API. Hapa unaweza tayari kubinafsisha kitu, kwa mfano, andika hati katika Python.
  • Chaguo la tatu (kwa wenye nia kali): nenda kwa seva, unganisha kwenye mojawapo ya matukio kwa kutumia tarantoolctl connect na fanya hila zote muhimu na moduli ya Lua cartridge.

Kazi kuu ya uvumbuzi wetu ni kufanya hasa hii, sehemu ngumu zaidi ya kazi kwako.

Ansible hukuruhusu kuandika moduli yako mwenyewe na kuitumia kama jukumu. Jukumu letu hutumia moduli kama hizi kudhibiti vipengee mbalimbali vya nguzo.

Inavyofanya kazi? Unaelezea hali inayohitajika ya nguzo katika usanidi wa kutangaza, na jukumu hutoa kila moduli na sehemu yake ya usanidi kama ingizo. Moduli hupokea hali ya sasa ya nguzo na kuilinganisha na kile kilichopokelewa kama ingizo. Ifuatayo, msimbo unazinduliwa kupitia tundu la mojawapo ya matukio, ambayo huleta nguzo kwa hali inayotakiwa.

Matokeo ya

Leo tuliambia na kuonyesha jinsi ya kupeleka maombi yako kwa Tarantool Cartridge na kuweka topolojia rahisi. Ili kufanya hivyo, tulitumia Ansible - chombo chenye nguvu ambacho ni rahisi kutumia na hukuruhusu kusanidi nodi nyingi za miundombinu (kwa upande wetu, matukio ya nguzo).

Hapo juu tuliangalia mojawapo ya njia nyingi za kuelezea usanidi wa nguzo kwa kutumia Ansible. Mara tu unapohisi kuwa uko tayari kuendelea, chunguza njia bora juu ya kuandika vitabu vya kucheza. Unaweza kupata rahisi kudhibiti topolojia yako kwa kutumia group_vars ΠΈ host_vars.

Hivi karibuni tutakuambia jinsi ya kufuta kabisa (kufukuza) matukio kutoka kwa topolojia, bootstrap vshard, kudhibiti hali ya kushindwa kiotomatiki, kusanidi idhini na kuweka kiraka usanidi wa nguzo. Wakati huo huo, unaweza kusoma peke yako nyaraka na ujaribu kubadilisha vigezo vya nguzo.

Ikiwa kitu haifanyi kazi, hakikisha nifahamishe sisi kuhusu tatizo. Tutasuluhisha kila kitu haraka!

Chanzo: mapenzi.com

Kuongeza maoni