sql >> Base de Datos >  >> RDS >> Mysql

Cómo automatizar la migración de MySQL independiente a Galera Cluster usando Ansible

Las migraciones de bases de datos no escalan bien. Por lo general, debe realizar una gran cantidad de pruebas antes de apretar el gatillo y cambiar de lo antiguo a lo nuevo. Las migraciones generalmente se realizan manualmente, ya que la mayor parte del proceso no se presta a la automatización. Pero eso no significa que no haya espacio para la automatización en el proceso de migración. Imagine configurar varios nodos con software nuevo, aprovisionarlos con datos y configurar manualmente la replicación entre entornos antiguos y nuevos. Esto lleva días. La automatización puede ser muy útil al configurar un nuevo entorno y aprovisionarlo con datos. En esta publicación de blog, veremos una migración muy simple:de Percona Server 5.7 independiente a Percona XtraDB Cluster 5.7 de 3 nodos. Usaremos Ansible para lograrlo.

Descripción del entorno

En primer lugar, un descargo de responsabilidad importante:lo que vamos a mostrar aquí es solo un borrador de lo que le gustaría ejecutar en producción. Funciona en nuestro entorno de prueba, pero puede requerir modificaciones para que sea adecuado para su entorno. En nuestras pruebas, usamos cuatro máquinas virtuales Ubuntu 16.04 implementadas con Vagrant. Uno contiene Percona Server 5.7 independiente, los tres restantes se utilizarán para los nodos de Percona XtraDB Cluster. También usamos un nodo separado para ejecutar libros de jugadas de ansible, aunque esto no es un requisito y el libro de jugadas también se puede ejecutar desde uno de los nodos. Además, la conectividad SSH está disponible entre todos los nodos. Debe tener conectividad desde el host donde ejecuta ansible, pero tener la capacidad de ssh entre nodos es útil (especialmente entre el maestro y el nuevo esclavo; confiamos en esto en el libro de jugadas).

Estructura del libro de jugadas

Los libros de jugadas de Ansible suelen compartir una estructura común:usted crea roles, que se pueden asignar a diferentes hosts. Cada rol contendrá tareas que se ejecutarán en él, plantillas que se utilizarán, archivos que se cargarán, variables que se definen para este libro de jugadas en particular. En nuestro caso, el libro de jugadas es muy simple.

.
├── inventory
├── playbook.yml
├── roles
│   ├── first_node
│   │   ├── my.cnf.j2
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │       └── my.cnf.j2
│   ├── galera
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │       └── my.cnf.j2
│   ├── master
│   │   └── tasks
│   │       └── main.yml
│   └── slave
│       └── tasks
│           └── main.yml
└── vars
    └── default.yml

Definimos un par de roles:tenemos un rol maestro, que está destinado a realizar algunas comprobaciones de cordura en el nodo independiente. Hay un nodo esclavo, que se ejecutará en uno de los nodos de Galera para configurarlo para la replicación y configurar la replicación asíncrona. Luego tenemos un rol para todos los nodos de Galera y un rol para el primer nodo de Galera para iniciar el clúster desde él. Para los roles de Galera, tenemos un par de plantillas que usaremos para crear archivos my.cnf. También usaremos .my.cnf local para definir un nombre de usuario y una contraseña. Tenemos un archivo que contiene un par de variables que podemos personalizar, como las contraseñas. Finalmente, tenemos un archivo de inventario, que define los hosts en los que ejecutaremos el libro de jugadas, también tenemos el archivo del libro de jugadas con información sobre cómo se deben ejecutar exactamente las cosas. Echemos un vistazo a los bits individuales.

Archivo de inventario

Este es un archivo muy simple.

[galera]
10.0.0.142
10.0.0.143
10.0.0.144

[first_node]
10.0.0.142

[master]
10.0.0.141

Tenemos tres grupos, 'galera', que contiene todos los nodos de Galera, 'first_node', que usaremos para el arranque y finalmente 'master', que contiene nuestro nodo de Percona Server independiente.

Libro de jugadas.yml

El archivo playbook.yml contiene las pautas generales sobre cómo debe ejecutarse el libro de jugadas.

-   hosts: master
    gather_facts: yes
    become: true
    pre_tasks:
    -   name: Install Python2
        raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
    vars_files:
        -   vars/default.yml
    roles:
    -   { role: master }

Como puede ver, comenzamos con el nodo independiente y aplicamos tareas relacionadas con el rol "maestro" (discutiremos esto en detalle más adelante en esta publicación).

-   hosts: first_node
    gather_facts: yes
    become: true
    pre_tasks:
    -   name: Install Python2
        raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
    vars_files:
        -   vars/default.yml
    roles:
    -   { role: first_node }
    -   { role: slave }

En segundo lugar, vamos al nodo definido en el grupo 'first_node' y aplicamos dos roles:'first_node' y 'slave'. El primero está destinado a implementar un clúster PXC de un solo nodo, el segundo lo configurará para que funcione como esclavo y configure la replicación.

-   hosts: galera
    gather_facts: yes
    become: true
    pre_tasks:
    -   name: Install Python2
        raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
    vars_files:
        -   vars/default.yml
    roles:
    -   { role: galera }

