Inplementatu erraz eta naturalki aplikazioak Tarantool Cartridge-ra (1. zatia)

Inplementatu erraz eta naturalki aplikazioak Tarantool Cartridge-ra (1. zatia)

Dagoeneko hitz egin dugu Tarantool kartutxoa, banatutako aplikazioak garatzeko eta horiek paketatzeko aukera ematen duena. Aplikazio hauek nola zabaldu eta kudeatzen ikastea besterik ez da geratzen. Ez kezkatu, dena jaso dugu! Tarantool Cartridge-ekin lan egiteko jardunbide egoki guztiak bildu eta idatzi genuen ansible-rol, paketea zerbitzarietara banatuko du, instantziak abiarazi, kluster batean batuko ditu, baimena konfiguratuko du, abioko vshard-a, hutsegite automatikoa gaitu eta kluster konfigurazioa adabakiko du.

Interesgarria? Orduan, mesedez, ebaki azpian, dena esango dizugu eta erakutsiko dizugu.

Has gaitezen adibide batekin

Gure rolaren funtzionaltasunaren zati bat bakarrik ikusiko dugu. Beti aurki dezakezu bere gaitasun guztien eta sarrera-parametroen deskribapen osoa dokumentazioa. Baina hobe da behin probatzea ehun aldiz ikustea baino, beraz, heda dezagun aplikazio txiki bat.

Tarantool Kartutxoak ditu tutoretza bankuko bezeroei eta haien kontuei buruzko informazioa gordetzen duen Cartridge aplikazio txiki bat sortzeko, eta HTTP bidez datuak kudeatzeko API bat ere eskaintzen duena. Hori lortzeko, eranskinean bi eginkizun posible deskribatzen dira: api ΠΈ storage, instantziei esleitu dakiekeena.

Kartutxoak berak ez du ezer esaten prozesuak abiarazteko moduari buruz, dagoeneko martxan dauden instantziak konfiguratzeko gaitasuna besterik ez du ematen. Erabiltzaileak berak egin behar du gainerakoa: konfigurazio fitxategiak antolatu, zerbitzuak martxan jarri eta topologia konfiguratu. Baina ez dugu hau guztia egingo; Ansiblek egingo du guregatik.

Hitzetatik ekintzetara

Beraz, zabaldu dezagun gure aplikazioa bi makina birtualetan eta konfigura dezagun topologia sinple bat:

  • Erreplika multzoa app-1 eginkizuna gauzatuko du api, rola barne hartzen duena vshard-router. Hemen kasu bakarra egongo da.
  • Erreplika multzoa storage-1 rola gauzatzen du storage (eta aldi berean vshard-storage), hemen makina ezberdinetako bi instantzia gehituko ditugu.

Inplementatu erraz eta naturalki aplikazioak Tarantool Cartridge-ra (1. zatia)

Behar dugun adibidea exekutatzeko vagrant ΠΈ Ansible (2.8 bertsioa edo zaharragoa).

Rola bera dago Galaxia Ansible. Zure lana partekatzeko eta prest egindako rolak erabiltzeko aukera ematen duen biltegia da.

Klon dezagun biltegia adibide batekin:

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

Makina birtualak planteatzen ditugu:

$ vagrant up

Instalatu Tarantool Cartridge rol ansiblea:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Abiarazi instalatutako rola:

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

Playbook exekuzioa amaitu arte itxarongo dugu, joan hona http://localhost:8181/admin/cluster/dashboard eta gozatu emaitzaz:

Inplementatu erraz eta naturalki aplikazioak Tarantool Cartridge-ra (1. zatia)

Datuak igo ditzakezu. Polita, ezta?

Orain asma dezagun nola lan egin honekin, eta, aldi berean, gehitu beste erreplika multzo bat topologiari.

Has gaitezen asmatzen

Orduan, zer gertatu zen?

Bi makina birtual konfiguratu genituen eta gure cluster konfiguratu zuen ansible playbook bat abiarazi genuen. Ikus ditzagun fitxategiaren edukia 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

Hemen ez da ezer interesgarririk gertatzen, abiarazi dezagun izeneko rol ansible bat tarantool.cartridge.

Gauza garrantzitsuenak (hau da, kluster konfigurazioa) bertan daude inbentarioa-fitxategia 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:

