Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como Bootstrap MySQL ou MariaDB Galera Cluster - Atualizado


Ao contrário do servidor MySQL padrão e do MySQL Cluster, a maneira de iniciar um MySQL/MariaDB Galera Cluster é um pouco diferente. O Galera requer que você inicie um nó em um cluster como um ponto de referência, antes que os nós restantes possam se unir e formar o cluster. Esse processo é conhecido como bootstrap de cluster. Bootstrapping é uma etapa inicial para introduzir um nó de banco de dados como componente principal, antes que outros o vejam como um ponto de referência para sincronizar dados.

Como funciona?


Quando o Galera inicia com o comando bootstrap em um nó, esse nó específico atingirá o estado Primário (verifique o valor de wsrep_cluster_status). Os nós restantes exigirão apenas um comando de inicialização normal e procurarão automaticamente o Componente Primário (PC) existente no cluster e se unirão para formar um cluster. A sincronização de dados ocorre por meio de transferência de estado incremental (IST) ou transferência de estado de instantâneo (SST) entre o associador e o doador.

Então, basicamente, você só deve inicializar o cluster se quiser iniciar um novo cluster ou quando nenhum outro nó no cluster estiver no estado PRIMARY. Deve-se tomar cuidado ao escolher a ação a ser executada, caso contrário você pode acabar com clusters divididos ou perda de dados.

Os cenários de exemplo a seguir ilustram quando inicializar um cluster de três nós com base no estado do nó (wsrep_local_state_comment) e no estado do cluster (wsrep_cluster_status):
Estado de Galera Fluxo de inicialização
  1. Reinicie o nó INITIALIZED.
  1. Reinicie o nó INITIALIZED.
  2. Depois de concluído, inicie o novo nó.
  1. Inicialize o nó mais avançado usando “pc.bootstrap=1”.
  2. Reinicie os nós restantes, um nó por vez.
  1. Inicie o novo nó.
  1. Inicie o novo nó, um nó por vez.
  1. Inicialize qualquer nó.
  2. Inicie os nós restantes, um nó por vez.

Como iniciar o Galera Cluster?


Os 3 fornecedores do Galera usam diferentes comandos de bootstrapping (com base na versão mais recente do software). No primeiro nó, execute:

  • Cluster MySQL Galera (Codificação):
    $ service mysql bootstrap # sysvinit
    $ galera_new_cluster # systemd
    $ mysqld_safe --wsrep-new-cluster # command line

  • Cluster Percona XtraDB (Percona):
    $ service mysql bootstrap-pxc # sysvinit
    $ systemctl start [email protected] # systemd

  • Cluster MariaDB Galera (MariaDB):
    $ service mysql bootstrap # sysvinit
    $ service mysql start --wsrep-new-cluster # sysvinit
    $ galera_new_cluster # systemd
    $ mysqld_safe --wsrep-new-cluster # command line

O comando acima é apenas um wrapper e o que ele realmente faz é iniciar a instância do MySQL nesse nó com gcomm:// como a variável wsrep_cluster_address. Você também pode definir manualmente as variáveis ​​dentro de my.cnf e executar o comando padrão start/restart. No entanto, não se esqueça de alterar wsrep_cluster_address novamente para conter os endereços de todos os nós após o início.

Quando o primeiro nó estiver ativo, execute o seguinte comando nos nós subsequentes:
$ service mysql start
$ systemctl start mysql

O novo nó se conecta aos membros do cluster conforme definido pelo parâmetro wsrep_cluster_address. Ele agora recuperará automaticamente o mapa de cluster e se conectará ao restante dos nós e formará um cluster.

Aviso:nunca inicialize quando quiser reconectar um nó a um cluster existente e NUNCA execute a inicialização em mais de um nó.

Sinalizador de segurança para inicialização


Galera a partir da versão 3.19 vem com um novo sinalizador chamado “safe_to_bootstrap” dentro do grastate.dat. Esse sinalizador facilita a decisão e evita escolhas inseguras ao acompanhar a ordem em que os nós estão sendo desligados. O nó que foi desligado por último será marcado como “Seguro para Bootstrap”. Todos os outros nós serão marcados como inseguros para bootstrap.

