Introducción a Mycat
Mycat es un intermediario de bases de datos (middleware) de código abierto para MySQL. Proporciona funcionalidades clave como el particionamiento horizontal de tablas (sharding), la gestión de bases de datos distribuidas y la intermediación entre aplicaciones y múltiples instancias de bases de datos subyacentes. Su arquitectura permite escalar horizontalmente el almacenamiento de datos.
Requisitos del Sistema
Este ejemplo utiliza un entorno Windows, aunque para entornos de producción se recomienda Linux. Es necesario tener instalado y configurado previamente:
- JDK: Versión 1.7 o superior.
- MySQL: Versión 5.5 o superior.
Configuración del Escenario de Prueba
Definiremos un escenario con una base de datos lógica denominada TESTDB, que enmascara tres bases de datos físicas en una misma instancia de MySQL: base_datos_principal, base_datos_secundaria y base_datos_terciaria. La tabla usuarios residirá únicamente en base_datos_principal. La tabla elementos se particionará entre base_datos_secundaria y base_datos_terciaria.
Primero, creamos la base de datos y la tabla principal:
CREATE DATABASE IF NOT EXISTS base_datos_principal;
USE base_datos_principal;
CREATE TABLE usuarios (
id_usuario INT NOT NULL AUTO_INCREMENT,
nombre_completo VARCHAR(100) NOT NULL DEFAULT '',
fecha_creacion DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id_usuario)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Posteriormente, creamos las bases de datos secundarias y la tabla que será particionada:
CREATE DATABASE IF NOT EXISTS base_datos_secundaria;
USE base_datos_secundaria;
CREATE TABLE elementos (
id_elemento INT NOT NULL AUTO_INCREMENT,
cantidad INT NOT NULL DEFAULT 0,
ultima_actualizacion DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id_elemento)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE DATABASE IF NOT EXISTS base_datos_terciaria;
USE base_datos_terciaria;
CREATE TABLE elementos (
id_elemento INT NOT NULL AUTO_INCREMENT,
cantidad INT NOT NULL DEFAULT 0,
ultima_actualizacion DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id_elemento)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Configuración de Mycat
Descargue el paquete de instalación de Mycat desde su repositorio oficial. La configuración se realiza editando tres archivos dentro del directorio conf:
server.xml: Define los parámetros del servicio Mycat, como puertos, usuarios de acceso y la base de datos lógica expuesta.rule.xml: Establece las estrategias de enrutamiento y particionamiento, como la clave de partición y el algoritmo de división (módulo, rango, etc.).schema.xml: Describe el esquema lógico de la base de datos, mapeando tablas lógicas a nodos de datos físicos y especificando los hosts de la base de datos subyacente.
La configuración detallada se muestra a contniuación. Los parámetros de conexión a MySQL (URL, usuario, contraseña) deben ajustarse a su entorno.
Configuración de server.xml
<?xml version="1.0" encoding="UTF-8"?>
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="serverPort">8066</property>
<property name="managerPort">9066</property>
<property name="defaultSqlParser">druidparser</property>
</system>
<user name="admin_user">
<property name="password">securePassword123</property>
<property name="schemas">TESTDB</property>
</user>
<user name="readonly_user">
<property name="password">readOnlyPass</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
Configuración de rule.xml
Define una regla de partición que utiliza el módulo 2 sobre la columna id_elemento para distribuir los datos entre dos nodos.
<?xml version="1.0" encoding="UTF-8"?>
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="regla_modulo_2">
<rule>
<columns>id_elemento</columns>
<algorithm>algoritmo_modulo</algorithm>
</rule>
</tableRule>
<function name="algoritmo_modulo" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property>
</function>
</mycat:rule>
Configuración de schema.xml
<?xml version="1.0"?>
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="usuarios" primaryKey="id_usuario" dataNode="nodo_principal" />
<table name="elementos" primaryKey="id_elemento" dataNode="nodo_secundario,nodo_terciario" rule="regla_modulo_2" />
</schema>
<dataNode name="nodo_principal" dataHost="host_grupo1" database="base_datos_principal" />
<dataNode name="nodo_secundario" dataHost="host_grupo1" database="base_datos_secundaria" />
<dataNode name="nodo_terciario" dataHost="host_grupo1" database="base_datos_terciaria" />
<dataHost name="host_grupo1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>SELECT USER()</heartbeat>
<writeHost host="servidor_primario" url="localhost:3306" user="tu_usuario_mysql" password="tu_password_mysql" />
</dataHost>
</mycat:schema>
Prueba de la Implementación
Inicie el servidor Mycat ejecutando el script correspondiente en el directorio bin. Una vez iniciado, conéctese a la interfaz lógica de Mycat usando un cliente MySQL estándar:
mysql -uadmin_user -psecurePassword123 -h127.0.0.1 -P8066 -DTESTDB
Dentro de esta conexión, la base de datos TESTDB se muestra como una entidad única, ocultando la distribución física subyacente. Insertemos datos para probar la estrategia de enrutamiento configurada:
INSERT INTO usuarios (nombre_completo) VALUES ('Ana López');
INSERT INTO usuarios (nombre_completo) VALUES ('Carlos Ruiz');
INSERT INTO elementos (id_elemento, cantidad) VALUES (1, 150);
INSERT INTO elementos (id_elemento, cantidad) VALUES (2, 300);
Al verificar directamente en las bases de datos físicas, se observa que:
- Los registros de la tabla
usuariosse encuentran todos enbase_datos_principal. - Los registros de la tabla
elementosse distribueyn de acuerdo con la reglaregla_modulo_2: el registro conid_elemento1 se almacena enbase_datos_secundaria, y el registro conid_elemento2 se almacena enbase_datos_terciaria.