Configuração e Integração do Mycat com MySQL 8.x

O Mycat consolidou-se como um dos middlewares de banco de dados distribuídos mais robustos no ecossistema open-source. Ele atua como um proxy que permite sharding (particionamento), leitura e escrita separadas e alta disponibilidade. Integrar o Mycat com o MySQL 8.x exige atenção a detalhes específicos de autenticação e configuração de rede.

1. Preparação do Ambiente

Antes de iniciar a configuração, certifique-se de que o Java JRE/JDK (versão 1.8 ou superior) esteja instalado, pois o Mycat é executado sobre a JVM. Além disso, o MySQL 8.x deve estar operacional.

Configuração do Usuário no MySQL 8

O MySQL 8 utiliza por padrão o plugin de autenticação caching_sha2_password, que pode ser incompatível com versões mais antigas do Mycat. Recomenda-se criar um usuário utilizando o plugin nativo:

CREATE DATABASE sistema_distribuido;

CREATE USER 'mycat_gateway'@'%' IDENTIFIED WITH mysql_native_password BY 'Senha@2024';
GRANT ALL PRIVILEGES ON sistema_distribuido.* TO 'mycat_gateway'@'%';
FLUSH PRIVILEGES;

2. Ajustes nos Arquivos de Configuração do Mycat

A configuração do Mycat reside no diretório conf/. Os dois arquivos fundamentais são o schema.xml (estrutura lógica) e o server.xml (segurança e sistema).

Definição da Topologia (schema.xml)

Neste arquivo, mapeamos o banco de dados lógico para as instâncias físicas do MySQL. Alteramos a estrutura original para refletir uma arquitetura de produtos:

<?xml version="1.0"?>
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="DB_LOGICA" checkSQLschema="false" sqlMaxLimit="500">
        <table name="estoque" dataNode="node_principal" />
    </schema>

    <dataNode name="node_principal" dataHost="host_mysql_1" database="sistema_distribuido"/>

    <dataHost name="host_mysql_1" maxCon="500" minCon="5" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1">
        <heartbeat>select 1</heartbeat>
        <writeHost host="master" url="192.168.1.50:3306" user="mycat_gateway" password="Senha@2024" />
    </dataHost>

</mycat:schema>

Configuração de Acesso (server.xml)

O arquivo server.xml define as credenciais que a aplicação usará para se conectar ao Mycat (não ao MySQL diretamente):

<user name="admin_acesso">
    <property name="password">proxy_pass_123</property>
    <property name="schemas">DB_LOGICA</property>
    <property name="readOnly">false</property>
</user>

3. Inicialização do Serviço

Com as configurações salvas, navegue até a pasta bin do Mycat e execute o script de inicialização:

./mycat console

O comando console é útil para depuração inicial, permitindo visualizar erros de conexão em tempo real. Para execução em background, utilize ./mycat start.

4. Validação da Conectividade

O Mycat, por padrão, escuta na porta 8066. Utilize o cliente padrão do MySQL para testar a ponte:

mysql -u admin_acesso -p -h 127.0.0.1 -P 8066

Após o login, verifique se as tabelas lógicas estão acessíveis:

USE DB_LOGICA;
SHOW TABLES;
DESC estoque;

5. Exemplo de Implementação com Python

Para integrar sua aplicação, você pode utilizar bibliotecas padrão de mercado. Abaixo, um exemplo utilizando o mysql-connector-python para gerenciar dados através do Mycat:

import mysql.connector
from mysql.connector import Error

def gerenciar_estoque():
    config = {
        'user': 'admin_acesso',
        'password': 'proxy_pass_123',
        'host': '127.0.0.1',
        'port': 8066,
        'database': 'DB_LOGICA'
    }

    try:
        conexao = mysql.connector.connect(**config)
        if conexao.is_connected():
            cursor = conexao.cursor()
            
            # Inserção de registro
            sql_insert = "INSERT INTO estoque (nome_item, quantidade) VALUES (%s, %s)"
            valores = [('Servidor Rack', 10), ('Switch L3', 5)]
            cursor.executemany(sql_insert, valores)
            conexao.commit()
            
            # Consulta de verificação
            cursor.execute("SELECT * FROM estoque")
            for (id_item, nome, qtd) in cursor:
                print(f"ID: {id_item} | Item: {nome} | Qtd: {qtd}")

    except Error as e:
        print(f"Erro na conexão: {e}")
    finally:
        if 'conexao' in locals() and conexao.is_connected():
            cursor.close()
            conexao.close()

if __name__ == "__main__":
    gerenciar_estoque()

Considerações Técnicas

  • Sincronia de Charset: Verifique se tanto o Mycat quanto o MySQL 8 utilizam o mesmo conjunto de caracteres (ex: utf8mb4) para evitar falhas de codificação.
  • Timeouts: Ajuste o parâmetro idleTimeout no Mycat para ser infreior ao wait_timeout do MySQL, evitando conexões "zumbis" no pool.
  • Drivers: Embora o driver native seja eficiente, em alguns cenários de falha de SSL, a configuração do JDBC URL no Mycat pode exigir o parâmetro useSSL=false.

Tags: Mycat MySQL 8 Database Middleware Sharding Python

Publicado em 7-25 23:00