Eenvoudig en moeiteloos applicaties implementeren op Tarantool Cartridge (deel 1)

Eenvoudig en moeiteloos applicaties implementeren op Tarantool Cartridge (deel 1)

We hebben al gesproken over Tarantool Cartridge, dat het mogelijk maakt om gedistribueerde toepassingen te ontwikkelen en deze in te pakken. Er is nog maar ƩƩn ding te doen: leren hoe deze toepassingen te implementeren en te beheren. Maak je geen zorgen, we hebben alles al geregeld! We hebben alle best practices voor het werken met Tarantool Cartridge verzameld en geschreven ansible-rol, die het pakket op de servers uitrolt, instanties opstart, ze in een cluster samenvoegt, autorisatie instelt, vshard bootstrap en automatische failover inschakelt, en de clusterconfiguratie patcht.

Interesse? Kom dan verder, we vertellen en laten alles zien.

Laten we beginnen met een voorbeeld

We zullen slechts een deel van de functionaliteit van onze rol bekijken. Een volledige beschrijving van al zijn mogelijkheden en ingangsparameters vind je altijd in de documentatie. Maar beter ƩƩn keer proberen dan honderd keer zien, laten we dus een kleine applicatie implementeren.

Tarantool Cartridge heeft tutorial om een kleine Cartridge-applicatie te maken, die informatie over bankklanten en hun rekeningen opslaat, en een API biedt voor het beheren van gegevens via HTTP. Hiervoor worden in de applicatie twee mogelijke rollen beschreven: api en opslag, die aan instanties kunnen worden toegewezen.

De Cartridge zegt niets over hoe processen te starten; hij biedt alleen de mogelijkheid om al geconfigureerde instanties in te stellen. De gebruiker moet de rest zelf doen: configuratiebestanden uitrollen, services starten en de topologie instellen. Maar we gaan ons daar niet mee bezig houden, dat doet Ansible voor ons.

Van woorden naar daden

Laten we dus onze applicatie op twee virtuele machines implementeren en een simpele topologie instellen:

  • Replicaset app-1 zal de rol realiseren api, die de rol omvat vshard-router. Hier zal er maar ƩƩn instantie zijn.
  • Replicaset storage-1 realiseert de rol opslag (en tegelijkertijd vshard-storage), hier voegen we twee instanties toe van verschillende machines.

Eenvoudig en moeiteloos applicaties implementeren op Tarantool Cartridge (deel 1)

Voor het uitvoeren van het voorbeeld hebben we Vagrant en Ansible (versies 2.8 of hoger).

De rol zelf bevindt zich in Ansible Galaxy. Dit is een opslagplaats waar je je ervaringen kunt delen en kant-en-klare rollen kunt gebruiken.

Laten we de repository met het voorbeeld klonen:

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

Laten we de virtuele machines opstarten:

$ vagrant up

We installeren de ansible-rol voor Tarantool Cartridge:

$ ansible-galaxy install tarantool.cartridge,1.0.1

We voeren de geĆÆnstalleerde rol uit:

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

Wacht op de voltooiing van de playbook-uitvoering en ga naar http://localhost:8181/admin/cluster/dashboard en genieten van het resultaat:

Eenvoudig en moeiteloos applicaties implementeren op Tarantool Cartridge (deel 1)

Gegevens kunnen worden ingevoerd. Cool, toch?

Laten we nu eens kijken hoe we hiermee kunnen werken en tegelijkertijd een andere replicaset aan de topologie kunnen toevoegen.

Laten we beginnen met begrijpen

Dus, wat is er eigenlijk gebeurd?

We hebben twee virtuele machines opgezet en een Ansible-playbook uitgevoerd dat onze cluster heeft geconfigureerd. Laten we eens kijken naar de inhoud van het bestand playbook.yml:

---
- name: Deploy mijn Tarantool Cartridge app
  hosts: all
  become: true
  become_user: root
  tasks:
  - name: Importeer Tarantool Cartridge rol
    import_role:
      name: tarantool.cartridge

