WHM et cPanel sont sans aucun doute le panneau de contrôle d'hébergement le plus populaire pour les environnements basés sur Linux. Il prend en charge un certain nombre de bases de données - MySQL, MariaDB et PostgreSQL en tant que magasin de données d'application. WHM ne prend en charge que les configurations de base de données autonomes et vous pouvez soit le déployer localement (configuration par défaut) soit à distance, en l'intégrant à un serveur de base de données externe. Ce dernier serait préférable si vous souhaitez avoir une meilleure répartition de la charge, car WHM/cPanel gère un certain nombre de processus et d'applications comme HTTP(S), FTP, DNS, MySQL et autres.
Dans cet article de blog, nous allons vous montrer comment intégrer une configuration de réplication MySQL externe dans WHM de manière transparente, pour améliorer la disponibilité de la base de données et décharger le serveur d'hébergement WHM/cPanel. Les hébergeurs qui exécutent MySQL localement sur le serveur WHM savent à quel point MySQL est exigeant en termes d'utilisation des ressources (en fonction du nombre de comptes qu'il héberge et des spécifications du serveur).
Réplication MySQL sur WHM/cPanel
Par défaut, WHM prend en charge nativement MariaDB et MySQL en tant que configuration autonome. Vous pouvez attacher un serveur MySQL externe à WHM, mais il agira comme un hôte autonome. De plus, les utilisateurs de cPanel doivent connaître l'adresse IP du serveur MySQL et spécifier manuellement l'hôte externe dans leur application Web si cette fonctionnalité est activée.
Dans cet article de blog, nous allons utiliser le fichier de socket ProxySQL UNIX pour tromper WHM/cPanel en se connectant au serveur MySQL externe via le fichier de socket UNIX. De cette façon, vous avez l'impression d'exécuter MySQL localement afin que les utilisateurs puissent utiliser "localhost" avec le port 3306 comme hôte de base de données MySQL.
Le schéma suivant illustre l'architecture finale :
Nous avons un nouveau serveur WHM, installé avec WHM/cPanel 80.0 (build 18). Ensuite, nous avons trois autres serveurs - un pour ClusterControl et deux pour la réplication maître-esclave. ProxySQL sera installé sur le serveur WHM lui-même.
Déploiement de la réplication MySQL
Au moment d'écrire ces lignes, nous utilisons WHM 80.0 (build 18) qui ne prend en charge que jusqu'à MySQL 5.7 et MariaDB 10.3. Dans ce cas, nous allons utiliser MySQL 5.7 d'Oracle. Nous supposons que vous avez déjà installé ClusterControl sur le serveur ClusterControl.
Tout d'abord, configurez SSH sans mot de passe du serveur ClusterControl aux serveurs de réplication MySQL. Sur le serveur ClusterControl, faites :
$ ssh-copy-id 192.168.0.31
$ ssh-copy-id 192.168.0.32
Assurez-vous que vous pouvez exécuter la commande suivante sur ClusterControl sans invite de mot de passe :
$ ssh 192.168.0.31 "sudo ls -al /root"
$ ssh 192.168.0.32 "sudo ls -al /root"
Allez ensuite dans ClusterControl -> Deploy -> MySQL Replication et entrez les informations requises. À la deuxième étape, choisissez Oracle comme fournisseur et 5.7 comme version de la base de données :
Ensuite, indiquez l'adresse IP du maître et de l'esclave :
Faites attention à la coche verte juste avant l'adresse IP. Cela signifie que ClusterControl est capable de se connecter au serveur et est prêt pour l'étape suivante. Cliquez sur Déployer pour démarrer le déploiement. Le processus de déploiement devrait prendre 15 à 20 minutes.
Déployer ProxySQL sur WHM/cPanel
Puisque nous voulons que ProxySQL reprenne le port MySQL par défaut 3306, nous devons d'abord modifier le serveur MySQL existant installé par WHM pour écouter un autre port et un autre fichier socket. Dans /etc/my.cnf, modifiez les lignes suivantes (ajoutez-les si elles n'existent pas) :
socket=/var/lib/mysql/mysql2.sock
port=3307
bind-address=127.0.0.1
Ensuite, redémarrez le serveur MySQL sur le serveur cPanel :
$ systemctl restart mysqld
À ce stade, le serveur MySQL local devrait écouter sur le port 3307, se lier à localhost uniquement (nous le fermons de l'accès externe pour être plus sécurisé). Nous pouvons maintenant procéder au déploiement de ProxySQL sur l'hôte WHM, 192.168.0.16 via ClusterControl.
Tout d'abord, configurez SSH sans mot de passe du nœud ClusterControl au serveur WHM sur lequel nous voulons installer ProxySQL :
(clustercontrol)$ ssh-copy-id [email protected]
Assurez-vous que vous pouvez exécuter la commande suivante sur ClusterControl sans invite de mot de passe :
(clustercontrol)$ ssh 192.168.0.16 "sudo ls -al /root"
Ensuite, allez dans ClusterControl -> Gérer -> Équilibreurs de charge -> ProxySQL -> Déployer ProxySQL et précisez les informations requises :
Remplissez tous les détails nécessaires comme indiqué par les flèches ci-dessus dans le diagramme. L'adresse du serveur est le serveur WHM, 192.168.0.16. Le port d'écoute est 3306 sur le serveur WHM, prenant le relais du MySQL local qui s'exécute déjà sur le port 3307. Plus bas, nous spécifions le mot de passe de l'administrateur ProxySQL et des utilisateurs de surveillance. Ensuite, incluez les deux serveurs MySQL dans l'ensemble d'équilibrage de charge, puis choisissez "Non" dans la section Transactions implicites. Cliquez sur Déployer ProxySQL pour démarrer le déploiement.
Notre ProxySQL est maintenant installé et configuré avec deux groupes d'hôtes pour la réplication MySQL. Un pour le groupe d'écrivains (groupe d'hôtes 10), où toutes les connexions seront transmises au maître et au groupe de lecteurs (groupe d'hôtes 20) pour toutes les charges de travail en lecture seule qui seront réparties sur les deux serveurs MySQL.
L'étape suivante consiste à accorder l'utilisateur root MySQL et à l'importer dans ProxySQL. Parfois, WHM se connecte d'une manière ou d'une autre à la base de données via une connexion TCP, en contournant le fichier de socket UNIX. Dans ce cas, nous devons autoriser l'accès root à MySQL depuis [email protected] et [email protected] (l'adresse IP du serveur WHM) dans notre cluster de réplication.
Ainsi, l'exécution de l'instruction suivante sur le serveur maître (192.168.0.31) est nécessaire :
(master)$ mysql -uroot -p
mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.16' IDENTIFIED BY '[email protected]' WITH GRANT OPTION;
Ensuite, importez l'utilisateur 'root'@'localhost' de notre serveur MySQL dans l'utilisateur ProxySQL en allant dans ClusterControl -> Nodes -> choisissez le nœud ProxySQL -> Users -> Import Users . La boîte de dialogue suivante s'affichera :
Cochez la case [email protected] et cliquez sur Suivant. Dans les Paramètres utilisateur page, choisissez le groupe d'hôtes 10 comme groupe d'hôtes par défaut pour l'utilisateur :
Nous pouvons ensuite vérifier si ProxySQL fonctionne correctement sur le serveur WHM/cPanel en utilisant la commande suivante :
$ 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
Le port 3306 est ce que ProxySQL doit écouter pour accepter toutes les connexions MySQL. Le port 6032 est le port d'administration ProxySQL, où nous nous connecterons pour configurer et surveiller les composants ProxySQL tels que les utilisateurs, les groupes d'hôtes, les serveurs et les variables.
À ce stade, si vous accédez à ClusterControl -> Topologie , vous devriez voir la topologie suivante :
Configuration du socket MySQL UNIX
Dans un environnement Linux, si vous définissez l'hôte MySQL comme "localhost", le client/application tentera de se connecter via le fichier socket UNIX, qui se trouve par défaut dans /var/lib/mysql/mysql.sock sur le serveur cPanel. L'utilisation du fichier socket est le moyen le plus recommandé d'accéder au serveur MySQL, car il a moins de surcharge que les connexions TCP. Un fichier socket ne contient pas réellement de données, il les transporte. C'est comme un canal local que le serveur et les clients sur la même machine peuvent utiliser pour se connecter et échanger des requêtes et des données.
Cela dit, si votre application se connecte via "localhost" et le port 3306 en tant qu'hôte et port de la base de données, elle se connectera via un fichier socket. Si vous utilisez "127.0.0.1" et le port 3306, l'application se connectera très probablement à la base de données via TCP. Ce comportement est bien expliqué dans la documentation MySQL. En termes simples, utilisez le fichier socket (ou "localhost") pour la communication locale et utilisez TCP si l'application se connecte à distance.
Dans cPanel, le fichier de socket MySQL est surveillé par le processus cpservd et serait lié à un autre fichier de socket si nous configurions un chemin différent de celui par défaut. Par exemple, supposons que nous configurions un fichier de socket MySQL autre que celui par défaut, comme nous l'avons configuré dans la section précédente :
$ cat /etc/my.cnf | grep socket
socket=/var/lib/mysql/mysql2.sock
cPanel via le processus cpservd corrigerait cela en créant un lien symbolique vers le chemin du socket par défaut :
(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
Pour éviter que cpservd ne corrige automatiquement cela (cPanel a un terme pour ce comportement appelé "automagiquement"), nous devons désactiver la surveillance MySQL en allant dans WHM -> Service Manager (nous n'allons pas utiliser le MySQL local de toute façon) et décochez la case "Monitor" pour MySQL comme indiqué dans la capture d'écran ci-dessous :
Enregistrez les modifications dans WHM. Vous pouvez maintenant supprimer en toute sécurité le fichier de socket par défaut et créer un lien symbolique vers le fichier de socket ProxySQL avec la commande suivante :
(whm)$ ln -s /tmp/proxysql.sock /var/lib/mysql/mysql.sock
Vérifiez que le fichier de socket MySQL est maintenant redirigé vers le fichier 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
Nous devons également modifier les identifiants de connexion par défaut dans /root/.my.cnf comme suit :
(whm)$ cat ~/.my.cnf
[client]
#password="T<y4ar&cgjIu"
user=root
password='[email protected]'
socket=/var/lib/mysql/mysql.sock
Un peu d'explication - La première ligne que nous avons commentée est le mot de passe root MySQL généré par cPanel pour le serveur MySQL local. Nous n'allons pas l'utiliser, donc le '#' est au début de la ligne. Ensuite, nous avons ajouté le mot de passe root MySQL pour notre configuration de réplication MySQL et le chemin du socket UNIX, qui est maintenant un lien symbolique vers le fichier socket ProxySQL.
À ce stade, sur le serveur WHM, vous devriez pouvoir accéder à notre cluster de réplication MySQL en tant qu'utilisateur root en tapant simplement "mysql", par exemple :
(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>
Notez que la version du serveur est 5.5.30 (ProxySQL). Si vous pouvez vous connecter comme ci-dessus, nous pouvons configurer la partie intégration comme décrit dans la section suivante.
Intégration WHM/cPanel
WHM prend en charge un certain nombre de serveurs de base de données, à savoir MySQL 5.7, MariaDB 10.2 et MariaDB 10.3. Étant donné que WHM ne voit plus que ProxySQL et qu'il est détecté en tant que version 5.5.30 (comme indiqué ci-dessus), WHM se plaindra de la version MySQL non prise en charge. Vous pouvez aller dans WHM -> SQL Services -> Gérer les profils MySQL et cliquez sur le bouton Valider. Vous devriez recevoir une notification de grille-pain rouge dans le coin supérieur droit indiquant cette erreur.
Par conséquent, nous devons changer la version de MySQL dans ProxySQL pour la même version que notre cluster de réplication MySQL. Vous pouvez obtenir ces informations en exécutant l'instruction suivante sur le serveur maître :
mysql> SELECT @@version;
+------------+
| @@version |
+------------+
| 5.7.26-log |
+------------+
Ensuite, connectez-vous à la console d'administration ProxySQL pour modifier la mysql-server_version variables :
(whm)$ mysql -uproxysql-admin -p -h192.168.0.16 -P6032
Utilisez l'instruction SET comme ci-dessous :
mysql> SET mysql-server_version = '5.7.26';
Chargez ensuite la variable dans l'environnement d'exécution et enregistrez-la sur le disque pour la rendre persistante :
mysql> LOAD MYSQL VARIABLES TO RUNTIME;
mysql> SAVE MYSQL VARIABLES TO DISK;
Enfin, vérifiez la version que ProxySQL représentera :
mysql> SHOW VARIABLES LIKE 'mysql-server_version';
+----------------------+--------+
| Variable_name | Value |
+----------------------+--------+
| mysql-server_version | 5.7.26 |
+----------------------+--------+
Si vous essayez à nouveau de vous connecter à MySQL en exécutant la commande "mysql", vous devriez maintenant obtenir "Server version :5.7.26 (ProxySQL)" dans le terminal.
Nous pouvons maintenant mettre à jour le mot de passe root MySQL sous WHM -> SQL Services -> Gérer les profils MySQL . Modifiez le profil localhost en modifiant le champ Mot de passe en bas avec le mot de passe root MySQL de notre cluster de réplication. Cliquez sur le bouton Enregistrer une fois terminé. Nous pouvons ensuite cliquer sur "Valider" pour vérifier si WHM peut accéder correctement à notre cluster de réplication MySQL via le service ProxySQL. Vous devriez obtenir le grille-pain vert suivant dans le coin supérieur droit :
Si vous recevez la notification du grille-pain vert, nous pouvons procéder à l'intégration de ProxySQL via le hook cPanel.
Intégration ProxySQL via cPanel Hook
ProxySQL, en tant qu'intermédiaire entre WHM et la réplication MySQL, doit avoir un nom d'utilisateur et un mot de passe pour chaque utilisateur MySQL qui le traversera. Avec l'architecture actuelle, si l'on crée un utilisateur via le panneau de contrôle (WHM via la création de compte ou cPanel via l'assistant MySQL Database), WHM créera automatiquement l'utilisateur directement dans notre cluster de réplication MySQL en utilisant [email protected] (qui a été importé dans ProxySQL au préalable). Cependant, le même utilisateur de base de données ne serait pas automatiquement ajouté dans la table ProxySQL mysql_users.
Du point de vue de l'utilisateur final, cela ne fonctionnerait pas car toutes les connexions localhost à ce stade doivent être transmises via ProxySQL. Nous avons besoin d'un moyen d'intégrer cPanel à ProxySQL, de sorte que pour toute opération liée à l'utilisateur MySQL effectuée par WHM et cPanel, ProxySQL doit être notifié et effectuer les actions nécessaires pour ajouter/supprimer/mettre à jour sa table interne mysql_users.
La meilleure façon d'automatiser et d'intégrer ces composants consiste à utiliser le système de hook standardisé cPanel. Des crochets standardisés déclenchent des applications lorsque cPanel &WHM effectuent une action. Utilisez ce système pour exécuter un code personnalisé (code d'action de crochet) afin de personnaliser le fonctionnement de cPanel et WHM dans des scénarios spécifiques (événements pouvant être accrochés).
Tout d'abord, créez un fichier de module Perl appelé ProxysqlHook.pm sous le répertoire /usr/local/cpanel :
$ touch /usr/local/cpanel/ProxysqlHook.pm
Ensuite, copiez et collez les lignes à partir d'ici. Pour plus d'informations, consultez le référentiel Github sur ProxySQL cPanel Hook.
Configurez l'interface d'administration ProxySQL de la ligne 16 à 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';
Maintenant que le crochet est en place, nous devons l'enregistrer avec le système de crochet 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
À partir de la sortie ci-dessus, ce module se connecte à un certain nombre d'événements cPanel et WHM :
- Whostmgr::Accounts::Create - WHM -> Fonctions du compte -> Créer un nouveau compte
- Whostmgr::Accounts::Remove - WHM -> Fonctions du compte -> Résilier un compte
- Cpanel::UAPI::Mysql::create_user - cPanel -> Bases de données -> Bases de données MySQL -> Ajouter un nouvel utilisateur
- Cpanel::Api2::MySQLFE::createdbuser - cPanel -> Bases de données -> Bases de données MySQL -> Ajouter un nouvel utilisateur (nécessite l'intégration de Softaculous).
- Cpanel::UAPI::Mysql::delete_user - cPanel -> Bases de données -> Bases de données MySQL -> Supprimer l'utilisateur
- Cpanel::Api2::MySQLFE::deletedbuser - cPanel -> Bases de données -> Bases de données MySQL -> Ajouter un nouvel utilisateur (nécessite l'intégration de Softaculous).
- Cpanel::UAPI::Mysql::set_privileges_on_database - cPanel -> Bases de données -> Bases de données MySQL -> Ajouter un utilisateur à la base de données
- Cpanel::Api2::MySQLFE::setdbuserprivileges - cPanel -> Bases de données -> Bases de données MySQL -> Ajouter un utilisateur à la base de données (nécessite l'intégration de Softaculous).
- Cpanel::UAPI::Mysql::rename_user - cPanel -> Bases de données -> Bases de données MySQL -> Renommer l'utilisateur
- Cpanel::UAPI::Mysql::set_password - cPanel -> Bases de données -> Bases de données MySQL -> Modifier le mot de passe
Si l'événement ci-dessus est déclenché, le module exécutera les actions nécessaires pour synchroniser la table mysql_users dans ProxySQL. Il effectue les opérations via l'interface d'administration ProxySQL exécutée sur le port 6032 sur le serveur WHM. Ainsi, il est essentiel de spécifier les informations d'identification correctes pour l'utilisateur administrateur ProxySQL afin de s'assurer que tous les utilisateurs seront correctement synchronisés avec ProxySQL.
Notez que ce module, ProxysqlHook.pm n'a jamais été testé dans l'environnement d'hébergement réel (avec de nombreux comptes et de nombreux plugins tiers) et ne couvre évidemment pas tous les événements liés à MySQL dans cPanel. Nous l'avons testé avec l'édition gratuite de Softaculous et cela a beaucoup fonctionné via les hooks cPanel API2. Certaines modifications supplémentaires pourraient être nécessaires pour adopter une automatisation complète.
C'est tout pour le moment. Dans la partie suivante, nous examinerons les opérations post-déploiement et ce que nous pourrions gagner avec notre solution de serveur MySQL hautement disponible pour nos serveurs d'hébergement par rapport à une configuration MySQL autonome standard.