sql >> Base de Datos >  >> RDS >> MariaDB

Evaluación comparativa de implementaciones de bases de datos manuales frente a implementaciones automatizadas

Hay varias formas de implementar una base de datos. Puede instalarlo a mano, puede confiar en las herramientas de orquestación de infraestructura ampliamente disponibles como Ansible, Chef, Puppet o Salt. Esas herramientas son muy populares y es bastante fácil encontrar scripts, recetas, libros de jugadas, lo que sea, lo que lo ayudará a automatizar la instalación de un clúster de base de datos. También existen plataformas de automatización de bases de datos más especializadas, como ClusterControl, que también se pueden utilizar para la implementación automatizada. ¿Cuál sería la mejor manera de implementar su clúster? ¿Cuánto tiempo necesitará realmente para implementarlo?

Primero, aclaremos lo que queremos hacer. Supongamos que implementaremos Percona XtraDB Cluster 5.7. Constará de tres nodos y para eso usaremos tres máquinas virtuales Vagrant con Ubuntu 16.04 (imagen bento/ubuntu-16.04). Intentaremos implementar un clúster manualmente y luego usaremos Ansible y ClusterControl. Veamos cómo se verán los resultados.

Implementación manual

Configuración del repositorio:1 minuto, 45 segundos.

En primer lugar, tenemos que configurar los repositorios de Percona en todos los nodos de Ubuntu. La búsqueda rápida en Google, ssh en las máquinas virtuales y la ejecución de los comandos requeridos toma 1m45s

Encontramos la siguiente página con instrucciones:
https://www.percona.com/doc/percona-repo-config/percona-release.html

y ejecutamos los pasos descritos en la sección “DISTRIBUCIONES DE GNU/LINUX BASADAS EN DEB”. También ejecutamos apt update, para actualizar el caché de apt.

Instalación de nodos PXC:2 minutos y 45 segundos

Este paso consiste básicamente en ejecutar:

[email protected]:~# apt install percona-xtradb-cluster-5.7

El resto depende principalmente de la velocidad de su conexión a Internet a medida que se descargan los paquetes. También se necesitará su entrada (pasará una contraseña para el superusuario) para que no sea una instalación desatendida. Cuando todo esté listo, terminará con tres nodos de Percona XtraDB Cluster en ejecución:

root     15488  0.0  0.2   4504  1788 ?        S    10:12   0:00 /bin/sh /usr/bin/mysqld_safe
mysql    15847  0.3 28.3 1339576 215084 ?      Sl   10:12   0:00  \_ /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --wsrep-provider=/usr/lib/galera3/libgalera_smm.so --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --wsrep_start_position=00000000-0000-0000-0000-000000000000:-1

Configuración de nodos PXC:3 minutos, 25 segundos

Aquí comienza la parte difícil. Es realmente difícil cuantificar la experiencia y cuánto tiempo se necesitaría para comprender realmente lo que se necesita hacer. Lo que es bueno, la búsqueda en Google "cómo instalar percona xtrabdb cluster" apunta a la documentación de Percona, que describe cómo debería ser el proceso. Todavía puede tomar más o menos tiempo, dependiendo de qué tan familiarizado esté con el PXC y Galera en general. En el peor de los casos, no se dará cuenta de ninguna acción adicional requerida y se conectará a su PXC y comenzará a trabajar con él, sin darse cuenta de que, de hecho, tiene tres nodos, cada uno formando un grupo propio.

Supongamos que seguimos la recomendación de Percona y cronometramos solo esos pasos para que se ejecuten. En resumen, modificamos los archivos de configuración según las instrucciones del sitio web de Percona, también intentamos arrancar el primer nodo:

[email protected]:~# /etc/init.d/mysql bootstrap-pxc
mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 10!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 10!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 10!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 10!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
 * Bootstrapping Percona XtraDB Cluster database server mysqld                                                                                                                                                                                                                     ^C

Esto no parecía correcto. Desafortunadamente, las instrucciones no eran muy claras. Nuevamente, si no sabe lo que está pasando, pasará más tiempo tratando de entender lo que sucedió. Afortunadamente, stackoverflow.com es muy útil (aunque no es la primera respuesta en la lista que recibimos) y debe darse cuenta de que se pierde el encabezado de la sección [mysqld] en su archivo /etc/mysql/my.cnf. Agregar esto en todos los nodos y repetir el proceso de arranque resolvió el problema. En total, dedicamos 3 minutos y 25 segundos (sin incluir la búsqueda del error en Google, ya que notamos de inmediato cuál era el problema).