Hier gebeurt niets bijzonders, we starten de Ansible-rol die tarantool.cartridge.

Alles wat belangrijk is (namelijk, de clusterconfiguratie) bevindt zich in inventaris-bestand hosts.yml:

---
all:
  vars:
    # algemene clustervariabelen
    cartridge_app_name: getting-started-app
    cartridge_package_path: .\/getting-started-app-1.0.0-0.rpm  # pad naar pakket

    cartridge_cluster_cookie: app-default-cookie  # cluster cookie

    # algemene ssh-opties
    ansible_ssh_private_key_file: ~\/\.vagrant.d\/insecure_private_key
    ansible_ssh_common_args: '-o IdentitiesOnly=yes -o UserKnownHostsFile=\/dev\/null -o StrictHostKeyChecking=no'

  # INSTANCIEREN
  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:
    # GROEP INSTANCIEREN OP MACHINES
    host1:
      vars:
        # verbindingsopties eerste machine
        ansible_host: 172.19.0.2
        ansible_user: vagrant

      hosts:  # instanties die op de eerste machine moeten worden gestart
        storage-1:

    host2:
      vars:
        # verbindingsopties tweede machine
        ansible_host: 172.19.0.3
        ansible_user: vagrant

      hosts:  # instanties die op de tweede machine moeten worden gestart
        app-1:
        storage-1-replica:

    # GROEP INSTANCIEREN OP REPLICASETS
    replicaset_app_1:
      vars:  # replicaset configuratie
        replicaset_alias: app-1
        failover_priority:
          - app-1  # leider
        roles:
          - 'api'

      hosts:  # replicaset instanties
        app-1:

    replicaset_storage_1:
      vars:  # replicaset configuratie
        replicaset_alias: storage-1
        weight: 3
        failover_priority:
          - storage-1  # leider
          - storage-1-replica
        roles:
          - 'storage'

      hosts:   # replicaset instanties
        storage-1:
        storage-1-replica:

Alles wat we hoeven te leren is hoe we instanties en replicsets kunnen beheren door de inhoud van dit bestand te wijzigen. We zullen er binnenkort nieuwe secties aan toevoegen. Om niet in de war te raken waar ze moeten worden toegevoegd, kun je een kijkje nemen in de finale versie van dit bestand, hosts.updated.yml, die zich in de repository met het voorbeeld bevindt.

Beheer van instanties

In termen van Ansible is elke instantie een host (niet te verwarren met een fysieke server), d.w.z. een infrastructuurknoop waar Ansible de controle over heeft. Voor elke host kunnen we verbindingsparameters opgeven (zoals ansible_host en ansible_user), en de configuratie van de instantie. Beschrijving van instanties is te vinden in de sectie hosts.

Laten we de configuratie van de instantie bekijken storage-1:

all:
  vars:
    ...

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

  ...

In de variabele -bestand, deze gegevens naar de server verzendt we hebben de parameters van de instantie opgegeven — advertise URI en HTTP poort.
Hieronder staan de parameters van de instanties app-1 en storage-1-replica.

We moeten Ansible de verbindingsparameters voor elke instantie doorgeven. Het lijkt logisch om instanties te groeperen op basis van virtuele machines. Daarom zijn de instanties in groepen samengevoegd host1 en host2, en in elke groep in de sectie vars zijn de waarden opgegeven ansible_host en ansible_user voor ƩƩn virtuele machine. En in de sectie hosts — hosts (dat zijn ook instanties), die tot deze groep behoren:

all:
  vars:
    ...
  hosts:
    ...
  children:
    # GROEP INSTANTIES OP BASIS VAN MACHINES
    host1:
      vars:
        # verbindingsopties voor de eerste machine
        ansible_host: 172.19.0.2
        ansible_user: vagrant
       hosts:  # instanties die op de eerste machine moeten worden gestart
        storage-1:

     host2:
      vars:
        # verbindingsopties voor de tweede machine
        ansible_host: 172.19.0.3
        ansible_user: vagrant
       hosts:  # instanties die op de tweede machine moeten worden gestart
        app-1:
        storage-1-replica:

