Nous en avons déjà parlé
Intéressant? Alors s'il vous plaît, sous la coupe, nous vous dirons et vous montrerons tout.
Commençons par un exemple
Nous n'examinerons qu'une partie des fonctionnalités de notre rôle. Vous pouvez toujours trouver une description complète de toutes ses capacités et paramètres d'entrée dans
La cartouche Tarantool a api
и storage
, qui peut être attribué aux instances.
La cartouche elle-même ne dit rien sur la façon de lancer des processus, elle offre uniquement la possibilité de configurer des instances déjà en cours d'exécution. L'utilisateur doit faire le reste lui-même : organiser les fichiers de configuration, démarrer les services et configurer la topologie. Mais nous ne ferons pas tout cela ; Ansible le fera à notre place.
Des mots aux actes
Alors, déployons notre application sur deux machines virtuelles et mettons en place une topologie simple :
- Jeu de réplicas
app-1
mettra en œuvre le rôleapi
, qui inclut le rôlevshard-router
. Il n'y aura qu'un seul exemple ici. - Jeu de réplicas
storage-1
met en œuvre le rôlestorage
(et en même tempsvshard-storage
), nous ajouterons ici deux instances provenant de machines différentes.
Pour exécuter l'exemple dont nous avons besoin
Le rôle lui-même est dans
Clonons le référentiel avec un exemple :
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Nous élevons des machines virtuelles :
$ vagrant up
Installez le rôle ansible de la cartouche Tarantool :
$ ansible-galaxy install tarantool.cartridge,1.0.1
Lancez le rôle installé :
$ ansible-playbook -i hosts.yml playbook.yml
Nous attendons que le playbook termine son exécution, accédez à
Vous pouvez télécharger des données. Cool, non ?
Voyons maintenant comment utiliser cela tout en ajoutant un autre jeu de réplicas à la topologie.
Commençons à comprendre
Alors, qu'est-ce-qu'il s'est passé?
Nous avons configuré deux machines virtuelles et lancé un playbook ansible qui a configuré notre cluster. Regardons le contenu du fichier 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
Rien d'intéressant ne se passe ici, lançons un rôle ansible appelé tarantool.cartridge
.
Toutes les choses les plus importantes (à savoir la configuration du cluster) se trouvent dans 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:
Tout ce dont nous avons besoin est d'apprendre à gérer les instances et les jeux de réplicas en modifiant le contenu de ce fichier. Ensuite, nous y ajouterons de nouvelles sections. Afin de ne pas savoir où les ajouter, vous pouvez consulter la version finale de ce fichier, hosts.updated.yml
, qui se trouve dans le référentiel d'exemple.
Gestion des instances
En termes Ansible, chaque instance est un hôte (à ne pas confondre avec un serveur matériel), c'est-à-dire le nœud d'infrastructure qu'Ansible gérera. Pour chaque hôte, nous pouvons spécifier des paramètres de connexion (tels que ansible_host
и ansible_user
), ainsi que la configuration de l'instance. La description des instances est dans la section hosts
.
Regardons la configuration de l'instance storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
En variable config
nous avons spécifié les paramètres de l'instance - advertise URI
и HTTP port
.
Ci-dessous les paramètres de l'instance app-1
и storage-1-replica
.
Nous devons indiquer à Ansible les paramètres de connexion pour chaque instance. Il semble logique de regrouper les instances en groupes de machines virtuelles. A cet effet, les instances sont regroupées en groupes host1
и host2
, et dans chaque groupe de la section vars
les valeurs sont indiquées ansible_host
и ansible_user
pour une machine virtuelle. Et dans la rubrique hosts
— les hôtes (c'est-à-dire les instances) qui sont inclus dans ce groupe :
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:
Nous commençons à changer hosts.yml
. Ajoutons deux autres instances, storage-2-replica
sur la première machine virtuelle et storage-2
Sur la seconde :
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: # <==
...
Lancez le playbook ansible :
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Veuillez noter l'option --limit
. Étant donné que chaque instance de cluster est un hôte en termes Ansible, nous pouvons spécifier explicitement quelles instances doivent être configurées lors de l'exécution du playbook.
Revenir à l'interface utilisateur Web
Ne nous arrêtons pas là et maîtrisons la gestion de la topologie.
Gestion de la topologie
Combinons nos nouvelles instances dans un jeu de répliques storage-2
. Ajoutons un nouveau groupe replicaset_storage_2
et décrire les paramètres du réplicaset dans ses variables par analogie avec replicaset_storage_1
. Dans la section hosts
Indiquons quelles instances seront incluses dans ce groupe (c'est-à-dire notre jeu de réplicas) :
---
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:
Reprenons le playbook :
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
En paramètre --limit
Cette fois nous avons passé le nom du groupe qui correspond à notre réplicaset.
Considérons l'option tags
.
Notre rôle effectue séquentiellement diverses tâches, qui sont marquées par les balises suivantes :
cartridge-instances
: gestion des instances (configuration, connexion à l'adhésion) ;cartridge-replicasets
: gestion de la topologie (gestion des réplicasets et suppression définitive (expel) des instances du cluster) ;cartridge-config
: gestion des autres paramètres du cluster (vshard bootstrapping, mode de basculement automatique, paramètres d'autorisation et configuration de l'application).
Nous pouvons spécifier explicitement quelle partie du travail nous voulons effectuer, le rôle ignorera alors le reste des tâches. Dans notre cas, nous souhaitons travailler uniquement avec la topologie, nous avons donc précisé cartridge-replicasets
.
Évaluons le résultat de nos efforts. Nous trouvons un nouveau jeu de répliques sur
Hourra!
Essayez de modifier la configuration des instances et des jeux de réplicas et voyez comment la topologie du cluster change. Vous pouvez essayer différents scénarios opérationnels, par ex. memtx_memory
. Le rôle tentera de le faire sans redémarrer l'instance afin de réduire les éventuels temps d'arrêt de votre application.
N'oublie pas de courir vagrant halt
pour arrêter les machines virtuelles lorsque vous avez fini de travailler avec elles.
Qu'y a-t-il sous le capot?
Ici, je vais vous en dire plus sur ce qui se passait sous le capot du rôle ansible lors de nos expériences.
Examinons le déploiement de l'application Cartouche étape par étape.
Installation du package et démarrage des instances
Vous devez d’abord livrer le package au serveur et l’installer. Actuellement, le rôle peut fonctionner avec les packages RPM et DEB.
Ensuite, nous lançons les instances. Tout est très simple ici : chaque instance est une instance distincte systemd
-service. Je vais vous donner un exemple :
$ systemctl start myapp@storage-1
Cette commande lancera l'instance storage-1
приложения myapp
. L'instance lancée recherchera son /etc/tarantool/conf.d/
. Les journaux d'instance peuvent être consultés à l'aide de journald
.
Fichier unité /etc/systemd/system/[email protected]
pour le service systemd sera livré avec le package.
Ansible a des modules intégrés pour installer des packages et gérer les services systemd ; nous n'avons rien inventé de nouveau ici.
Configuration d'une topologie de cluster
C'est là que le plaisir commence. D'accord, il serait étrange de s'embêter avec un rôle Ansible spécial pour installer des packages et exécuter systemd
-prestations de service.
Vous pouvez configurer le cluster manuellement :
- Première option : ouvrez l'interface Web et cliquez sur les boutons. C’est tout à fait adapté au démarrage ponctuel de plusieurs instances.
- Deuxième option : vous pouvez utiliser l'API GraphQl. Ici, vous pouvez déjà automatiser quelque chose, par exemple écrire un script en Python.
- Troisième option (pour les volontaires) : allez sur le serveur, connectez-vous à l'une des instances en utilisant
tarantoolctl connect
et effectuez toutes les manipulations nécessaires avec le module Luacartridge
.
La tâche principale de notre invention est de faire exactement cela, la partie la plus difficile du travail pour vous.
Ansible vous permet d'écrire votre propre module et de l'utiliser dans un rôle. Notre rôle utilise de tels modules pour gérer divers composants du cluster.
Comment ça fonctionne? Vous décrivez l'état souhaité du cluster dans une configuration déclarative, et le rôle fournit à chaque module sa section de configuration en entrée. Le module reçoit l'état actuel du cluster et le compare avec ce qui a été reçu en entrée. Ensuite, un code est lancé via le socket de l'une des instances, ce qui amène le cluster à l'état souhaité.
Les résultats de
Aujourd'hui, nous avons expliqué et montré comment déployer votre application sur Tarantool Cartouche et mettre en place une topologie simple. Pour ce faire, nous avons utilisé Ansible - un outil puissant, simple à utiliser et permettant de configurer simultanément de nombreux nœuds d'infrastructure (dans notre cas, des instances de cluster).
Ci-dessus, nous avons examiné l'une des nombreuses façons de décrire une configuration de cluster à l'aide d'Ansible. Une fois que vous vous sentez prêt à passer à autre chose, explorez group_vars
и host_vars
.
Très prochainement, nous vous expliquerons comment supprimer (expulser) définitivement des instances de la topologie, amorcer vshard, gérer le mode de basculement automatique, configurer l'autorisation et corriger la configuration du cluster. En attendant, vous pouvez étudier seul
Si quelque chose ne fonctionne pas, assurez-vous de
Source: habr.com