Behar duguna da instantziak eta erreplika multzoak kudeatzen ikastea fitxategi honen edukia aldatuz. Jarraian, atal berriak gehituko dizkiogu. Non gehitu behar dituzun nahasteko, fitxategi honen azken bertsioa ikus dezakezu, hosts.updated.yml, adibideen biltegian dagoena.

Instantzia kudeaketa

Ansible terminoetan, instantzia bakoitza ostalari bat da (ez da nahastu hardware zerbitzari batekin), hau da. Ansiblek kudeatuko duen azpiegitura-nodoa. Ostalari bakoitzeko konexio-parametroak zehaztu ditzakegu (adibidez ansible_host ΠΈ ansible_user), baita instantziaren konfigurazioa ere. Instantziaren deskribapena atalean dago hosts.

Ikus dezagun instantziaren konfigurazioa storage-1:

all:
  vars:
    ...

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

  ...

Aldagaian config instantzia-parametroak zehaztu ditugu - advertise URI ΠΈ HTTP port.
Jarraian instantzia-parametroak daude app-1 ΠΈ storage-1-replica.

Ansibleri instantzia bakoitzeko konexio-parametroak esan behar dizkiogu. Logikoa dirudi instantziak makina birtualeko taldeetan biltzea. Horretarako, kasuak taldeetan konbinatzen dira host1 ΠΈ host2, eta ataleko talde bakoitzean vars balioak adierazten dira ansible_host ΠΈ ansible_user makina birtual baterako. Eta atalean hosts β€” Talde honetan sartzen diren ostalariak (aka instantziak):

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:

Aldatzen hasten gara hosts.yml. Gehi ditzagun beste bi kasu, storage-2-replica lehen makina birtualean eta storage-2 Bigarrenean:

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

Abiarazi ansible playbook-a:

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

Kontuan izan aukera --limit. Cluster-instantzia bakoitza Ansible terminoetan ostalari bat denez, berariaz zehaztu dezakegu zein instantzia konfiguratu behar diren playbook-a exekutatzen denean.

Web UI-ra itzuliz http://localhost:8181/admin/cluster/dashboard eta ikusi gure kasu berriak:

Inplementatu erraz eta naturalki aplikazioak Tarantool Cartridge-ra (1. zatia)

Ez gaitezen gelditu eta topologia kudeaketa menperatu.

Topologiaren kudeaketa

Konbina ditzagun gure instantzia berriak erreplika multzo batean storage-2. Gehitu dezagun talde berri bat replicaset_storage_2 eta deskribatu erreplika-multzoaren parametroak bere aldagaietan, analogiaz replicaset_storage_1. atalean hosts Adierazi dezagun zein instantzia sartuko diren talde honetan (hau da, gure erreplika multzoa):

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

Hasi gaitezen berriro jolas liburua:

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

Parametroan --limit Oraingoan gure erreplika multzoari dagokion taldearen izena pasatu dugu.

Azter dezagun aukera tags.

Gure rolak sekuentzialki hainbat zeregin egiten ditu, eta hauek etiketa hauekin markatuta daude:

  • cartridge-instances: instantzien kudeaketa (konfigurazioa, kidetasunerako konexioa);
  • cartridge-replicasets: topologia-kudeaketa (erreplika-multzoen kudeaketa eta instantzien behin betiko kentzea (kanporatzea) clusterretik);
  • cartridge-config: beste kluster parametroen kudeaketa (vshard bootstrapping, hutsegite automatikoaren modua, baimen-parametroak eta aplikazioen konfigurazioa).

Espresuki zehaztu dezakegu lanaren zein zati egin nahi dugun, eta gero rolak gainontzeko zereginak saltatuko ditu. Gure kasuan, topologiarekin bakarrik lan egin nahi dugu, hala adierazi genuen cartridge-replicasets.

Balora dezagun gure ahaleginaren emaitza. Erreplika multzo berri bat aurkituko dugu http://localhost:8181/admin/cluster/dashboard.

Inplementatu erraz eta naturalki aplikazioak Tarantool Cartridge-ra (1. zatia)

Hooray!

Saia zaitez instantzien eta erreplika multzoen konfigurazioa aldatzen eta ikusi nola aldatzen den kluster topologia. Eszenatoki operatibo desberdinak proba ditzakezu, adibidez. etengabeko eguneraketa edo handitu memtx_memory. Rola hori egiten saiatuko da instantzia berrabiarazi gabe, zure aplikazioaren geldialdi-denbora murrizteko.

