
Já apresentamos o
Tarantool Cartridge que permite desenvolver e compactar aplicativos distribuídos. Agora vamos aprender como implantar e controlar esses aplicativos. Sem pânico, está tudo sob controle! Reunimos todas as melhores práticas de trabalho com o Tarantool Cartridge e escrevemos uma
função Ansible , que implantará o pacote nos servidores, iniciará e ingressará instâncias em conjuntos de réplicas, configurará a autorização, iniciará o bootstrap vshard, habilitará a configuração automática de failover e cluster de patches.
Interessante, hein? Mergulhe, verifique os detalhes sob o corte.
Começando com uma amostra
Vamos orientá-lo através de apenas algumas das funções da função. Você sempre pode encontrar uma descrição completa de todos os seus recursos e parâmetros de entrada na
documentação . No entanto, tentar uma vez é melhor do que vê-lo centenas de vezes, então vamos implantar um aplicativo pequeno.
O Tarantool Cartridge tem um
tutorial para criar um pequeno aplicativo de cartucho que armazena informações sobre clientes bancários e suas contas, além de fornecer uma API para gerenciamento de dados via HTTP. Para esse fim, o aplicativo descreve duas funções possíveis que podem ser atribuídas às instâncias:
api e
storage .
O cartucho em si não diz nada sobre como iniciar processos - apenas fornece uma oportunidade para configurar as instâncias em execução. Portanto, o restante depende do usuário: distribuir arquivos de configuração, executar serviços e configurar topologia. Mas não vamos fazer tudo isso - o Ansible fará isso por nós.
Começando à ação
Primeiro, vamos implantar nosso aplicativo em duas máquinas virtuais e configurar uma topologia simples:
- O conjunto de réplicas
app-1 representará a função da api que contém a função vshard-router . Haverá apenas uma instância. - O conjunto de réplicas
storage-1 representará a função de storage (incluindo a função vshard-storage ) - aqui adicionaremos duas instâncias de máquinas diferentes.

