WHM y cPanel es sin duda el panel de control de alojamiento más popular para entornos basados en Linux. Admite varios backends de bases de datos:MySQL, MariaDB y PostgreSQL como el almacén de datos de la aplicación. WHM solo admite configuraciones de bases de datos independientes y puede implementarlas localmente (configuración predeterminada) o de forma remota, mediante la integración con un servidor de base de datos externo. Este último sería mejor si desea tener una mejor distribución de la carga, ya que WHM/cPanel maneja una serie de procesos y aplicaciones como HTTP(S), FTP, DNS, MySQL y demás.
En esta publicación de blog, le mostraremos cómo integrar una configuración de replicación MySQL externa en WHM sin problemas, para mejorar la disponibilidad de la base de datos y descargar el servidor de alojamiento WHM/cPanel. Los proveedores de hospedaje que ejecutan MySQL localmente en el servidor WHM sabrán qué tan exigente es MySQL en términos de utilización de recursos (según la cantidad de cuentas que hospeda y las especificaciones del servidor).
Replicación MySQL en WHM/cPanel
De forma predeterminada, WHM admite de forma nativa MariaDB y MySQL como una configuración independiente. Puede conectar un servidor MySQL externo a WHM, pero actuará como un host independiente. Además, los usuarios de cPanel deben conocer la dirección IP del servidor MySQL y especificar manualmente el host externo en su aplicación web si esta función está habilitada.
En esta publicación de blog, vamos a utilizar el archivo de socket ProxySQL UNIX para engañar a WHM/cPanel para que se conecte al servidor MySQL externo a través del archivo de socket UNIX. De esta manera, tendrá la sensación de ejecutar MySQL localmente para que los usuarios puedan usar "localhost" con el puerto 3306 como su host de base de datos MySQL.
El siguiente diagrama ilustra la arquitectura final:
Estamos teniendo un nuevo servidor WHM, instalado con WHM/cPanel 80.0 (compilación 18). Luego tenemos otros tres servidores:uno para ClusterControl y dos para la replicación maestro-esclavo. ProxySQL se instalará en el propio servidor WHM.
Implementación de la replicación de MySQL
Al momento de escribir este artículo, estamos usando WHM 80.0 (compilación 18) que solo admite hasta MySQL 5.7 y MariaDB 10.3. En este caso, vamos a utilizar MySQL 5.7 de Oracle. Suponemos que ya ha instalado ClusterControl en el servidor de ClusterControl.
En primer lugar, configure SSH sin contraseña desde el servidor ClusterControl a los servidores de replicación MySQL. En el servidor ClusterControl, haga:
$ ssh-copy-id 192.168.0.31
$ ssh-copy-id 192.168.0.32
Asegúrese de que puede ejecutar el siguiente comando en ClusterControl sin solicitud de contraseña en el medio:
$ ssh 192.168.0.31 "sudo ls -al /root"
$ ssh 192.168.0.32 "sudo ls -al /root"
Luego vaya a ClusterControl -> Implementar -> MySQL Replication e ingrese la información requerida. En el segundo paso, elija Oracle como proveedor y 5.7 como versión de la base de datos:
Luego, especifique la dirección IP del maestro y el esclavo:
Preste atención a la marca verde justo antes de la dirección IP. Significa que ClusterControl puede conectarse al servidor y está listo para el siguiente paso. Haga clic en Implementar para iniciar la implementación. El proceso de implementación debería demorar entre 15 y 20 minutos.
Implementación de ProxySQL en WHM/cPanel
Dado que queremos que ProxySQL se haga cargo del puerto MySQL predeterminado 3306, primero debemos modificar el servidor MySQL existente instalado por WHM para escuchar otro puerto y otro archivo de socket. En /etc/my.cnf, modifique las siguientes líneas (agréguelas si no existen):
socket=/var/lib/mysql/mysql2.sock
port=3307
bind-address=127.0.0.1
Luego, reinicie el servidor MySQL en el servidor cPanel:
$ systemctl restart mysqld
En este punto, el servidor MySQL local debería estar escuchando en el puerto 3307, vincularse solo a localhost (lo cerramos del acceso externo para que sea más seguro). Ahora podemos proceder a implementar ProxySQL en el host WHM, 192.168.0.16 a través de ClusterControl.
Primero, configure SSH sin contraseña desde el nodo ClusterControl al servidor WHM en el que queremos instalar ProxySQL:
(clustercontrol)$ ssh-copy-id [email protected]
Asegúrese de que puede ejecutar el siguiente comando en ClusterControl sin solicitud de contraseña en el medio:
(clustercontrol)$ ssh 192.168.0.16 "sudo ls -al /root"
Luego, vaya a ClusterControl -> Administrar -> Load Balancers -> ProxySQL -> Implementar ProxySQL y especifique la información requerida:
Rellene todos los detalles necesarios como se destaca por las flechas de arriba en el diagrama. La dirección del servidor es el servidor WHM, 192.168.0.16. El puerto de escucha es el 3306 en el servidor WHM, tomando el MySQL local que ya se está ejecutando en el puerto 3307. Más abajo, especificamos la contraseña de los usuarios de administración y supervisión de ProxySQL. Luego incluya ambos servidores MySQL en el conjunto de equilibrio de carga y luego elija "No" en la sección Transacciones implícitas. Haga clic en Implementar ProxySQL para iniciar la implementación.
Nuestro ProxySQL ahora está instalado y configurado con dos grupos de host para la replicación de MySQL. Uno para el grupo de escritores (grupo de host 10), donde todas las conexiones se reenviarán al maestro y al grupo de lectores (grupo de host 20) para todas las cargas de trabajo de solo lectura que se equilibrarán en ambos servidores MySQL.
El siguiente paso es otorgar el usuario raíz de MySQL e importarlo a ProxySQL. De vez en cuando, WHM de alguna manera se conecta a la base de datos a través de una conexión TCP, sin pasar por el archivo de socket UNIX. En este caso, debemos permitir el acceso a la raíz de MySQL desde [email protected] y [email protected] (la dirección IP del servidor WHM) en nuestro clúster de replicación.
Por lo tanto, es necesario ejecutar la siguiente declaración en el servidor maestro (192.168.0.31):
(master)$ mysql -uroot -p
mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.16' IDENTIFIED BY '[email protected]' WITH GRANT OPTION;
Luego, importe el usuario 'root'@'localhost' de nuestro servidor MySQL al usuario ProxySQL yendo a ClusterControl -> Nodos -> elija el nodo ProxySQL -> Usuarios -> Importar usuarios . Se le presentará el siguiente cuadro de diálogo:
Marque la casilla de verificación [email protected] y haga clic en Siguiente. En la Configuración de usuario página, elija el grupo de host 10 como el grupo de host predeterminado para el usuario:
Luego podemos verificar si ProxySQL se está ejecutando correctamente en el servidor WHM/cPanel usando el siguiente comando:
$ netstat -tulpn | grep -i proxysql
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 17306/proxysql
tcp 0 0 0.0.0.0:6032 0.0.0.0:* LISTEN 17306/proxysql
El puerto 3306 es lo que ProxySQL debería estar escuchando para aceptar todas las conexiones MySQL. El puerto 6032 es el puerto de administración de ProxySQL, donde nos conectaremos para configurar y monitorear los componentes de ProxySQL como usuarios, grupos de host, servidores y variables.
En este punto, si va a ClusterControl -> Topología , debería ver la siguiente topología:
Configuración del zócalo MySQL UNIX
En un entorno Linux, si define el host MySQL como "localhost", el cliente/aplicación intentará conectarse a través del archivo de socket UNIX, que de forma predeterminada se encuentra en /var/lib/mysql/mysql.sock en el servidor cPanel. Usar el archivo de socket es la forma más recomendada de acceder al servidor MySQL, porque tiene menos sobrecarga en comparación con las conexiones TCP. Un archivo de socket en realidad no contiene datos, los transporta. Es como una tubería local que el servidor y los clientes en la misma máquina pueden usar para conectarse e intercambiar solicitudes y datos.
Habiendo dicho eso, si su aplicación se conecta a través de "localhost" y el puerto 3306 como host y puerto de la base de datos, se conectará a través de un archivo de socket. Si usa "127.0.0.1" y el puerto 3306, lo más probable es que la aplicación se conecte a la base de datos a través de TCP. Este comportamiento está bien explicado en la documentación de MySQL. En palabras simples, use el archivo de socket (o "localhost") para la comunicación local y use TCP si la aplicación se conecta de forma remota.
En cPanel, el archivo de socket MySQL es monitoreado por el proceso cpservd y estaría vinculado a otro archivo de socket si configuramos una ruta diferente a la predeterminada. Por ejemplo, supongamos que configuramos un archivo de socket MySQL no predeterminado como lo configuramos en la sección anterior:
$ cat /etc/my.cnf | grep socket
socket=/var/lib/mysql/mysql2.sock
cPanel a través del proceso cpservd corregiría esto creando un enlace simbólico a la ruta del socket predeterminado:
(whm)$ ls -al /var/lib/mysql/mysql.sock
lrwxrwxrwx. 1 root root 34 Jul 4 12:25 /var/lib/mysql/mysql.sock -> ../../../var/lib/mysql/mysql2.sock
Para evitar que cpservd vuelva a corregir esto automáticamente (cPanel tiene un término para este comportamiento llamado "automágicamente"), debemos deshabilitar el monitoreo de MySQL yendo a WHM -> Administrador de servicios (no vamos a usar el MySQL local de todos modos) y desmarque la casilla de verificación "Monitor" para MySQL como se muestra en la siguiente captura de pantalla:
Guarde los cambios en WHM. Ahora es seguro eliminar el archivo de socket predeterminado y crear un enlace simbólico al archivo de socket ProxySQL con el siguiente comando:
(whm)$ ln -s /tmp/proxysql.sock /var/lib/mysql/mysql.sock
Verifique que el archivo de socket MySQL del socket ahora se redirige al archivo de socket ProxySQL:
(whm)$ ls -al /var/lib/mysql/mysql.sock
lrwxrwxrwx. 1 root root 18 Jul 3 12:47 /var/lib/mysql/mysql.sock -> /tmp/proxysql.sock
También necesitamos cambiar las credenciales de inicio de sesión predeterminadas dentro de /root/.my.cnf de la siguiente manera:
(whm)$ cat ~/.my.cnf
[client]
#password="T<y4ar&cgjIu"
user=root
password='[email protected]'
socket=/var/lib/mysql/mysql.sock
Un poco de explicación:la primera línea que comentamos es la contraseña raíz de MySQL generada por cPanel para el servidor MySQL local. No vamos a usar eso, por lo tanto, el '#' está al principio de la línea. Luego, agregamos la contraseña raíz de MySQL para nuestra configuración de replicación de MySQL y la ruta del socket UNIX, que ahora es un enlace simbólico al archivo de socket ProxySQL.
En este punto, en el servidor WHM debería poder acceder a nuestro clúster de replicación de MySQL como usuario root simplemente escribiendo "mysql", por ejemplo:
(whm)$ mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 239
Server version: 5.5.30 (ProxySQL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Observe que la versión del servidor es 5.5.30 (ProxySQL). Si puede conectarse como se indicó anteriormente, podemos configurar la parte de integración como se describe en la siguiente sección.
Integración WHM/cPanel
WHM admite varios servidores de bases de datos, a saber, MySQL 5.7, MariaDB 10.2 y MariaDB 10.3. Dado que WHM ahora solo ve ProxySQL y se detecta como la versión 5.5.30 (como se indicó anteriormente), WHM se quejará de la versión de MySQL no compatible. Puede ir a WHM -> Servicios SQL -> Administrar perfiles de MySQL y haga clic en el botón Validar. Debería recibir una notificación de tostadora roja en la esquina superior derecha informando sobre este error.
Por lo tanto, tenemos que cambiar la versión de MySQL en ProxySQL a la misma versión que nuestro clúster de replicación de MySQL. Puede obtener esta información ejecutando la siguiente declaración en el servidor maestro:
mysql> SELECT @@version;
+------------+
| @@version |
+------------+
| 5.7.26-log |
+------------+
Luego, inicie sesión en la consola de administración de ProxySQL para cambiar la mysql-server_version variables:
(whm)$ mysql -uproxysql-admin -p -h192.168.0.16 -P6032
Use la declaración SET como se muestra a continuación:
mysql> SET mysql-server_version = '5.7.26';
Luego cargue la variable en el tiempo de ejecución y guárdela en el disco para que sea persistente:
mysql> LOAD MYSQL VARIABLES TO RUNTIME;
mysql> SAVE MYSQL VARIABLES TO DISK;
Finalmente verifique la versión que representará ProxySQL:
mysql> SHOW VARIABLES LIKE 'mysql-server_version';
+----------------------+--------+
| Variable_name | Value |
+----------------------+--------+
| mysql-server_version | 5.7.26 |
+----------------------+--------+
Si vuelve a intentar conectarse a MySQL ejecutando el comando "mysql", ahora debería obtener "Versión del servidor:5.7.26 (ProxySQL)" en la terminal.
Ahora podemos actualizar la contraseña raíz de MySQL en WHM -> Servicios SQL -> Administrar perfiles de MySQL . Edite el perfil localhost cambiando el campo Contraseña en la parte inferior con la contraseña raíz de MySQL de nuestro clúster de replicación. Haga clic en el botón Guardar una vez hecho. Luego podemos hacer clic en "Validar" para verificar si WHM puede acceder correctamente a nuestro clúster de replicación MySQL a través del servicio ProxySQL. Debería obtener la siguiente tostadora verde en la esquina superior derecha:
Si recibe la notificación de la tostadora verde, podemos proceder a integrar ProxySQL a través del gancho de cPanel.
Integración de ProxySQL a través de cPanel Hook
ProxySQL, como intermediario entre WHM y la replicación de MySQL, debe tener un nombre de usuario y una contraseña para cada usuario de MySQL que pasará por él. Con la arquitectura actual, si se crea un usuario a través del panel de control (WHM a través de la creación de una cuenta o cPanel a través del asistente de base de datos MySQL), WHM creará automáticamente el usuario directamente en nuestro clúster de replicación MySQL usando [email protected] (que se ha importado en ProxySQL de antemano). Sin embargo, el mismo usuario de la base de datos no se agregaría automáticamente a la tabla mysql_users de ProxySQL.
Desde la perspectiva del usuario final, esto no funcionaría porque todas las conexiones de host local en este punto deberían pasar a través de ProxySQL. Necesitamos una forma de integrar cPanel con ProxySQL, por lo que para cualquier operación relacionada con el usuario de MySQL realizada por WHM y cPanel, se debe notificar a ProxySQL y realizar las acciones necesarias para agregar/eliminar/actualizar su tabla interna mysql_users.
La mejor manera de automatizar e integrar estos componentes es mediante el uso del sistema de enlace estandarizado de cPanel. Los ganchos estandarizados activan aplicaciones cuando cPanel y WHM realizan una acción. Use este sistema para ejecutar código personalizado (código de acción de enlace) para personalizar cómo funciona cPanel y WHM en escenarios específicos (eventos conectables).
En primer lugar, cree un archivo de módulo de Perl llamado ProxysqlHook.pm en el directorio /usr/local/cpanel:
$ touch /usr/local/cpanel/ProxysqlHook.pm
Luego, copie y pegue las líneas desde aquí. Para obtener más información, consulte el repositorio de Github en ProxySQL cPanel Hook.
Configure la interfaz de administración de ProxySQL desde la línea 16 hasta la 19:
my $proxysql_admin_host = '192.168.0.16';
my $proxysql_admin_port = '6032';
my $proxysql_admin_user = 'proxysql-admin';
my $proxysql_admin_pass = 'mys3cr3t';
Ahora que el hook está en su lugar, necesitamos registrarlo con el sistema de hooks de cPanel:
(whm)$ /usr/local/cpanel/bin/manage_hooks add module ProxysqlHook
info [manage_hooks] **** Reading ProxySQL information: Host: 192.168.0.16, Port: 6032, User: proxysql-admin *****
Added hook for Whostmgr::Accounts::Create to hooks registry
Added hook for Whostmgr::Accounts::Remove to hooks registry
Added hook for Cpanel::UAPI::Mysql::create_user to hooks registry
Added hook for Cpanel::Api2::MySQLFE::createdbuser to hooks registry
Added hook for Cpanel::UAPI::Mysql::delete_user to hooks registry
Added hook for Cpanel::Api2::MySQLFE::deletedbuser to hooks registry
Added hook for Cpanel::UAPI::Mysql::set_privileges_on_database to hooks registry
Added hook for Cpanel::Api2::MySQLFE::setdbuserprivileges to hooks registry
Added hook for Cpanel::UAPI::Mysql::rename_user to hooks registry
Added hook for Cpanel::UAPI::Mysql::set_password to hooks registry
A partir del resultado anterior, este módulo se conecta a una serie de eventos de cPanel y WHM:
- Whostmgr::Cuentas::Crear - WHM -> Funciones de cuenta -> Crear una nueva cuenta
- Whostmgr::Accounts::Remove - WHM -> Funciones de cuenta -> Terminar una cuenta
- Cpanel::UAPI::Mysql::create_user - cPanel -> Bases de datos -> Bases de datos MySQL -> Agregar nuevo usuario
- Cpanel::Api2::MySQLFE::createdbuser - cPanel -> Bases de datos -> Bases de datos MySQL -> Agregar nuevo usuario (requerido para la integración de Softaculous).
- Cpanel::UAPI::Mysql::delete_user - cPanel -> Bases de datos -> Bases de datos MySQL -> Eliminar usuario
- Cpanel::Api2::MySQLFE::deletedbuser - cPanel -> Bases de datos -> Bases de datos MySQL -> Agregar nuevo usuario (requerido para la integración de Softaculous).
- Cpanel::UAPI::Mysql::set_privileges_on_database - cPanel -> Bases de datos -> Bases de datos MySQL -> Agregar usuario a la base de datos
- Cpanel::Api2::MySQLFE::setdbuserprivileges - cPanel -> Bases de datos -> Bases de datos MySQL -> Agregar usuario a la base de datos (requerido para la integración de Softaculous).
- Cpanel::UAPI::Mysql::rename_user - cPanel -> Bases de datos -> Bases de datos MySQL -> Cambiar nombre de usuario
- Cpanel::UAPI::Mysql::set_password - cPanel -> Bases de datos -> Bases de datos MySQL -> Cambiar contraseña
Si se activa el evento anterior, el módulo ejecutará las acciones necesarias para sincronizar la tabla mysql_users en ProxySQL. Realiza las operaciones a través de la interfaz de administración de ProxySQL que se ejecuta en el puerto 6032 en el servidor WHM. Por lo tanto, es vital especificar las credenciales de usuario correctas para el usuario administrador de ProxySQL para asegurarse de que todos los usuarios se sincronizarán con ProxySQL correctamente.
Tenga en cuenta que este módulo, ProxysqlHook.pm, nunca se ha probado en el entorno de alojamiento real (con muchas cuentas y muchos complementos de terceros) y obviamente no cubre todos los eventos relacionados con MySQL dentro de cPanel. Lo hemos probado con la edición gratuita de Softaculous y funcionó muy bien a través de los ganchos de cPanel API2. Es posible que se requieran algunas modificaciones adicionales para adoptar la automatización completa.
Eso es todo por ahora. En la siguiente parte, analizaremos las operaciones posteriores a la implementación y lo que podríamos ganar con nuestra solución de servidor MySQL de alta disponibilidad para nuestros servidores de alojamiento en comparación con la configuración independiente estándar de MySQL.