Ez ahaztu korrika egitea vagrant haltmakina birtualak gelditzeko haiekin lan egiten amaitzean.

Eta zer dago kanpaiaren azpian?

Hemen gure esperimentuetan rol ansiblearen azpian gertatzen ari zenari buruz gehiago kontatuko dizuet.

Ikus dezagun pausoz pauso Kartutxoen aplikazioa zabaltzen.

Paketea instalatzea eta instantziak abiaraztea

Lehenik eta behin paketea zerbitzariari entregatu eta instalatu behar duzu. Gaur egun rolak RPM eta DEB paketeekin lan egin dezake.

Ondoren, instantziak abiarazten ditugu. Hemen dena oso erraza da: instantzia bakoitza bereizia da systemd-zerbitzua. Adibide bat jarriko dizut:

$ systemctl start myapp@storage-1

Komando honek instantzia abiaraziko du storage-1 aplikazioak myapp. Abiarazitako instantzia bere bilatuko du konfigurazioa Π² /etc/tarantool/conf.d/. Instantzia-erregistroak erabiliz ikus daitezke journald.

Unitatearen fitxategia /etc/systemd/system/[email protected] systemd zerbitzurako paketearekin batera entregatuko da.

Ansiblek paketeak instalatzeko eta sistemako zerbitzuak kudeatzeko moduluak ditu; ez dugu ezer berririk asmatu hemen.

Kluster topologia bat konfiguratzea

Hemen hasten da dibertsioa. Ados, arraroa litzateke paketeak instalatzeko eta exekutatzeko Ansible rol berezi batekin traba egitea systemd-zerbitzuak.

Klusterra eskuz konfigura dezakezu:

  • Lehenengo aukera: ireki Web UI eta egin klik botoietan. Nahiko egokia da hainbat instantzia bakarrean hasteko.
  • Bigarren aukera: GraphQl APIa erabil dezakezu. Hemen dagoeneko zerbait automatizatu dezakezu, adibidez, script bat idatzi Python-en.
  • Hirugarren aukera (borondate handikoentzat): joan zerbitzarira, konektatu erabiliz instantzia batera tarantoolctl connect eta egin behar diren manipulazio guztiak Lua moduluarekin cartridge.

Gure asmakizunaren zeregin nagusia hauxe da, zuretzat lanaren zatirik zailena egitea.

Ansiblek zure modulua idazteko eta rol batean erabiltzeko aukera ematen dizu. Gure rolak horrelako moduluak erabiltzen ditu klusterreko hainbat osagai kudeatzeko.

Nola dabil? Klusterren nahi duzun egoera deskribatzen duzu konfigurazio deklaratibo batean, eta rolak modulu bakoitzari bere konfigurazio-atala ematen dio sarrera gisa. Moduluak klusterraren egungo egoera jasotzen du eta sarrera gisa jasotakoarekin alderatzen du. Ondoren, kode bat abiarazten da instantzietako baten socketetik, eta horrek klusterra nahi den egoerara eramaten du.

Emaitzak

Gaur zure aplikazioa Tarantool Cartridge-ra nola zabaldu eta topologia sinple bat konfiguratu esan eta erakutsi dugu. Horretarako, Ansible erabili dugu - erabiltzeko erraza den tresna indartsua eta aldi berean azpiegitura-nodo asko (gure kasuan, kluster instantzia) konfiguratzeko aukera ematen duena.

Goian Ansible erabiliz kluster konfigurazioa deskribatzeko modu askotariko bat aztertu dugu. Aurrera egiteko prest sentitzen zarenean, arakatu praktika onenak jolas-liburuak idaztean. Baliteke zure topologia erabiltzea errazagoa izatea group_vars ΠΈ host_vars.

Oso laster esango dizugu nola behin betiko ezabatu (kanporatu) topologiako instantziak, abioko vshard-a nola kudeatu, hutsegite modu automatikoa kudeatu, baimena konfiguratu eta klusterraren konfigurazioa adabaki. Bitartean, zure kabuz ikas dezakezu dokumentazioa eta kluster-parametroak aldatzen esperimentatu.

Zerbaitek ez badu funtzionatzen, ziurtatu informatu arazoari buruz. Dena azkar konponduko dugu!

Iturria: www.habr.com

Gehitu iruzkin berria