We beginnen met het aanpassen hosts.yml. Laten we nog twee instanties toevoegen, storage-2-replica op de eerste virtuele machine en storage-2 op de tweede:

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:
    # GROEP INSTANTIES OP BASIS VAN MACHINES
    host1:
      vars:
        ...
      hosts:  # instanties die op de eerste machine moeten worden gestart
        storage-1:
        storage-2-replica:  # <==

    host2:
      vars:
        ...
      hosts:  # instanties die op de tweede machine moeten worden gestart
        app-1:
        storage-1-replica:
        storage-2:  # <==
  ...

We starten de ansible-playbook:

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

Let op de optie --limit. Aangezien elke instantie van het cluster een host is in de termen van Ansible, kunnen we expliciet aangeven welke instanties moeten worden geconfigureerd tijdens het uitvoeren van de playbook.

We gaan weer naar de Web UI http://localhost:8181/admin/cluster/dashboard en zien onze nieuwe instanties:

Eenvoudig en moeiteloos applicaties implementeren op Tarantool Cartridge (deel 1)

Laten we niet stoppen bij wat we hebben bereikt en onze beheertopologie verbeteren.

Beheer van de topologie

Laten we onze nieuwe instanties samenvoegen in een replicaset storage-2. Laten we een nieuwe groep toevoegen replicaset_storage_2 en de parameters van de replicaset beschrijven in zijn variabelen, vergelijkbaar met replicaset_storage_1. In de sectie hosts laten we aangeven welke instanties tot deze groep behoren (dat wil zeggen onze replicaset):

---
all:
  vars:
    ...
  hosts:
    ...
  children:
    ...
    # GROEP INSTANCIƋS OP REPLICASETTEN
    ...
    replicaset_storage_2:  # <=
      vars:  # replicaset configuratie
        replicaset_alias: opslag-2
        weight: 2
        failover_priority:
          - opslag-2
          - opslag-2-replica
        roles:
          - 'opslag'

      hosts:   # replicaset instanties
        opslag-2:
        opslag-2-replica:

We starten het playbook opnieuw:

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

In de parameter --limit hebben we deze keer de groepsnaam doorgegeven die overeenkomt met onze replicaset.

Laten we de optie bekijken tags.

Onze rol voert verschillende taken uit die zijn gemarkeerd met de volgende tags:

  • cartridge-instances: beheer van instanties (configuratie, verbinding met lidmaatschap);
  • cartridge-replicasets: beheer van de topologie (beheer van replicasetten en onomkeerbaar verwijderen (expel) van instanties uit de cluster);
  • cartridge-config: beheer van overige clusterparameters (vshard bootstrapping, automatische failover modus, autorisatieparameters en applicatieconfiguratie).

We kunnen expliciet aangeven welk deel van het werk we willen doen, dan zal de rol de uitvoering van de overige taken overslaan. In ons geval willen we alleen met de topologie werken, dus hebben we aangegeven cartridge-replicasets.

Laten we het resultaat van onze inspanningen evalueren. We vinden de nieuwe replicaset op http://localhost:8181/admin/cluster/dashboard.

Eenvoudig en moeiteloos applicaties implementeren op Tarantool Cartridge (deel 1)

Hoera!

Experimenteer met het wijzigen van de configuratie van instanties en replicasets en kijk hoe de topologie van de cluster verandert. U kunt verschillende operationele scenario's uitproberen, zoals rolling update of het verhogen van memtx_memory. De rol zal proberen dit zonder het herstarten van de instantie te doen, om de mogelijke downtime van uw applicatie te minimaliseren.