Finalmente, revisamos todos los nodos de Galera y aplicamos el rol 'galera' en todos ellos.

Guía de DevOps para la gestión de bases de datos de VariousninesConozca lo que necesita saber para automatizar y gestionar sus bases de datos de código abiertoDescargar gratis

Variables

Antes de comenzar a analizar los roles, queremos mencionar las variables predeterminadas que definimos para este manual.

sst_user: "sstuser"
sst_password: "pa55w0rd"
root_password: "pass"
repl_user: "repl_user"
repl_password: "repl1cati0n"

Como dijimos, este es un libro de jugadas muy simple sin muchas opciones de personalización. Puede configurar usuarios y contraseñas y esto es básicamente todo. Un error:asegúrese de que la contraseña raíz del nodo independiente coincida con 'root_password' aquí, de lo contrario, el libro de jugadas no podría conectarse allí (se puede extender para manejarlo, pero no cubrimos eso).

Este archivo no tiene mucho valor pero, como regla general, desea cifrar cualquier archivo que contenga credenciales. Obviamente, esto es por razones de seguridad. Ansible viene con ansible-vault, que se puede usar para cifrar y descifrar archivos. No cubriremos los detalles aquí, todo lo que necesita saber está disponible en la documentación. En resumen, puede encriptar archivos fácilmente usando contraseñas y configurar su entorno para que los libros de jugadas puedan descifrarse automáticamente usando la contraseña del archivo o pasarse a mano.

Funciones

En esta sección repasaremos los roles que están definidos en el libro de jugadas, resumiendo lo que están destinados a realizar.

Rol maestro

Como dijimos, este rol está destinado a ejecutar una verificación de cordura en la configuración de MySQL independiente. Instalará los paquetes necesarios como percona-xtrabackup-24. También crea un usuario de replicación en el nodo principal. Se revisa una configuración para garantizar que se establezcan server_id y otras configuraciones relacionadas con la replicación y el registro binario. GTID también está habilitado, ya que confiaremos en él para la replicación.

Rol del primer nodo

Aquí se instala el primer nodo Galera. Se configurará el repositorio de Percona, se creará my.cnf a partir de la plantilla. Se instalará PXC. También realizamos una limpieza para eliminar usuarios innecesarios y crear aquellos que serán necesarios (usuario raíz con la contraseña que elijamos, usuario necesario para SST). Finalmente, el clúster se arranca usando este nodo. Confiamos en el 'wsrep_cluster_address' vacío como una forma de inicializar el clúster. Esta es la razón por la que más adelante todavía ejecutamos el rol 'galera' en el primer nodo, para intercambiar my.cnf inicial con el final, que contiene 'wsrep_cluster_address' con todos los miembros del clúster. Una cosa que vale la pena recordar:cuando crea un usuario raíz con contraseña, debe tener cuidado de no bloquear MySQL para que Ansible pueda ejecutar otros pasos del libro de jugadas. Una forma de hacerlo es proporcionar a .my.cnf el usuario y la contraseña correctos. Otra sería recordar configurar siempre login_user y login_password correctos en el módulo 'mysql_user'.

Rol de esclavo

Este rol se trata de configurar la replicación entre el nodo independiente y el clúster PXC de un solo nodo. Usamos xtrabackup para obtener los datos, también verificamos el gtid ejecutado en xtrabackup_binlog_info para garantizar que la copia de seguridad se restaurará correctamente y que se puede configurar la replicación. También realizamos un poco de la configuración, asegurándonos de que el nodo esclavo pueda usar la replicación GTID. Hay un par de errores aquí:no es posible ejecutar 'RESET MASTER' usando el módulo 'mysql_replication' a partir de Ansible 2.7.10, debería ser posible hacerlo en 2.8, siempre que salga. Tuvimos que usar el módulo 'shell' para ejecutar los comandos CLI de MySQL. Al reconstruir el nodo Galera desde una fuente externa, debe recordar volver a crear los usuarios necesarios (al menos el usuario utilizado para SST). De lo contrario, los nodos restantes no podrán unirse al clúster.

Rol de Galera

Finalmente, este es el rol en el que instalamos PXC en los dos nodos restantes. Lo ejecutamos en todos los nodos, el inicial obtendrá "producción" my.cnf en lugar de su versión "bootstrap". Los dos nodos restantes tendrán instalado PXC y obtendrán SST del primer nodo del clúster.

Resumen

Como puede ver, puede crear fácilmente un libro de jugadas Ansible simple y reutilizable que se puede usar para implementar Percona XtraDB Cluster y configurarlo para que sea un esclavo del nodo MySQL independiente. Para ser honesto, para migrar un solo servidor, esto probablemente no tenga sentido ya que hacer lo mismo manualmente será más rápido. Aún así, si espera tener que volver a ejecutar este proceso un par de veces, definitivamente tendrá sentido automatizarlo y hacerlo más eficiente en el tiempo. Como dijimos al principio, este no es un libro de jugadas listo para la producción. Es más una prueba de concepto, algo que puede ampliar para adaptarlo a su entorno. Puede encontrar un archivo con el libro de jugadas aquí:http://severalnines.com/sites/default/files/ansible.tar.gz

Esperamos que haya encontrado esta publicación de blog interesante y valiosa, no dude en compartir sus pensamientos.