Configurar para SST, traer otros nodos al clúster:desde 8 minutos hasta el infinito

Las instrucciones en el sitio web de Percona son bastante claras. Una vez que tenga un nodo en funcionamiento, simplemente inicie los nodos restantes y estará bien. Lo intentamos y no pudimos ver más nodos uniéndose al clúster. Aquí es donde es prácticamente imposible saber cuánto tiempo llevará diagnosticar el problema. Nos tomó 6-7 minutos pero para poder hacerlo rápido tienes que:

  1. Familiarícese con la estructura de la configuración de PXC:
    [email protected]:~# tree  /etc/mysql/
    /etc/mysql/
    ├── conf.d
    │   ├── mysql.cnf
    │   └── mysqldump.cnf
    ├── my.cnf -> /etc/alternatives/my.cnf
    ├── my.cnf.fallback
    ├── my.cnf.old
    ├── percona-xtradb-cluster.cnf
    └── percona-xtradb-cluster.conf.d
        ├── client.cnf
        ├── mysqld.cnf
        ├── mysqld_safe.cnf
        └── wsrep.cnf
  2. Sepa cómo funcionan las directivas !include y !includedir en los archivos de configuración de MySQL
  3. Sepa cómo MySQL maneja las mismas variables incluidas en varios archivos
  4. Sepa qué buscar y tenga en cuenta las configuraciones que darían como resultado que el nodo se reinicie para formar un clúster por sí mismo

El problema estaba relacionado con el hecho de que las instrucciones no mencionaban ningún archivo excepto /etc/mysql/my.cnf donde, de hecho, deberíamos haber estado modificando /etc/mysql/percona-xtradb-cluster.conf.d/wsrep .cnf. Ese archivo contenía una variable vacía:

wsrep_cluster_address=gcomm://

y dicha configuración obliga al nodo a arrancar ya que no tiene información sobre otros nodos a los que unirse. Configuramos esa variable en /etc/mysql/my.cnf pero luego se incluyó el archivo wsrep.cnf, sobrescribiendo nuestra configuración.

Este problema puede ser un obstáculo serio para las personas que no están realmente familiarizadas con el funcionamiento de MySQL y Galera, lo que resulta incluso en horas, si no más, de depuración.

Tiempo total de instalación:16 minutos (si es administrador de bases de datos de MySQL como yo)

Logramos instalar Percona XtraDB Cluster en 16 minutos. Debe tener en cuenta un par de cosas:no ajustamos la configuración. Esto es algo que requerirá más tiempo y conocimiento. El nodo PXC viene con una configuración simple, relacionada principalmente con el registro binario y la replicación del conjunto de escritura de Galera. No hay ajuste de InnoDB. Si no está familiarizado con las funciones internas de MySQL, son horas, si no días, de leer y familiarizarse con los mecanismos internos. Otra cosa importante es que este es un proceso que tendría que volver a aplicar para cada clúster que implemente. Finalmente, logramos identificar el problema y resolverlo muy rápido debido a nuestra experiencia con Percona XtraDB Cluster y MySQL en general. Lo más probable es que el usuario casual pase mucho más tiempo tratando de entender qué está pasando y por qué.

Guía de Ansible

Ahora, a la automatización con Ansible. Tratemos de encontrar y usar un libro de jugadas ansible, que podamos reutilizar para todas las implementaciones posteriores. Veamos cuánto tiempo llevará hacer eso.

Configuración de la conectividad SSH - 1 minuto

Ansible requiere conectividad SSH en todos los nodos para conectarse y configurarlos. Generamos una clave SSH y la distribuimos manualmente entre los nodos.

Guía de búsqueda de Ansible:2 minutos y 15 segundos

El problema principal aquí es que hay tantos libros de jugadas disponibles que es imposible decidir cuál es el mejor. Como tal, decidimos ir con los 3 mejores resultados de Google e intentar elegir uno. Nos decidimos por https://github.com/cdelgehier/ansible-role-XtraDB-Cluster porque parece ser más configurable que los restantes.

Repositorio de clonación e instalación de Ansible:30 segundos

Esto es rápido, todo lo que necesitábamos era

apt install ansible git
git clone https://github.com/cdelgehier/ansible-role-XtraDB-Cluster.git

Preparación del archivo de inventario:1 minuto y 10 segundos

Este paso también fue muy simple, creamos un archivo de inventario usando un ejemplo de la documentación. Simplemente sustituimos las direcciones IP de los nodos por lo que hemos configurado en nuestro entorno.

Preparación de un libro de jugadas - 1 minuto 45 segundos

Decidimos utilizar el ejemplo más extenso de la documentación, que incluye también algunos ajustes de configuración. Preparamos una estructura correcta para Ansible (no había tal información en la documentación):

/root/pxcansible/
├── inventory
├── pxcplay.yml
└── roles
    └── ansible-role-XtraDB-Cluster

Luego lo ejecutamos pero inmediatamente obtuvimos un error:

[email protected]:~/pxcansible# ansible-playbook pxcplay.yml
 [WARNING]: provided hosts list is empty, only localhost is available

ERROR! no action detected in task

The error appears to have been in '/root/pxcansible/roles/ansible-role-XtraDB-Cluster/tasks/main.yml': line 28, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


- name: "Include {{ ansible_distribution }} tasks"
  ^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes.  Always quote template expression brackets when they
start a value. For instance:

    with_items:
      - {{ foo }}

Should be written as:

    with_items:
      - "{{ foo }}"

Esto tomó 1 minuto y 45 segundos.

Solución del problema de sintaxis del libro de estrategias:3 minutos y 25 segundos

El error fue engañoso, pero la regla general es probar la versión más reciente de Ansible, lo cual hicimos. Buscamos en Google y encontramos buenas instrucciones en el sitio web de Ansible. El siguiente intento de ejecutar el libro de jugadas también falló:

TASK [ansible-role-XtraDB-Cluster : Delete anonymous connections] *****************************************************************************************************************************************************************************************************************
fatal: [node2]: FAILED! => {"changed": false, "msg": "The PyMySQL (Python 2.7 and Python 3.X) or MySQL-python (Python 2.X) module is required."}
fatal: [node3]: FAILED! => {"changed": false, "msg": "The PyMySQL (Python 2.7 and Python 3.X) or MySQL-python (Python 2.X) module is required."}
fatal: [node1]: FAILED! => {"changed": false, "msg": "The PyMySQL (Python 2.7 and Python 3.X) or MySQL-python (Python 2.X) module is required."}

Configurar la nueva versión de Ansible y ejecutar el libro de jugadas hasta este error tomó 3 minutos y 25 segundos.

Reparación del módulo de Python que falta:3 minutos y 20 segundos

Aparentemente, el rol que usamos no cumplió con sus requisitos previos y faltaba un módulo de Python para conectarse y proteger el clúster de Galera. Primero intentamos instalar MySQL-python a través de pip, pero se hizo evidente que tomaría más tiempo ya que requería mysql_config:

[email protected]:~# pip install MySQL-python
Collecting MySQL-python
  Downloading https://files.pythonhosted.org/packages/a5/e9/51b544da85a36a68debe7a7091f068d802fc515a3a202652828c73453cad/MySQL-python-1.2.5.zip (108kB)
    100% |████████████████████████████████| 112kB 278kB/s
    Complete output from command python setup.py egg_info:
    sh: 1: mysql_config: not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-zzwUtq/MySQL-python/setup.py", line 17, in <module>
        metadata, options = get_config()
      File "/tmp/pip-build-zzwUtq/MySQL-python/setup_posix.py", line 43, in get_config
        libs = mysql_config("libs_r")
      File "/tmp/pip-build-zzwUtq/MySQL-python/setup_posix.py", line 25, in mysql_config
        raise EnvironmentError("%s not found" % (mysql_config.path,))
    EnvironmentError: mysql_config not found

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-zzwUtq/MySQL-python/

Eso lo proporcionan las bibliotecas de desarrollo de MySQL, por lo que tendríamos que instalarlas manualmente, lo cual era bastante inútil. Decidimos optar por PyMySQL, que no requería la instalación de otros paquetes. Esto nos llevó a otro problema:

TASK [ansible-role-XtraDB-Cluster : Delete anonymous connections] *****************************************************************************************************************************************************************************************************************
fatal: [node3]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, u\"Access denied for user 'root'@'localhost'\")"}
fatal: [node2]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, u\"Access denied for user 'root'@'localhost'\")"}
fatal: [node1]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, u\"Access denied for user 'root'@'localhost'\")"}
    to retry, use: --limit @/root/pxcansible/pxcplay.retry

Hasta este punto hemos tardado 3 minutos y 20 segundos.

Reparación del error "Acceso denegado":18 minutos y 55 segundos

Según el error, nos aseguramos de que la configuración de MySQL esté preparada correctamente y de que incluya el usuario y la contraseña correctos para conectarse a la base de datos. Esto, desafortunadamente, no funcionó como se esperaba. Investigamos más a fondo y descubrimos que el rol no creó correctamente al usuario raíz, aunque marcó el paso como completado. Hicimos una breve investigación, pero decidimos hacer la corrección manual en lugar de intentar depurar el libro de jugadas, lo que llevaría mucho más tiempo que los pasos que hicimos. Acabamos de crear manualmente los usuarios [email protected] y [email protected] con las contraseñas correctas. Esto nos permitió pasar este paso y otro error:

TASK [ansible-role-XtraDB-Cluster : Start the master node] ************************************************************************************************************************************************************************************************************************
skipping: [node1]
skipping: [node2]
skipping: [node3]

TASK [ansible-role-XtraDB-Cluster : Start the master node] ************************************************************************************************************************************************************************************************************************
skipping: [node1]
skipping: [node2]
skipping: [node3]

TASK [ansible-role-XtraDB-Cluster : Create SST user] ******************************************************************************************************************************************************************************************************************************
skipping: [node1]
skipping: [node2]
skipping: [node3]

TASK [ansible-role-XtraDB-Cluster : Start the slave nodes] ************************************************************************************************************************************************************************************************************************
fatal: [node3]: FAILED! => {"changed": false, "msg": "Unable to start service mysql: Job for mysql.service failed because the control process exited with error code. See \"systemctl status mysql.service\" and \"journalctl -xe\" for details.\n"}
fatal: [node2]: FAILED! => {"changed": false, "msg": "Unable to start service mysql: Job for mysql.service failed because the control process exited with error code. See \"systemctl status mysql.service\" and \"journalctl -xe\" for details.\n"}
fatal: [node1]: FAILED! => {"changed": false, "msg": "Unable to start service mysql: Job for mysql.service failed because the control process exited with error code. See \"systemctl status mysql.service\" and \"journalctl -xe\" for details.\n"}
    to retry, use: --limit @/root/pxcansible/pxcplay.retry

Para esta sección dedicamos 18 minutos y 55 segundos.

Solución del problema "Iniciar los nodos esclavos" (parte 1):7 minutos y 40 segundos

Probamos un par de cosas para resolver este problema. Intentamos especificar el nodo usando su nombre, intentamos cambiar los nombres de los grupos, pero nada resolvió el problema. Decidimos limpiar el entorno utilizando el script provisto en la documentación y comenzar desde cero. No lo limpió, pero solo empeoró las cosas. Después de 7 minutos y 40 segundos, decidimos eliminar las máquinas virtuales, recrear el entorno y comenzar desde cero con la esperanza de que cuando agreguemos las dependencias de Python, esto resolverá nuestro problema.

Solución del problema "Iniciar los nodos esclavos" (parte 2):13 minutos y 15 segundos

Desafortunadamente, configurar los requisitos previos de Python no ayudó en absoluto. Decidimos terminar el proceso manualmente, arrancando el primer nodo y luego configurando el usuario SST e iniciando los esclavos restantes. Esto completó la configuración "automatizada" y nos llevó 13 minutos y 15 segundos depurar y finalmente aceptar que no funcionará como esperaba el diseñador del libro de jugadas.

Depuración adicional:10 minutos y 45 segundos

No nos detuvimos allí y decidimos que intentaremos una cosa más. En lugar de confiar en las variables de Ansible, simplemente colocamos la IP de uno de los nodos como nodo maestro. Esto resolvió esa parte del problema y terminamos con:

TASK [ansible-role-XtraDB-Cluster : Create SST user] ******************************************************************************************************************************************************************************************************************************
skipping: [node2]
skipping: [node3]
fatal: [node1]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1045, u\"Access denied for user 'root'@'::1' (using password: YES)\")"}

Este fue el final de nuestros intentos:intentamos agregar este usuario pero no funcionó correctamente a través del libro de jugadas de ansible, mientras que podíamos usar la dirección de host local IPv6 para conectarnos cuando usamos el cliente MySQL.

Tiempo total de instalación:desconocido (la instalación automatizada falló)

En total, pasamos 64 minutos y todavía no hemos logrado que todo funcione automáticamente. Los problemas restantes son la creación de una contraseña de root que no parece funcionar y luego iniciar Galera Cluster (problema de usuario de SST). Es difícil saber cuánto tiempo llevará depurarlo más. Seguro que es posible, simplemente es difícil de cuantificar porque realmente depende de la experiencia con Ansible y MySQL. Definitivamente no es algo que cualquiera pueda simplemente descargar, configurar y ejecutar. Bueno, ¿tal vez otro libro de jugadas hubiera funcionado de manera diferente? Es posible, pero también puede dar lugar a diferentes problemas. Ok, entonces hay una curva de aprendizaje para escalar y depuración para hacer, pero luego, cuando esté todo listo, simplemente ejecutará un script. Bueno, eso es algo cierto. Mientras los cambios introducidos por el mantenedor no rompan algo de lo que usted depende o la nueva versión de Ansible rompa el libro de jugadas o el mantenedor simplemente se olvide del proyecto y deje de desarrollarlo (para el rol que usamos hay una solicitud de extracción bastante útil en espera ya durante casi un año, lo que podría resolver el problema de dependencia de Python; no se ha fusionado). A menos que acepte que tendrá que mantener este código, realmente no puede confiar en que sea 100% preciso y funcione en su entorno, especialmente dado que el desarrollador original no tiene incentivos para mantener el código actualizado. Además, ¿qué pasa con otras versiones? No puede usar este libro de jugadas en particular para instalar PXC 5.6 o cualquier versión de MariaDB. Claro, hay otros libros de jugadas que puedes encontrar. ¿Funcionarán mejor o tal vez pasarás un montón de horas intentando que funcionen?

ClusterControlConsola única para toda su infraestructura de base de datosDescubra qué más hay de nuevo en ClusterControlInstale ClusterControl GRATIS

Control de clúster

Finalmente, echemos un vistazo a cómo se puede usar ClusterControl para implementar Percona XtraDB Cluster.

Configuración de la conectividad SSH - 1 minuto

ClusterControl requiere conectividad SSH en todos los nodos para conectarse y configurarlos. Generamos una clave SSH y la distribuimos manualmente entre los nodos.

Configuración de ClusterControl:3 minutos y 15 segundos

La búsqueda rápida "Instalación de ClusterControl" nos dirigió a la página de documentación relevante de ClusterControl. Estábamos buscando una "forma más sencilla de instalar ClusterControl", por lo que seguimos el enlace y encontramos las siguientes instrucciones.

Descargar el script y ejecutarlo tomó 3 minutos y 15 segundos, tuvimos que tomar algunas medidas mientras se realizaba la instalación para que no sea una instalación desatendida.

Inicio de sesión en la interfaz de usuario e inicio de la implementación:1 minuto y 10 segundos

Apuntamos nuestro navegador a la IP del nodo ClusterControl.

Pasamos la información de contacto requerida y se nos presentó la pantalla de Bienvenida:

Siguiente paso:elegimos la opción de implementación.

Tuvimos que pasar los detalles de conectividad SSH.

También decidimos el proveedor, la versión, la contraseña y los hosts a utilizar. Todo este proceso tomó 1 minuto y 10 segundos.

Implementación del clúster Percona XtraDB:12 ​​minutos y 5 segundos

Lo único que quedaba era esperar a que ClusterControl terminara el despliegue. Después de 12 minutos y 5 segundos, el clúster estaba listo:

Tiempo total de instalación:17 minutos y 30 segundos

Recursos relacionados ClusterControl para MySQL ClusterControl para MariaDB ClusterControl para Galera Cluster

Logramos implementar ClusterControl y luego el clúster PXC usando ClusterControl en 17 minutos y 30 segundos. La implementación de PXC en sí tomó 12 minutos y 5 segundos . Al final tenemos un clúster de trabajo, desplegado de acuerdo con las mejores prácticas. ClusterControl también garantiza que la configuración del clúster tenga sentido. En resumen, incluso si realmente no sabe nada sobre MySQL o Galera Cluster, puede implementar un clúster listo para producción en un par de minutos. ClusterControl no es solo una herramienta de implementación, también es una plataforma de administración:facilita aún más las cosas para las personas que no tienen experiencia con MySQL y Galera para identificar problemas de rendimiento (a través de asesores) y realizar acciones de administración (ampliación y reducción del clúster, ejecución de copias de seguridad, creación de esclavos asincrónicos de Galera). Lo que es importante, ClusterControl siempre se mantendrá y se puede usar para implementar todas las versiones de MySQL (y no solo MySQL/MariaDB, también es compatible con TimeScaleDB, PostgreSQL y MongoDB). También funcionó de inmediato, algo que no se puede decir de otros métodos que probamos.

Si desea experimentar lo mismo, puede descargar ClusterControl de forma gratuita. Háganos saber si le gustó.