Vergeet niet om vagrant halt, uit te voeren om de virtuele machines te stoppen wanneer u klaar bent met ze te werken.

En wat gebeurt er achter de schermen?

Hier zal ik uitgebreid ingaan op wat er achter de schermen van de ansible-rol gebeurde tijdens onze experimenten.

Laten we de stappen van de implementatie van de Cartridge-applicatie bekijken.

Het installeren van het pakket en het starten van instanties

Eerst moet het pakket op de server worden bezorgd en geĆÆnstalleerd. Momenteel kan de rol werken met RPM- en DEB-pakketten.

Vervolgens starten we de instanties. Dit is heel eenvoudig: elke instantie is een aparte systemd-dienst. Ik zal het uitleggen met een voorbeeld:

$ systemctl start myapp@storage-1

Deze opdracht start de instantie. storage-1 applicatie myappDe gestart instantie zal zijn configuratie in /etc/tarantool/conf.d/. De logboeken van de instantie kunnen worden bekeken met behulp van journald.

De Unit-bestand /etc/systemd/system/myapp@.sevice voor de systemd-dienst wordt samen met het pakket geleverd.

Ansible heeft ingebouwde modules voor het installeren van pakketten en het beheren van systemd-services, hier hebben we niets nieuws uitgevonden.

Configuratie van de cluster-topologie

En hier begint het interessantste gedeelte. U moet toegeven dat het vreemd zou zijn om een speciale Ansible-rol te maken voor het installeren van pakketten en het starten systemd-services.

U kunt de cluster handmatig configureren:

  • Eerste optie: open de Web UI en druk op de knoppen. Voor een eenmalige opstart van enkele instanties is dit heel geschikt.
  • Tweede optie: u kunt gebruikmaken van de GraphQL API. Hier kunt u iets automatiseren, bijvoorbeeld een script in Python schrijven.
  • Derde optie (voor de sterkeren van geest): ga naar de server, maak verbinding met een van de instanties met behulp van tarantoolctl connect en voer alle benodigde handelingen uit met de Lua-module cartridge.

De belangrijkste taak van onze uitvinding is om dit, het moeilijkste deel van het werk, voor u te doen.

Ansible stelt u in staat om uw eigen module te schrijven en deze in een rol te gebruiken. Onze rol maakt gebruik van dergelijke modules voor het beheren van verschillende componenten van de cluster.

Hoe werkt dit? U beschrijft de gewenste toestand van de cluster in een declaratief configuratiebestand, en de rol geeft elke module zijn configuratiesectie door. De module krijgt de huidige toestand van de cluster en vergelijkt deze met wat binnenkomt. Vervolgens wordt via de socket van een van de instanties een code gestart die de cluster naar de gewenste toestand brengt.

Conclusies

Vandaag hebben we laten zien hoe u uw applicatie kunt implementeren op Tarantool Cartridge en een eenvoudige topologie kunt configureren. Hiervoor hebben we Ansible gebruikt - een krachtig hulpmiddel dat zich onderscheidt door gebruiksgemak en dat in staat is om tegelijkertijd veel knooppunten in de infrastructuur in te stellen (in ons geval de clusterinstanties).

Hierboven hebben we een van de vele manieren verkend om de configuratie van de cluster met Ansible te beschrijven. Zodra u begrijpt dat u verder kunt, bestudeer dan best practices voor het schrijven van playbooks. Het kan handiger voor u zijn om de topologie te beheren met behulp van group_vars en host_vars.

Heel binnenkort zullen we uitleggen hoe we instanties onomkeerbaar uit de topologie verwijderen (expel), vshard opstarten, de automatische failovermodus beheren, autorisatie instellen en de clusterconfiguratie patchen. Tot die tijd kunt u zelf verder leren. documentatie en experimenteren met het aanpassen van de clusterparameters.

Als iets niet werkt, laat het ons dan zeker weten meld het ons het probleem. We lossen het snel op!

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster