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
idleTimeoutno Mycat para ser infreior aowait_timeoutdo MySQL, evitando conexões "zumbis" no pool. - Drivers: Embora o driver
nativeseja eficiente, em alguns cenários de falha de SSL, a configuração do JDBC URL no Mycat pode exigir o parâmetrouseSSL=false.