Olhando para o conteúdo grastate.dat (o padrão está em MySQL datadir) e você deve notar o sinalizador na última linha:
# GALERA saved state
version: 2.1
uuid:    8bcf4a34-aedb-14e5-bcc3-d3e36277729f
seqno:   2575
safe_to_bootstrap: 0

Ao inicializar o novo cluster, o Galera se recusará a iniciar o primeiro nó marcado como inseguro para inicializar. Você verá a seguinte mensagem nos logs:

“Pode não ser seguro inicializar o cluster a partir deste nó. Não foi o último a sair do cluster e pode não conter todas as atualizações.

Para forçar a inicialização do cluster com este nó, edite o arquivo grastate.dat manualmente e defina safe_to_bootstrap como 1 .”

Em caso de desligamento não limpo ou falha grave, todos os nós terão “safe_to_bootstrap:0”, então temos que consultar o mecanismo de armazenamento InnoDB para determinar qual nó realizou a última transação no cluster. Isso pode ser alcançado iniciando o mysqld com a variável “--wsrep-recover” em cada um dos nós, que produz uma saída como esta:
$ mysqld --wsrep-recover
...
2016-11-18 01:42:15 36311 [Note] InnoDB: Database was not shutdown normally!
2016-11-18 01:42:15 36311 [Note] InnoDB: Starting crash recovery.
...
2016-11-18 01:42:16 36311 [Note] WSREP: Recovered position: 8bcf4a34-aedb-14e5-bcc3-d3e36277729f:114428
...

O número após a string UUID na linha "Recovered position" é o que deve ser procurado. Escolha o nó que possui o maior número e edite seu grastate.dat para definir “safe_to_bootstrap:1”, conforme mostrado no exemplo abaixo:
# GALERA saved state
version: 2.1
uuid:    8bcf4a34-aedb-14e5-bcc3-d3e36277729f
seqno:   -1
safe_to_bootstrap: 1

Você pode então executar o comando bootstrap padrão no nó escolhido.

E se os nós tiverem divergido?


Em certas circunstâncias, os nós podem ter divergido uns dos outros. O estado de todos os nós pode se tornar Não-Primário devido à divisão da rede entre nós, falha do cluster ou se o Galera atingir uma exceção ao determinar o Componente Primário. Você precisará então selecionar um nó e promovê-lo a um Componente Primário.

Para determinar qual nó precisa ser inicializado, compare o valor wsrep_last_committed em todos os nós de banco de dados:
node1> SHOW STATUS LIKE 'wsrep_%';
+----------------------+-------------+
| Variable_name        | Value       |
+----------------------+-------------+
| wsrep_last_committed | 10032       |
...
| wsrep_cluster_status | non-Primary |
+----------------------+-------------+
node2> SHOW STATUS LIKE 'wsrep_%';
+----------------------+-------------+
| Variable_name        | Value       |
+----------------------+-------------+
| wsrep_last_committed | 10348       |
...
| wsrep_cluster_status | non-Primary |
+----------------------+-------------+
node3> SHOW STATUS LIKE 'wsrep_%';
+----------------------+-------------+
| Variable_name        | Value       |
+----------------------+-------------+
| wsrep_last_committed |   997       |
...
| wsrep_cluster_status | non-Primary |
+----------------------+-------------+

Das saídas acima, o node2 tem os dados mais atualizados. Nesse caso, todos os nós do Galera já foram iniciados, portanto, você não precisa necessariamente inicializar o cluster novamente. Só precisamos promover o node2 para ser um Componente Primário:
node2> SET GLOBAL wsrep_provider_options="pc.bootstrap=1";

Os nós restantes se reconectarão ao Componente Primário (node2) e ressincronizarão seus dados com base nesse nó.
Se você estiver usando o ClusterControl (experimente gratuitamente), poderá determinar o wsrep_last_committed e o wsrep_cluster_status diretamente de ClusterControl> Visão geral página:
Ou em ClusterControl> Desempenho> Status do banco de dados página: