Conheça o MySQL Fabric

Neste artigo iremos conhecer e entender o que é o MySQL Fabric e em qual situações podemos utilizá-lo. Também falaremos sobre as melhores práticas na configuração, instalação e monitoramento do MySQL com o MySQL Fabric.

Gerenciamento de Grupos de Bancos de Dados MySQL com MySQL Fabric

O MySQL Fabric torna mais simples o gerenciamento de grupos de bancos de dados MySQL. Você pode e deve utilizar o MySQL Fabric sempre que precisar de uma solução de alta disponibilidade para o seu ambiente produtivo. Além disso, ele provê failover automático e detecção de falhas.
Apesar de o MySQL Fabric prover o “database sharding”, neste artigo iremos abordar apenas a parte da alta disponibilidade do Fabric. Essa parte, basicamente, organiza os servidores MySQL em grupos, ou comumente conhecido como “high-availability groups”, para proporcionar alta disponibilidade. Por exemplo, se você está utilizando uma replicação padrão assíncrona, o Fabric pode ser configurado para monitorar automaticamente o estado dos servidores em um determinado grupo. Nesse caso, se o “Master” atual do grupo falhar, o Fabric elege um novo servidor no grupo para se tornar o “Master”. Mas caso você queira, também é possível realizar o failover de forma manual.

Para utilizar o MySQL Fabric, será necessário utilizar um conector MySQL na aplicação (disponível para download no site do MySQL), que utilize o protocolo XML-RPC. Atualmente, o Python Driver (Connector/Python) e JDBC Driver (Connector/J) são “fabric-aware”, ou seja, estão prontos para o Fabric.

Saiba mais: JDBC tutorial

O MySQL Fabric não trabalha sozinho. As informações de todos os servidores e grupos são gerenciadas por uma instância MySQL separada, que é utilizada como uma espécie de “repositório” do Fabric. Essa instância é chamada de “Backing Store” e não pode fazer parte de nenhum grupo de servidores os chamados “high-availability group”. Já as instâncias MySQL gerenciadas pelo Fabric, precisam ter o “Global Transaction Identifiers” (GTID) habilitado. Esse parâmetro é utilizado pelo Fabric para checar e manter a consistência entre os servidores. O MySQL Fabric organiza os servidores em “high-availability groups” para gerenciar diferentes “shards” ou simplesmente proporcionar alta disponibilidade, que é o assunto que iremos abordar aqui.

Quando utilizamos a tecnologia de master/slave, o Fabric pode ser configurado para trabalhar monitorando o estado atual de cada instância para gerenciar quem é o atual “Master”. Por exemplo, se estiver utilizando uma replicação padrão assíncrona, o Fabric monitora o status de cada servidor no grupo. Então, em caso de falha do “Master”, o Fabric elege um novo servidor no grupo para se tornar o “Master”, tudo isso de forma automática.

Para quem está familiarizado com a solução de alta disponibilidade do Oracle Database, o “Oracle Dataguard”, estará mais familiarizado com o MySQL Fabric pois ele tem um papel muito semelhante ao “Broker” do Oracle Dataguard, provendo o failover/switchover de forma manual ou automática.

Assim como no “Broker”, temos a ferramenta DGMGRL para efetuar comandos e administrar a replicação entre os Oracle Databases. No MySQL Fabric utilizamos a ferramenta chamada “mysqlfabric” que segue o mesmo propósito. Com esta ferramenta é possível executar diversas operações, tais como criar e gerenciar grupos, verificar o status da replicação, fazer switchover/failover e várias outras operações.

No exemplo a seguir faremos uma demonstração de como funciona o MySQL Fabric. Para isso iremos utilizar a versão do Linux RHEL x.x, rodando o MySQL 5.7 para ser o repositório (“Backing Store”) do MySQL Fabric.

O MySQL Fabric

No Linux, o MySQL Fabric fica dentro do pacote rpm “MySQL Utilities” disponível para download na página principal (seção Links). Portanto, basta instalar esse pacote que o MySQL Fabric estará instalado, pronto para configuração.

Conceitos Gerais

Para entender o MySQL Fabric, primeiramente precisamos apresentar uma terminologia usada pelo projeto. Começaremos listando definições básicas e, em seguida, entraremos em mais detalhes quando necessário.

Grupo

Um servidor aqui é realmente uma instância do mysqld, embora idealmente, todas as instâncias de um grupo devem estar em servidores diferentes. No entanto, durante o teste, você pode criar várias instâncias no mesmo host, uma vez que você realmente não precisa de HA (High Availability Group).

Um determinado servidor só pode fazer parte de um único grupo. Isso pode parecer confuso no início, mas quando você percebe que o MySQL Fabric depende da replicação (usando GTID) para a maior parte de seu trabalho, fica mais claro. Um determinado servidor MySQL só pode ter um mestre e, portanto, não faz sentido para ele pertencer a vários grupos.

Os grupos têm identificadores, que são apenas nomes simbólicos que precisam cumprir algumas regras básicas

Note que um nó não é um servidor MySQL que faz parte de um grupo. É um programa python que, entre outras coisas, fornece o servidor XML-RPC que é usado por conectores especiais e pelo cliente de linha de comando "mysqlfabric". No entanto, um nó precisará de uma instância do mysqld. Esta instância é chamada de backend store e será usada pelo MySQL Fabric para salvar todas as informações necessárias para gerenciar os servidores.

Primário

O servidor primário é o único servidor gravável em um grupo. Isso se aplica ao HA, não ao sharding, embora você possa definir um grupo (e, portanto, um Primary) por shard e, portanto, usar o MySQL Fabric tanto para sharding, quanto para fornecer HA para cada shard.

Secundário

Um servidor secundário é um membro de um grupo que está disponível para substituir um servidor primário no failover e que é somente leitura. Também pode ser usado para dimensionar leituras.

Usuários

O MySQL Fabric pode utilizar quatro tipos diferentes de usuários com privilégios específicos para atividades de cada um deles, que são:

Nota. Privilégios e Usuários: É possível utilizar o mesmo usuário MySQL para utilizar como “server user”, “backup user” e “restore user”, porém nesse caso o usuário teria uma soma de privilégios dos três usuários, que o deixaria com muitos privilégios, o que não é recomendado para utilizar em produção.

Nesse exemplo, iremos ver como baixar o pacote de instalação do MySQL Fabric, efetuar a criação dos usuários mencionados acima, que farão parte da configuração. Veremos também a criação do grupo de monitoração da replicação, adição das instâncias a serem gerenciadas pelo Fabric ao group de HA, promover um slave a Master, checar a integridade da replicação.

Baixando o MySQL Fabric

Para fazer o download do MySQL Fabric utilize o link da seção Links. Os downloads estão em pacotes e podem ser baixados para vários tipos de servidores e sistemas operacionais. Baixe o pacote que corresponde à sua plataforma e extraia os arquivos em uma pasta de sua preferência, conforme mostra a Figura 1.

Figura 1. Página onde é possível realizar o download do pacote de instalação do MySQL Fabric

O site acima também fornece os conectores MySQL Fabric-aware. Faça o download do conector que você deseja usar com um aplicativo MySQL Fabric. Para obter mais informações sobre como instalar e começar a usar o MySQL Fabric em seus aplicativos, consulte a seção específica do conector apropriada

Instalando o MySQL Fabric

O MySQL Fabric/Utilities requer o Python 2.6 instalado. Para facilitar o processo você também poderá configurar o YUM (instruções de como configurá-lo na seção Links) para fazer o download e instalar automaticamente as dependências de pacotes, conforme mostra a Figura 2.

Figura 2. Download do Pacote de instalação do MySQL Fabric (utilities) utilizando o yum

Configurando o MySQL Fabric

A primeira coisa que iremos precisar para iniciar a configuração do Fabric é um usuário no servidor (instância) que iremos utilizar como o “Backing Store” ou “Repositorio” do Fabric. As informações dessa conta ficam armazenadas no arquivo de configuração fabric.cfg na sessão de [storage], conforme mostra a Figura 3.

Figura 3. Configuração das informações do usuário do backing store

O usuário que criaremos para o backing store, necessita dos seguintes privilégios (Nota do DevMan 1) no database do backing store:

A Listagem 1 mostra um exemplo de criação do usuário.

Listagem 1. Exemplo de criação do usuário.
CREATE USER "fabric"@"localhost" IDENTIFIED BY "secret"; GRANT ALTER, CREATE, CREATE VIEW, DELETE, DROP, EVENT, INDEX, INSERT, REFERENCES, SELECT, UPDATE ON fabric.* TO "fabric"@"localhost";

Privilégios: A permissão “REFERENCES” não é necessária nas versões anteriores ao MySQL 5.6. Somente será necessário se estiver utilizando o MySQL 5.7 ou superior.

O usuário do Servidor

O Fabric utiliza o usuário do servidor (instância mysql) para acessar todos os servidores MySQL que serão gerenciados pelo Fabric, portanto é necessário criá-lo em cada servidor individualmente. As informações dessa conta ficam armazenadas no arquivo de configuração do fabric.cfg na sessão de [servers], conforme mostra a Figura 4.

Figura 4. Configuração de usuário e senha do usuário do servidor no arquivo fabric.cfg

Nota. Senhas: As senhas dos usuários ficam em aberto no arquivo de exemplo, porém isso não é recomendado para ambientes produtivos, devendo então criptografar essas senhas.

O usuário do server (fabric) nesse exemplo, necessita dos seguintes privilégios no escopo GLOBAL: DELETE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE.

No escopo do database, que no exemplo se chama “fabric”, o usuário do servidor necessita das seguintes permissões: ALTER, CREATE, DELETE, DROP, INSERT, SELECT, UPDATE. Na Listagem 2 temos o exemplo para criação do usuário.

Listagem 2. Exemplo de criação do usuário.
CREATE USER "fabric"@"localhost" IDENTIFIED BY "secret"; GRANT DELETE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SELECT, SUPER, TRIGGER ON *.* TO "fabric"@"localhost"; GRANT ALTER, CREATE, DELETE, DROP, INSERT, SELECT, UPDATE ON fabric.* TO "fabric"@"localhost";

Usuário de Backup

Se você quiser clonar uma instância do MySQL e adicionar em um HA “High-Availability Group”, então você irá precisar criar os usuários de backup e restore (Nota do DevMan 2), assim como foi feito com o usuário do servidor. As informações dessa conta também ficam armazenadas no arquivo de configuração do fabric.cfg na sessão de [servers].

Nota do DevMan 2. Backup e Restore: Não iremos considerar o backup e restore da instância MySQL nesse exemplo. Iremos apenas tratar da configuração do MySQL Fabric, levando em consideração que você já tenha uma replicação padrão Master/Slave.

Arquivo de Configuração

O arquivo de configuração possui o nome de fabric.cfg e dependendo do sistema operacional, fica armazenado em um caminho diferente (Figura 5). O arquivo pode ser encontrado na documentação do pacote que será feito o download. Nesse arquivo configuramos os usuários e senhas que foram criados no passo anterior.

Figura 5. Arquivo de configuração do Fabric

O arquivo de configuração do Fabric possui todas as informações necessárias para rodar o MySQL Fabric. Cada sessão possui vários parâmetros configurados que definem informações chaves das bibliotecas do MySQL Fabric, você não precisará alterar nenhum desses parâmetros além dos usuários e senhas da Listagem 2.

Apesar de não ser necessário na maioria das vezes fazer nenhuma alteração no arquivo de configuração além da alteração dos usuários e senhas, iremos descrever algumas dessas sessões que temos disponíveis no arquivo (fabric.cfg) e fazer uma breve explicação de para que server cada uma delas.

[DEFAULT]
A sessão DEFAULT contém as informações dos caminhos de instalação do MySQL Fabric. Essa sessão é criada como uma parte da instalação e normalmente não deveria ser modificada.

[STORAGE]
Essa sessão contém informações que o nó do MySQL Fabric usa para se conectar ao backing store.

[SERVERS]
Essa sessão contém informações que o MySQL Fabric utiliza para se conectar aos servidores que são gerenciados.

[PROTOCOL.XMLRPC]
Essa sessão contém informações sobre como o client se conecta ao nó do MySQL Fabric e parâmetros de configuração do protocolo XML-RPC no servidor.

[PROTOCOL.MYSQL]
Essa sessão contém informações sobre como o client se conecta ao nó do MySQL Fabric utilizando o protocolo MySQL Client/Server.

[EXECUTOR]
Essa sessão contém parâmetros para configurar o executor. O executor é responsável por executar procedimentos em uma ordem sequencial, que garante que as solicitações não conflitem entre si. As solicitações recebidas são mapeadas e envidadas como procedimentos que podem ser executados imediatamente ou serem agendados através do executor. Procedimentos agendados através do executor são processados dentro do contexto de “threads” chamados pelo executor. Normalmente, operações de leitura são imediatamente executadas pela sessão XML-RPC e operações de escrita são agendadas e executadas através do executor.

[LOGGING]
MySQL Fabric registra informações sobre suas atividades para a saída padrão quando iniciado como um processo regular. No entanto, quando iniciado como um daemon, ele grava informações em um arquivo configurado pela opção Fabric URL usado para log.

Preparando o MySQL para o Fabric

Agora vamos configurar as instâncias do MySQL que serão gerenciadas pelo Fabric. Basicamente todas as instâncias de MySQL que serão gerenciados pelo Fabric requerem os parâmetros gtid_mode (GTID), bin_log (binary logging) e o log_slave_updates habilitados. Além disso, cada servidor deverá ter o seu próprio server_id configurado, conforme mostra a Figura 6.

Figura 6. Parâmetros configurados no my.cnf das instâncias que serão monitoradas pelo MySQL Fabric

As configurações a seguir devem constar no arquivo de configuração do MySQL (my.cnf) de cada instância que será gerenciada pelo Fabric.

Server-id=1 é a identificação de cada servidor, gtid-mode=on parâmetro que é utilizado pelo Fabric para checar e manter a consistência entre os servidores, log-bin que são os logs binários do mysql como pode ser visto na Listagem 3.

Listagem 3. Configuração do my.cnf.
#Server_id server-id=1 #Global Transacional gtid-mode=on log-bin = /etc/mysql/binlog/mysql-bin log-slave-updates = 1

Existe um parâmetro opcional --config que aceita o caminho do arquivo de configuração do Fabric como parâmetro (Nota do DevMan 3). Assim ele irá utilizar o arquivo passado no parâmetro ao invés do arquivo de configuração no caminho padrão.

Parâmetros: Existe uma opção –param que permite que você sobrescreva as configurações em tempo de execução, como utilizar outro usuário e senha para o fabric, por exemplo:

shell> mysqlfabric manage setup --param=storage.user=fabricstore --param=storage.password=welcome

No servidor onde será instalado o Fabric, iremos executar os comandos para configurar o Fabric. Aqui iremos fazer o setup inicial do Fabric:

mysqlfabric manage setup

Com esse comando o database é criado assim como as devidas tabelas e usuários. Essas informações são carregadas do arquivo de configuração, conforme mostra a Figura 7.

Figura 7. Fazendo a configuração inicial do Fabric. Passo onde o database é criado./figcaption>

Após a execução do setup, podemos ver que o database configurado no fabric.cfg (fabric) foi criado com sucesso utilizando o seguinte código, assim como as tabelas:

mysql -hlocalhost -P3306 -ufabric -psecret -e"SHOW DATABASES; USE fabric; SHOW TABLES;"

Veja a execução na Figura 8.

Figura 8. Database do Fabric criado, bem como as tabelas que fazem parte da configuração

Depois de configurado iniciamos o MySQL Fabric com o comando a seguir (o comando em específico não retorna nenhuma saída):

mysqlfabric manage start --daemonize

Com o serviço do Fabric iniciado, agora podemos listar os grupos existentes (note que aqui ainda não aparece nenhum grupo criado) com o código a seguir:

mysqlfabric group lookup_groups

Veja o resultado na Figura 9.

Figura 9. Grupos criados - nesse momento ainda não temos nenhum grupo criado

Agora criaremos o HA (High Availability Group) para depois adicionarmos os servidores a esse grupo utilizando o código a seguir e o resultado apresentado na Figura 10:

mysqlfabric group create my_group
Figura 10. Criando o grupo para podermos adicionar os servidores a ele

Na Figura 11 listamos os grupos novamente. Repare que agora o novo grupo irá aparecer usando o seguinte código:

mysqlfabric group lookup_groups
Figura 11. Listando o grupo recém-criado, ainda sem nenhum servidor adicionado

O comando abaixo é utilizado para listar os servidores que fazem parte do grupo:

mysqlfabric group lookup_servers my_group

Nesse momento só criamos o grupo, por isso ainda não aparece nenhum servidor, como mostra a Figura 12.

Figura 12. Listando os servidores adicionados ao grupo my_group, ainda nenhum servidor foi adicionado

Verificando a “saúde” do grupo, com o comando a seguir é apontado qualquer anormalidade na replicação, e o erro irá aparecer na sessão “issue”, conforme mostra a Figura 13:

mysqlfabric group health my_group
Figura 13. Verificando a saúde dos servidores adicionados ao grupo my_group. Ainda nenhum servidor foi adicionado

Agora sim com o código a seguir iremos adicionar os servidores ao HA grupo my_group criado anteriormente, conforme mostra a Figura 14.

mysqlfabric group add my_group localhost:3307
Figura 14. Adicionando a instância MySQL ao grupo HA criado

Em seguida, adicionamos a segunda instância (Figura 15) e a terceira instância (Figura 16) com os seus respectivos comandos:

mysqlfabric group add my_group localhost:3308 mysqlfabric group add my_group localhost:3309
Figura 15. Adicionando a segunda instância do MySQL ao grupo my_group
Figura 16. Adicionando a terceira instância do MySQL ao grupo my_group

