CÓMO CREAR UNA BASE DE DATOS DISTRIBUIDA CON MYSQL

Lasbases de datos distribuidas permiten repartir los datos entre varios servidores (nodos) para ganar escalabilidad, alta disponibilidad, tolerancia a fallos y, en muchos casos, mejor rendimiento geográfico. MySQL ofrece varias formas de conseguirlo.

Opciones principales en MySQL

table style="margin: 0 auto; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; text-align: center;"> Opción Tipo de distribución Ventajas principales Complejidad Uso recomendado Replicación clásica Maestro-esclavo / multi-fuente Sencilla, buena para lecturas y DR Baja Escalado de lecturas InnoDB Cluster (Group Replication) Alta disponibilidad Failover automático, fácil de administrar Media La mayoría de casos de HA MySQL NDB Cluster Verdadera distribuida (auto-sharding) Multi-master, particionado automático, muy alta disponibilidad Alta Aplicaciones críticas de alto rendimiento

Crear un clúster de alta disponibilidad con InnoDB Cluster (recomendado para la mayoría)

InnoDB Cluster combina Group Replication, MySQL Shell y MySQL Router. Es la solución oficial más sencilla y completa para alta disponibilidad.

Requisitos previos

  • Al menos 3 servidores, recomendado número impar: 3, 5 o 7.
  • MySQL 8.0 o superior, preferiblemente 8.4 LTS.
  • MySQL Shell instalado.
  • Puertos abiertos: 3306, MySQL y 33061, comunicación del grupo.
  • Todas las tablas deben usar el motor InnoDB y tener clave primaria.

Pasos básicos

  1. Instalar MySQL y MySQL Shell en los tres nodos.
  2. Configurar cada instancia (ejemplo de parámetros importantes en "my.cnf" o archivo de configuración:

    
    mysqld]
    server_id = 1                    # Diferente en cada nodo
    gtid_mode = ON
    enforce_gtid_consistency = ON
    binlog_format = ROW
    log_bin = mysql-bin
    log_slave_updates = ON
    transaction_write_set_extraction = XXHASH64
    
  3. Crear un usuario de administración del clúster en cada nodo:

    
    CREATE USER 'icadmin'@'%' IDENTIFIED BY 'contraseña_segura';
    GRANT ALL PRIVILEGES ON *.* TO 'icadmin'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    
  4. Configurar y crear el clúster con MySQL Shell (desde el primer nodo):

    
    mysqlsh icadmin@nodo1:3306
    
    Dentro de MySQL Shell, modo JavaScript:

    
    dba.configureInstance('icadmin@nodo1:3306')
    dba.configureInstance('icadmin@nodo2:3306')
    dba.configureInstance('icadmin@nodo3:3306')
    
    var cluster = dba.createCluster('miCluster')
    cluster.addInstance('icadmin@nodo2:3306')
    cluster.addInstance('icadmin@nodo3:3306')
    cluster.status()
    
  5. Instalar y configurar MySQL Router, (en uno o varios servidores de aplicación) para que las aplicaciones se conecten de forma transparente:

    
    mysqlrouter --bootstrap icadmin@nodo1:3306 --directory /etc/mysqlrouter
    
Las aplicaciones se conectan al Router, puerto 6446 para lectura/escritura y 6447 para solo lectura. El Router se encarga del enrutamiento y del failover automático.

Crear una base de datos realmente distribuida con MySQL NDB Cluster

MySQL NDB Cluster es la solución diseñada específicamente para bases de datos distribuidas. Utiliza el motor NDB, Network DataBase, realiza auto-sharding, particionado automático, y permite escrituras en cualquier nodo de datos.

Arquitectura típica

  • Nodo de gestión, "ndb_mgmd": coordina el clúster.
  • Nodos de datos, "ndbd" o "ndbmtd": almacenan y procesan los datos (mínimo 2, recomendado más).
  • Nodos SQL, "mysqld": permiten acceder con SQL.

Pasos generales (resumen)

  1. Descargar e instalar los binarios de MySQL NDB Cluster, no es la versión estándar de MySQL, desde el sitio oficial de Oracle.
  2. Crear el archivo de configuración principal "config.ini", en el nodo de gestión. Ejemplo simplificado:

    
    [ndbd default]
    NoOfReplicas=2
    DataMemory=2G
    IndexMemory=500M
    
    [ndb_mgmd]
    HostName=ip_gestion
    DataDir=/var/lib/mysql-cluster
    
    [ndbd]
    HostName=ip_nodo_datos1
    DataDir=/var/lib/mysql-cluster
    
    [ndbd]
    HostName=ip_nodo_datos2
    DataDir=/var/lib/mysql-cluster
    
    [mysqld]
    [mysqld]
    
  3. Arrancar los procesos en este orden:
    1. Nodo de gestión: "ndb_mgmd -f /ruta/config.ini".
    2. Nodos de datos: "ndbd", o "ndbmtd".
    3. Nodos SQL: "mysqld" con la opción "ndbcluster" activada.
  4. Crear las tablas con el motor NDB:

    
    CREATE TABLE ejemplo (
      id INT PRIMARY KEY,
      nombre VARCHAR(100)
    ) ENGINE=NDBCLUSTER;
    
Los datos se particionan automáticamente entre los nodos de datos de forma transparente para la aplicación.

Consideraciones importantes y buenas prácticas

  • Latencia de red: Group Replication y NDB son sensibles a la latencia. Mejor desplegarlos dentro del mismo centro de datos o región con buena conectividad.
  • Consistencia: InnoDB Cluster ofrece consistencia fuerte. NDB también, con replicación síncrona dentro del clúster.
  • Copia de seguridad: Usar herramientas específicas como "mysqlbackup", "ndb_restore".
  • Monitorización: Supervisar el estado del clúster regularmente "cluster.status()" en Shell o "ndb_mgm".
  • Producción: Siempre probar en un entorno de pruebas antes de desplegar. Consultar la documentación oficial de Oracle, ya que los detalles de configuración varían según la versión.
  • Alternativas avanzadas: Para sharding a muy gran escala se suele combinar MySQL con Vitess.
  • Conclusión

    MySQL permite crear bases de datos distribuidas de forma robusta.
    • Si se necesita alta disponibilidad sencilla → empezar por InnoDB Cluster.
    • Si se necesita escalado horizontal real con particionado automático y multi-master → usar MySQL NDB Cluster.
    Ambas soluciones están maduras y se utilizan en entornos de producción exigentes. La elección depende del volumen de datos, del patrón de escritura y de los requisitos de disponibilidad.