Realizaremos la implementación de un InnoDB Cluster en un entorno de Kubernetes (k8s). Antes de empezar a entender los componentes de un InnoDBb Cluster, comencemos en definir InnoDB.

¿Qué es InnoDB?

InnoDB es un motor de almacenamiento de propósito general que balancea la alta disponibilidad y alta performance. Incluido desde la versión 4 de MySQL , es el actual motor predeterminado de almacenamiento en MySQL y MariadB. A menos que hayas configurado otro motor indicando la clausula ENGINE en la sentencia CREATE TABLE.

Ventajas de InnoDB

  • Sus operaciones DML siguen el modelo ACID, con transacciones que presentan capacidades de confirmación, reversión y recuperación ante fallas para proteger los datos del usuario.
  • El bloqueo a nivel de fila y las lecturas consistentes al estilo de Oracle aumentan la concurrencia y el rendimiento de múltiples usuarios.

  • Las tablas organizan tus datos en disco para optimizar consultas basadas en primary keys. Cada tabla tiene un indice en su primary key llamado clustered index que organiza los datos para minimizar las operaciones de I/O.
  • Para mantener la integridad de los datos, soporta FOREIGN KEY constraints. Con lo que las operaciones de inserción, actualización y eliminación son verificadas para asegurar que no ocurran inconsistencias entre tablas.

Table 1.1 InnoDB Storage Engine Features

Feature Support
B-tree indexes Yes
Backup/point-in-time recovery (Implemented in the server, rather than in the storage engine.) Yes
Cluster database support No
Clustered indexes Yes
Compressed data Yes
Data caches Yes
Encrypted data Yes (Implemented in the server via encryption functions; In MySQL 5.7 and later, data-at-rest encryption is supported.)
Foreign key support Yes
Full-text search indexes Yes (Support for FULLTEXT indexes is available in MySQL 5.6 and later.)
Geospatial data type support Yes
Geospatial indexing support Yes (Support for geospatial indexing is available in MySQL 5.7 and later.)
Hash indexes No (InnoDB utilizes hash indexes internally for its Adaptive Hash Index feature.)
Index caches Yes
Locking granularity Row
MVCC Yes
Replication support (Implemented in the server, rather than in the storage engine.) Yes
Storage limits 64TB
T-tree indexes No
Transactions Yes
Update statistics for data dictionary Yes
Feature Support

Fuente: https://dev.mysql.com/doc/refman/8.4/en/innodb-introduction.html

¿Qué es InnoDB Cluster?

Un InnoDB Cluster consiste en al menos tres instancias de MySql Server y provee las características necesarias para obtener una alta disponibilidad y autoscaling. Para que esto ocurra, se utilizan las diferentes tecnologías de MySql:

  • MySql Shell: un avanzado editor y cliente de MySql.
  • MySql Server y Group Replication: que habilitan a un conjunto de instancias de MySql proveer alta disponibilidad. InnoDB Cluster provee de manera fácil una alternativa y programatica de trabajar con Group Replication.
  • MySql Router: un middleware liviano, que provee enrutamiento transparente entre tu aplicación e InnoDB Cluster.

Figure 1 InnoDB Cluster overview

Fuente: https://dev.mysql.com/doc/refman/8.4/en/mysql-innodb-cluster-introduction.html

Ambiente para la implementación del InnoDB Cluster

Todos los componentes del InnoDB Cluster se pueden implementar en ambientes virtuales. En esta ocasión se implementaran en k8s por medio de MySql Operators. Si bien el uso de una base de datos hace unos años tenían múltiples problemas en funcionar en ambientes efímeros como los contenedores y orquestadores, en la actualidad estamos en un nivel de madurez que permite ejecutarlo sin problemas.

MySQL Operator for Kubernetes

Administran la instalación de MySQL InnoDB Cluster dentro de un cluster de Kubernetes y gestiona el ciclo completo de sus componentes,su mantenimiento e incluye la automatización de las actualizaciones y respaldos.

Figure 2.1 MySQL Operator for Kubernetes Architecture Diagram

Contains a detailed diagram of the MySQL Operator for Kubernetes

Para verificar la alta disponibilidad, el ambiente de kubernetes sera suministrado por tres maquinas virtuales (on-premise, bajo el hipervisor hyper-v), ejecutando el sistema operativo Ubuntu 24.04 y Microk8s como distribución cloud native de k8s. Aquí se implementara un InnoDB Cluster utilizando la versión de MySQL 8.3.0 con tres replicas del MySQL y una replica de MySQL Router.

Figure 2.2 Topología del ambiente

Dentro de la topología se utiliza haproxy para exponer la kubeapi de cada nodo del cluster de k8s y Metallb para poder utilizar direcciones vip (virtual ip) a los recursos de k8s del tipo LoadBalancer. En este ejemplo el servicio MySql Router sera accesible dentro de la red con cualquier cliente de MySql desde dentro del cluster y desde el exterior mediante la virtual ip 192.168.25.150 y/o el fqdn innodbcluster-mycluster.homelab-test.jesusguibert.com.

Unos segundos después de aplicar los manifiestos, ya podemos observar dentro del namespace innodbcluster-mycluster se encontrara el recurso mycluster del CRD InnoDBCluster:

Y el resto de recursos que lo componen.

Podemos verificar el correcto funcionamiento, podemos realizar una conexión desde el cliente Dbeaver donde podremos comprobar un inicio de sesión exitoso y el contenido de las tablas del sistemas generadas en la inicializacion del cluster.

Actualizando la versión del InnoDB Cluster

Luego de establecer una conexión exitosa a mycluster, podremos consultar la versión de InnoDB que se esta utilizando en todos los nodos con la consulta:

SELECT VERSION();

Para poder realizar un upgrade hacia una nueva versión de InnoDB, solo debemos modificar el recurso mycluster.

Para que el MySQL Operator detecte el cambio y se encargue de realizar la tarea correspondiente. Veamos que a medida que pasa el tiempo se van eliminando los recursos que fueron generados en primera instancia y son generados los nuevos que corresponden a la ultima versión.

Al finalizar podemos consultar la versión de InnoDB utilizada y podremos apreciar el upgrade exitoso.

The End

De esta manera, terminamos con la implementación de un InnoDB Cluster en cuestión de minutos. En un ambiente sumamente fácil y cómodo de gestionar. A continuación ya podríamos empezar a utilizar el clúster para aplicaciones que necesiten persistir una base de datos MySQL en HA.

Última modificación: jueves, 25 de julio de 2024, 00:18