Listando os servidores contidos no grupo novamente com o comando a seguir, conforme mostra a Figura 17.

mysqlfabric group lookup_servers my_group
Figura 17. Listando os servidores pertencentes no HA group my_group

Agora podemos checar novamente a “saúde” do cluster utilizando o comando a seguir:

mysqlfabric group health my_group

Podemos notar que os três servidores aparecem adicionados ao grupo my_group, porém estes servidores estão com o status “SECONDARY”, conforme mostra a Figura 18.

Figura 18. Todos os servidores aparecem adicionados ao grupo my_group, porém ainda com o status de “SECONDARY”

Com os servidores devidamente adicionados ao grupo HA podemos agora promover com o código a seguir um dos servidores como o primário (master), conforme mostra a Figura 19:

mysqlfabric group promote my_group --slave_id=9964e6a3-a925-11e6-85f8-5254009fbdfd
Figura 19. Promovendo um dos servidores do grupo a “Primary” ou master

Listando novamente os servidores e status, podemos verificar que agora um dos servidores foi promovido a “PRIMARY”, ou seja, agora esse servidor será o master, conforme mostra a Figura 20.

Figura 20. Podemos notar que agora o servidor da porta 3307 está como PRIMARY

Mostrando novamente a “saúde” do cluster podemos notar que o servidor que escolhemos para promover já aparece como “PRIMARY”, conforme mostra a Figura 21.

Figura 21. Listando os servidores é possível ver quem é o master e se existe algum problema na replicação

Ative o failover automático com o comando a seguir para que, em caso de falha do servidor que promovemos ou algum problema acontecer, um novo servidor que aparece como “SECONDARY” no grupo seja promovido para master, conforme mostra a Figura 22.

mysqlfabric group activate my_group
Figura 22. Ativando o failover automático do grupo my_group

Agora com o Fabric configurado iremos criar um database para teste e verificar se a replicação está funcionando corretamente, conforme mostra a Figura 23.

Figura 23. Criando um database de teste no servidor PRIMARY

Na segunda instância que está rodando na porta 3308 podemos verificar que o database teste_fabric foi criado com sucesso, conforme mostra a Figura 24.

Figura 24. Listando os databases em uma instância “SECONDARY” podemos notar que o database de teste foi replicado com sucesso

O MySQL Fabric tem seus pontos positivos e negativos. Felizmente, a maior parte dos pontos negativos que identificamos são devido ao projeto estar ainda no início de seu ciclo de vida. Considerando que a versão mais recente é um RC, temos certeza de que aqueles vão desaparecer no futuro. Quanto aos pontos positivos, temos:

Em configurações de HA, MySQL Fabric em si, pode se tornar um único ponto de falha. O MySQL Fabric e seu armazenamento de dados (a instância mysqld que armazena os dados do MySQL Fabric) são um único ponto de falha que precisa ser resolvido. Em termos práticos, o impacto do MySQL Fabric caindo irá variar com o seu caso de uso. Se você estiver usando apenas o utilitário mysqlfabric para gerenciar servidores, nada acontecerá enquanto todos os servidores em um grupo continuarem a funcionar. Se, no entanto, estiver utilizando um dos conectores especiais para acessar o grupo, a aplicação ficará indisponível. O MySQL Fabric poderia permitir que você configurasse vários Nodes Fabric e fazer com que eles monitorem uns aos outros e promovam um novo ativo se necessário.

Seguindo esses passos, podemos criar facilmente um grupo para uma solução de replicação do MySQL (master/slave). Dessa forma, o Fabric nos auxilia no gerenciamento do cluster e nos permite uma facilidade enorme para administrar e gerenciar problemas. Isso é muito recomendado para ambientes produtivos onde não queremos ter indisponibilidade nem perda de dados.

O MySQL Fabric é uma feature que já está embutida no preço de licenciamento, caso você utilize o MySQL Enterprise. Então esse é mais um motivo para não deixar de usar e testar suas funcionalidades, lembrando que neste artigo, abordamos apenas a parte de alta disponibilidade do MySQL Fabric.

O Lab montado nesse exemplo está disponível para download. O arquivo Readme possui todas as instruções de como configurar o ambiente virtual para testar o MySQL Fabric. Para isso você precisará apenas de uma conexão com a internet e praticamente um comando irá fazer o download de todos os componentes necessários pra a instalação, inclusive a instalação do sistema operacional, dependências, pacotes e configurações.

Links Úteis sobre MySQL Fabric

Artigos relacionados