Implantando aplicativos do cartucho Tarantool sem esforço (parte 1)



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 myapp
aplicaçã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!

Source: https://habr.com/ru/post/pt480468/


All Articles