Para executar a amostra, precisaremos do
Vagrant e do
Ansible (versão 2.8 ou superior).
A função em si é armazenada no
Ansible Galaxy - um repositório que permite compartilhar seu trabalho e usar as funções prontas.
Agora clone o repositório de amostra:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git $ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Em seguida, implante as máquinas virtuais:
$ vagrant up
Depois disso, instale a função Ansible do cartucho Tarantool:
$ ansible-galaxy install tarantool.cartridge,1.0.1
E inicie a função instalada:
$ ansible-playbook -i hosts.yml playbook.yml
Agora aguarde até o processo do manual terminar, vá para
http: // localhost: 8181 / admin / cluster / dashboard e aproveite os resultados:
Você pode fazer o upload dos dados agora. Incrível, não é?
Agora vamos descobrir como trabalhar com ele, e também podemos adicionar outro conjunto de réplicas à topologia.
Aprofundando-se nos detalhes
Então o que aconteceu?
Colocamos em funcionamento duas máquinas virtuais e lançamos o manual Ansible que configurou nosso cluster. Agora, vamos olhar dentro do arquivo
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
Nada de interessante acontece aqui; vamos iniciar o papel
tarantool.cartridge chamado
tarantool.cartridge .
O mais importante (a configuração do cluster) está no arquivo de inventário
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:
Tudo o que precisamos fazer é aprender a gerenciar instâncias e conjuntos de réplicas modificando esse arquivo. Mais tarde, adicionaremos novas seções a ele. Para evitar confusão ao adicionar as seções, observe a versão final deste arquivo ou
hosts.updated.yml , que está localizado no repositório de amostra.
Gerenciando as instâncias
Em termos Ansible, cada instância é um host (não deve ser confundido com um servidor físico), ou seja, o nó de infraestrutura que o Ansible gerenciará. Para cada host, podemos especificar parâmetros de conexão (como
ansible_host e
ansible_user ) e configuração da instância. A descrição da instância está na seção
hosts .
Vamos examinar a configuração da instância
storage-1 :
all: vars: ... # INSTANCES hosts: storage-1: config: advertise_uri: '172.19.0.2:3301' http_port: 8181 ...
Na variável de
config , especificamos os parâmetros da instância:
advertise URI e
HTTP port .
Abaixo estão os parâmetros das instâncias
app-1 e
storage-1-replica .
Devemos fornecer ao Ansible parâmetros de conexão para cada instância. Parece razoável agrupar as instâncias por máquinas virtuais. Para esse propósito, as instâncias são agrupadas em
host1 e
host2 , e cada grupo na seção
vars contém os valores de parâmetro
ansible_user e
ansible_user para uma única máquina virtual. E a seção
hosts contém hosts (ou instâncias) incluídos neste grupo:
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:
Vamos começar a editar o
hosts.yml . Agora, adicionamos mais duas instâncias:
storage-2-replica na primeira máquina virtual e
storage-2 na segunda:
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: # <== ...
Inicie o manual do Ansible:
$ ansible-playbook -i hosts.yml \ --limit storage-2,storage-2-replica \ playbook.yml
Observe a opção
--limit . Como cada instância de cluster é um host em termos de Ansible, podemos especificar explicitamente quais instâncias devem ser configuradas ao executar o manual.
Então, voltamos à interface do usuário da web em
http: // localhost: 8181 / admin / cluster / dashboard e examinamos nossas novas instâncias:
Em seguida, vamos dominar o gerenciamento de topologia.
Gerenciando a Topologia
Vamos agrupar nossas novas instâncias no conjunto de réplicas
storage-2 , adicionar um novo grupo de
replicaset_storage_2 e descrever os parâmetros do conjunto de réplicas nas variáveis, como fizemos para
replicaset_storage_1 . Na seção
hosts , especificamos quais instâncias devem ser incluídas neste grupo (ou seja, nosso conjunto 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:
Em seguida, executamos o manual novamente:
$ ansible-playbook -i hosts.yml \ --limit replicaset_storage_2 \ --tags cartridge-replicasets \ playbook.yml
Desta vez, passamos o nome do grupo correspondente à nossa réplica definida no parâmetro
--limit .
Vamos olhar para a opção de
tags .
Nossa função executa sucessivamente várias tarefas marcadas com as seguintes tags:
cartridge-instances : gerenciamento de instância (configuração, associação);cartridge-replicasets : gerenciamento de topologia (gerenciamento de conjunto de réplicas e remoção permanente (expulsão) de instâncias do cluster);cartridge-config : controle de outros parâmetros do cluster (inicialização vshard, failover automático, parâmetros de autorização e configuração do aplicativo).
Podemos especificar explicitamente que parte do trabalho queremos fazer - e a função pulará o restante das tarefas. Nesse caso, queremos apenas trabalhar com topologia, por isso especificamos conjuntos
cartridge-replicasets .
Vamos avaliar o resultado de nossos esforços. Localize o novo conjunto de réplicas em
http: // localhost: 8181 / admin / cluster / dashboard .
Yay
Tente alterar a configuração das instâncias e conjuntos de réplicas e veja como a topologia do cluster é alterada. Você pode tentar diferentes casos de uso, como
atualização sem memtx_memory ou aumento do
memtx_memory . A função tentaria fazer isso sem reiniciar a instância para reduzir o possível tempo de inatividade do seu aplicativo.
Não se esqueça de
vagrant halt a interrupção das máquinas virtuais quando terminar com elas.
O que tem dentro?
Aqui vou contar mais sobre o que aconteceu sob o capô do papel Ansible durante nossos testes.
Vamos considerar as etapas de implantação de um aplicativo de cartucho.
Instalando o Pacote e Iniciando as Instâncias
A primeira coisa a fazer é entregar o pacote no servidor e instalá-lo. Agora, a função pode trabalhar com pacotes RPM e pacotes DEB.
Em seguida, lançamos as instâncias. É muito simples: cada instância é um serviço
systemd separado. Por exemplo:
$ systemctl start myapp@storage-1
Este comando inicia a instância
storage-1 do
myappaplicação. A instância em execução procura sua
configuração em
/etc/tarantool/conf.d/ . Você pode visualizar os logs da instância usando o
journald .
O arquivo da unidade
/etc/systemd/systemd/myapp@.sevice para o serviço systemd é entregue com o pacote.
O Ansible possui módulos internos para instalação de pacotes e gerenciamento de serviços systemd; portanto, não inventamos nada de novo aqui.
Configurando a Topologia de Cluster
As coisas mais emocionantes acontecem aqui. Tenho certeza que você concorda que é estranho se preocupar com uma função Ansible especial para instalar pacotes e executar serviços
systemd .
Você pode configurar o cluster manualmente:
- A primeira opção é abrir a interface do usuário da Web e clicar nos botões. É bastante adequado para uma inicialização única de várias instâncias.
- A segunda opção é usar a API GraphQL. Aqui você já pode automatizar algo, por exemplo, escrever um script em Python.
- A terceira opção é para os corajosos: vá ao servidor, conecte-se a uma das instâncias com a ajuda do
tarantoolctl connect e execute todas as ações necessárias com o módulo Lua do cartridge .
A principal tarefa de nossa invenção é fazer essa parte mais difícil do trabalho para você.
O Ansible permite que você escreva seu próprio módulo e use-o em sua função. Nossa função usa esses módulos para gerenciar os vários componentes do cluster.
Como isso funciona? Você descreve o estado desejado do cluster em uma configuração declarativa e a função fornece a cada módulo sua própria seção de configuração como entrada. O módulo recebe o estado atual do cluster e o compara com a entrada. Em seguida, o código para o estado de cluster necessário é iniciado usando o soquete de uma das instâncias.
Resultados
Hoje, mostramos como implantar seu aplicativo Tarantool Cartridge e configurar uma topologia simples. Para fazer isso, usamos o Ansible, uma ferramenta poderosa que é fácil de usar e permite configurar vários nós de infraestrutura ao mesmo tempo (no nosso caso, as instâncias do cluster).
Acima, examinamos uma das muitas maneiras de descrever a configuração do cluster por meio do Ansible. Depois de sentir que está pronto para mais, aprenda as
melhores práticas para escrever playbooks. Você pode achar mais fácil gerenciar a topologia com
group_vars e
host_vars .
Em breve, mostraremos como remover permanentemente (expulsar) instâncias da topologia, inicializar vshard, gerenciar failover automático, configurar autorização e configurar o cluster de patches. Enquanto isso, você pode revisar a
documentação e tentar alterar as configurações do cluster.
Se algo der errado,
informe-nos sobre o problema. Faremos o nosso melhor para resolver qualquer problema!