O post foi preparado por membros da equipe do Yandex.Cloud: Ivan Vetkasov - arquiteto, Leonid Klyuyev - editor
Recentemente, falamos sobre a arquitetura do Yandex.Cloud . Agora vamos passar da teoria para a prática. Existem vários serviços na nuvem para controle automatizado do DBMS: Serviço Gerenciado para ClickHouse, Serviço Gerenciado para PostgreSQL e Serviço Gerenciado para MongoDB. Todos eles são baseados em plataforma e permitem que você se concentre na tarefa de armazenamento de dados, e não na administração da infraestrutura. Mas às vezes é importante controlar também as máquinas virtuais de cluster. Por exemplo, uma tarefa de dimensionamento pode surgir em resposta a um aumento ou diminuição da carga. Normalmente, esse cenário é um dos que consomem mais tempo do ponto de vista prático. Hoje, mostraremos como o Yandex.Cloud permite automatizar tarefas complexas de dimensionamento e garantir que o banco de dados permaneça disponível no processo de redimensionamento do cluster.
Declaração do problema
Ao criar um cluster de cada serviço, o usuário pode determinar o número de hosts do cluster e a zona de disponibilidade (AZ), que corresponde ao datacenter físico. Agora, o Yandex.Cloud usa três datacenters Yandex localizados na região central da Rússia. Portanto, a configuração recomendada é o cluster DBMS com três hosts - o mais consistente com os princípios de construção de uma arquitetura à prova de falhas e resistente a desastres.
Imagine uma situação em que a carga no cluster DBMS excedeu os recursos do banco de dados e chegou a hora de adicionar recursos de computação. Isso pode ser feito horizontalmente - adicionando hosts ao cluster e verticalmente - adicionando recursos a cada máquina de cluster. Considere a segunda opção, como a que consome mais tempo e corre o risco de erros. Por que essa opção é trabalhosa? Porque no caso geral, o procedimento para adicionar recursos será mais ou menos assim: alterne a função do host; se necessário, pare o DBMS; desligue a máquina virtual; alterar sua configuração; nós começamos; alterar parâmetros do DBMS; nós começamos um DBMS; Estamos aguardando a sincronização das alterações de dados acumulados. E assim, para todos os três hosts, por sua vez. Muitas etapas - o risco de erros é alto. Você pode automatizar esse processo - somente antes de iniciar a solução de automação selecionada deve ser testada. Geralmente, não há tempo suficiente para o teste, mas no Yandex.Cloud ele é executado rapidamente e sem ações desnecessárias de sua parte. Vamos começar.
Etapas preliminares e processo de teste
Para a preparação, precisaremos de:
- Acesso à plataforma. Agora qualquer pessoa pode configurar um período de avaliação no site Yandex.Cloud .
- Uma rede em nuvem (vou chamá-la de testvpc no meu exemplo) e três sub-redes localizadas em AZs diferentes. Os intervalos de endereços de sub-rede nesse caso não são importantes.
- Host bastião. Apesar de no Yandex.Cloud você poder abrir acesso externo ao DBMS via IP público, publicar um DBMS no domínio público não é a decisão certa. Portanto, adicionamos um host bastião ao esquema, a partir do qual abriremos conexões com os hosts. Como host, você pode usar uma máquina com uso parcial (5%) do kernel. O Clickhouse-client deve estar instalado na máquina virtual. Além disso, de acordo com as instruções para conectar- se ao serviço, você precisa baixar um certificado SSL.
- CLI Trabalharemos com o Yandex.Cloud não através do console, mas através do utilitário de linha de comando, que também precisa ser instalado e iniciado de acordo com a documentação .
O cenário de teste será simples: abra três sessões conectando o host bastião a cada host do cluster do banco de dados, execute a consulta SQL em um ciclo com um período de, digamos, 1 segundo, após o qual enviamos um comando para dimensionar o cluster e observar o comportamento do sistema.
Momento da verdade
Selecione um DBMS para demonstrar a escala. No PostgreSQL, os hosts recebem funções, mas o serviço ainda não possui uma comutação transparente ao escalar - essa funcionalidade está em nossos planos. Como, de outro modo, a mecânica de aumentar e diminuir o cluster é aproximadamente a mesma no caso dos três DBMSs, por exemplo, use o ClickHouse.
Vamos criar um objeto de experiência - um cluster que consiste em três hosts localizados em diferentes sub-redes virtuais. Para fazer isso, digite o comando
yc managed-clickhouse cluster create
com os argumentos necessários. A ordem dos argumentos corresponde à sua listagem na saída de "yc --help". A essência do comando é simples: criamos um cluster de redimensionar em um ambiente de produção com o testvpc localizado na rede virtual, definimos um nome e uma senha, 10 gigabytes de espaço em disco e a classe mínima s1.nano. As seguintes características correspondem a esta classe: 1 CPU, 4 GB RAM. No futuro, para o dimensionamento, passaremos para a classe s1.micro, para que o número de CPU e RAM dobre. Para descobrir quais outras classes de host você pode atribuir, basta digitar o comando
yc managed-clickhouse resource-preset list
.
Portanto, o comando para criar o cluster deve ser o seguinte:
yc managed-clickhouse cluster create --name ch-to-resize --environment production --network-name testvpc --host zone-id=ru-central1-a,subnet-id=e9bfnjacigdo9p6j7j2s,assign-public-ip=false,type=clickhouse --host zone-id=ru-central1-b,subnet-id=e2l8iamol3b9mrtskb8q,assign-public-ip=false,type=clickhouse --host zone-id=ru-central1-c,subnet-id=b0c6qit7u9e8r0egedvj,assign-public-ip=false,type=clickhouse --user name=test,password=test123123 --database name=testdb --clickhouse-disk-size 10 --clickhouse-resource-preset s1.nano --clickhouse-disk-type network-nvme –async
Em resposta, obtemos o ID do cluster e uma lista de nomes de host de seus hosts:
yc managed-clickhouse cluster list +----------------------+--------------+-----------------------------+--------+---------+ | ID | NAME | CREATED AT | HEALTH | STATUS | +----------------------+--------------+-----------------------------+--------+---------+ | c9q7cr4ji2fe462qej8p | ch-to-resize | 2018-12-10T08:59:09.100272Z | ALIVE | RUNNING | +----------------------+--------------+-----------------------------+--------+---------+ yc managed-clickhouse host list --cluster-id c9q7cr4ji2fe462qej8p +-------------------------------------------+----------------------+---------+---------------+ | NAME | CLUSTER ID | HEALTH | ZONE ID | +-------------------------------------------+----------------------+---------+---------------+ | rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-a | | rc1a-sgxazra54xv6lhni.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-a | | rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-b | | rc1b-j1rtvsuz6t8x6ev2.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-b | | rc1c-emo0f2990povj7ie.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | UNKNOWN | ru-central1-c | | rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net | c9q7cr4ji2fe462qej8p | ALIVE | ru-central1-c | +-------------------------------------------+----------------------+---------+---------------+
Vamos abrir uma conexão com cada host e executar uma consulta no banco de dados:
clickhouse-client --host rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive\!') from system.clusters where replica_num = 1" clickhouse-client --host rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive!') from system.clusters where replica_num = 2" clickhouse-client --host rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net --secure --user test --password test123123 --database testdb --port 9440 -q "select concat(host_name, ' is alive\!') from system.clusters where replica_num = 3"
Por fim, envie uma solicitação para aumentar o cluster:
yc managed-clickhouse cluster update --id c9q7cr4ji2fe462qej8p --clickhouse-resource-preset s1.micro -–async
Explicação de redução de clusterSe queremos reduzir, em vez de aumentar a quantidade de recursos, precisamos especificar uma classe menor, referindo-se à saída
yc managed-clickhouse resource-preset list
- por exemplo, s1.nano. Ao mesmo tempo, a estrutura da equipe em si permanece a mesma.
Redirecionei a saída da consulta para um arquivo. Aqui está uma lista abreviada:
rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net Mon Dec 10 12:47:35 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:36 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:37 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:38 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:39 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:47:40 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:47:51 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:02 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.7:9440: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:11 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:12 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:13 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:14 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:15 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:16 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:17 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net:9440, 192.168.58.7) Mon Dec 10 12:48:18 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:48:19 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! Mon Dec 10 12:48:20 UTC 2018 rc1c-wcxq53lq096m0o6h.mdb.yandexcloud.net is alive! rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net: Mon Dec 10 12:50:58 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:59 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:00 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:01 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:12 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:23 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:34 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.6:9440: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:35 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:36 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:37 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:38 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:39 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:40 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:41 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:42 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:43 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net:9440, 192.168.58.6) Mon Dec 10 12:51:44 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:45 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! Mon Dec 10 12:51:46 UTC 2018 rc1a-qysm9t78x5ybdb78.mdb.yandexcloud.net is alive! rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net: Mon Dec 10 12:49:15 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:16 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:17 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:18 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:49:19 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:30 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:41 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:52 UTC 2018 Code: 209. DB::NetException: Timeout: connect timed out: 192.168.58.8:9440: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:56 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:57 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:58 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:49:59 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:00 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:01 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:03 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:04 UTC 2018 Code: 210. DB::NetException: Connection refused: (rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net:9440, 192.168.58.8) Mon Dec 10 12:50:05 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:06 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive! Mon Dec 10 12:50:07 UTC 2018 rc1b-2t82xtpscgr4gi6j.mdb.yandexcloud.net is alive!
A lista mostra os momentos em que cada host do cluster está desativado (quando o tempo limite da conexão é iniciado), os momentos em que o host está ativado e o ClickHouse começa a carregar (quando a conexão recusada é iniciada) e também os momentos em que o host volta a funcionar. O mais importante é a separação dos períodos em que os hosts não estavam disponíveis. Durante o dimensionamento, pelo menos dois hosts estavam disponíveis para execução da consulta. Isso pode ser visto no gráfico:

Conclusões e melhores práticas
À primeira vista, o desenvolvimento de projetos com bancos de dados inclui uma grande quantidade de trabalho rotineiro. O banco de dados precisa ser mantido, ou seja, para criar cópias de backup, para estabelecer o processo de atualização regular do DBMS, etc. Os serviços de gerenciamento em nuvem apareceram principalmente para remover essas funções demoradas de você. No entanto, em um ambiente de produção real, é útil que os sistemas sejam não apenas gerenciáveis do ponto de vista do serviço, mas também flexíveis - respondendo a cargas crescentes e decrescentes. Falamos sobre como aumentar o desempenho do banco de dados no Yandex.Cloud, mantendo a capacidade de trabalho do projeto para os usuários. Se o banco de dados estiver configurado corretamente, com o aumento do tráfego, haverá um aumento na quantidade de recursos disponíveis e uma recessão - uma diminuição múltipla, o que também reduz seus custos.
Sobre quais abordagens, ferramentas ou tecnologias baseadas na nuvem você gostaria de aprender? Sugira tópicos nos comentários para as seguintes postagens do Yandex.Cloud.