MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

MySQL-Replikation mit ProxySQL auf WHM/cPanel-Servern:Teil Eins

WHM und cPanel sind zweifellos das beliebteste Hosting-Control-Panel für Linux-basierte Umgebungen. Es unterstützt eine Reihe von Datenbank-Backends – MySQL, MariaDB und PostgreSQL als Anwendungsdatenspeicher. WHM unterstützt nur eigenständige Datenbank-Setups und Sie können es entweder lokal (Standardkonfiguration) oder remote bereitstellen, indem Sie es in einen externen Datenbankserver integrieren. Letzteres wäre besser, wenn Sie eine bessere Lastverteilung wünschen, da WHM/cPanel eine Reihe von Prozessen und Anwendungen wie HTTP(S), FTP, DNS, MySQL und dergleichen handhabt.

In diesem Blogbeitrag zeigen wir Ihnen, wie Sie ein externes MySQL-Replikations-Setup nahtlos in WHM integrieren, um die Datenbankverfügbarkeit zu verbessern und den WHM/cPanel-Hosting-Server zu entlasten. Hosting-Anbieter, die MySQL lokal auf dem WHM-Server ausführen, wissen, wie anspruchsvoll MySQL in Bezug auf die Ressourcennutzung ist (abhängig von der Anzahl der gehosteten Konten und den Serverspezifikationen).

MySQL-Replikation auf WHM/cPanel

Standardmäßig unterstützt WHM nativ sowohl MariaDB als auch MySQL als eigenständiges Setup. Sie können einen externen MySQL-Server an WHM anhängen, dieser fungiert jedoch als eigenständiger Host. Außerdem müssen die cPanel-Benutzer die IP-Adresse des MySQL-Servers kennen und den externen Host manuell in ihrer Webanwendung angeben, wenn diese Funktion aktiviert ist.

In diesem Blogbeitrag verwenden wir die ProxySQL-UNIX-Socket-Datei, um WHM/cPanel dazu zu bringen, sich über die UNIX-Socket-Datei mit dem externen MySQL-Server zu verbinden. Auf diese Weise erhalten Sie das Gefühl, MySQL lokal auszuführen, sodass Benutzer "localhost" mit Port 3306 als ihren MySQL-Datenbankhost verwenden können.

Das folgende Diagramm veranschaulicht die endgültige Architektur:

Wir haben einen neuen WHM-Server, installiert mit WHM/cPanel 80.0 (Build 18). Dann haben wir drei weitere Server – einen für ClusterControl und zwei für die Master-Slave-Replikation. ProxySQL wird auf dem WHM-Server selbst installiert.

Bereitstellen der MySQL-Replikation

Zum Zeitpunkt der Erstellung dieses Artikels verwenden wir WHM 80.0 (Build 18), das nur bis zu MySQL 5.7 und MariaDB 10.3 unterstützt. In diesem Fall verwenden wir MySQL 5.7 von Oracle. Wir gehen davon aus, dass Sie ClusterControl bereits auf dem ClusterControl-Server installiert haben.

Richten Sie zunächst passwortloses SSH vom ClusterControl-Server zu den MySQL-Replikationsservern ein. Gehen Sie auf dem ClusterControl-Server wie folgt vor:

$ ssh-copy-id 192.168.0.31
$ ssh-copy-id 192.168.0.32

Stellen Sie sicher, dass Sie den folgenden Befehl auf ClusterControl ohne Passwortabfrage zwischendurch ausführen können:

$ ssh 192.168.0.31 "sudo ls -al /root"
$ ssh 192.168.0.32 "sudo ls -al /root"

Gehen Sie dann zu ClusterControl -> Deploy -> MySQL Replication und geben Sie die erforderlichen Informationen ein. Wählen Sie im zweiten Schritt Oracle als Anbieter und 5.7 als Datenbankversion aus:

Geben Sie dann die IP-Adresse von Master und Slave an:

Achten Sie auf das grüne Häkchen direkt vor der IP-Adresse. Dies bedeutet, dass ClusterControl sich mit dem Server verbinden kann und für den nächsten Schritt bereit ist. Klicken Sie auf Bereitstellen, um die Bereitstellung zu starten. Der Bereitstellungsprozess sollte 15 bis 20 Minuten dauern.

Bereitstellen von ProxySQL auf WHM/cPanel

Da wir möchten, dass ProxySQL den standardmäßigen MySQL-Port 3306 übernimmt, müssen wir zunächst den vorhandenen MySQL-Server ändern, der von WHM installiert wurde, um auf andere Ports und andere Socket-Dateien zu hören. Ändern Sie in /etc/my.cnf die folgenden Zeilen (fügen Sie sie hinzu, wenn sie nicht vorhanden sind):

socket=/var/lib/mysql/mysql2.sock
port=3307
bind-address=127.0.0.1

Starten Sie dann den MySQL-Server auf dem cPanel-Server neu:

$ systemctl restart mysqld

An diesem Punkt sollte der lokale MySQL-Server auf Port 3307 lauschen und nur an localhost binden (wir schließen ihn für den externen Zugriff, um sicherer zu sein). Jetzt können wir mit der Bereitstellung von ProxySQL auf dem WHM-Host 192.168.0.16 über ClusterControl fortfahren.

Richten Sie zunächst passwortloses SSH vom ClusterControl-Knoten zum WHM-Server ein, auf dem wir ProxySQL installieren möchten:

(clustercontrol)$ ssh-copy-id [email protected]

Stellen Sie sicher, dass Sie den folgenden Befehl auf ClusterControl ohne Passwortabfrage zwischendurch ausführen können:

(clustercontrol)$ ssh 192.168.0.16 "sudo ls -al /root"

Gehen Sie dann zu ClusterControl -> Manage -> Load Balancers -> ProxySQL -> ProxySQL bereitstellen und geben Sie die erforderlichen Informationen an:

Füllen Sie alle erforderlichen Details aus, wie durch die Pfeile oben im Diagramm hervorgehoben. Die Serveradresse ist der WHM-Server, 192.168.0.16. Der Listening-Port ist 3306 auf dem WHM-Server und übernimmt das lokale MySQL, das bereits auf Port 3307 läuft. Weiter unten geben wir das Passwort des ProxySQL-Administrators und der Überwachungsbenutzer an. Nehmen Sie dann beide MySQL-Server in das Load-Balancing-Set auf und wählen Sie dann „No“ im Abschnitt „Implicit Transactions“. Klicken Sie auf ProxySQL bereitstellen, um die Bereitstellung zu starten.

Unser ProxySQL ist jetzt installiert und mit zwei Hostgruppen für die MySQL-Replikation konfiguriert. Eine für die Writer-Gruppe (Hostgruppe 10), wo alle Verbindungen an den Master weitergeleitet werden, und die Reader-Gruppe (Hostgruppe 20) für alle Nur-Lese-Workloads, die auf beide MySQL-Server verteilt werden.

Der nächste Schritt besteht darin, MySQL den Root-Benutzer zu gewähren und ihn in ProxySQL zu importieren. Gelegentlich stellt WHM über eine TCP-Verbindung eine Verbindung zur Datenbank her, wobei die UNIX-Socket-Datei umgangen wird. In diesem Fall müssen wir MySQL-Root-Zugriff sowohl von [email protected] als auch von [email protected] (der IP-Adresse des WHM-Servers) in unserem Replikationscluster erlauben.

Daher ist es notwendig, die folgende Anweisung auf dem Master-Server (192.168.0.31) auszuführen:

(master)$ mysql -uroot -p
mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.16' IDENTIFIED BY '[email protected]' WITH GRANT OPTION;

Importieren Sie dann den Benutzer „root“@„localhost“ von unserem MySQL-Server in den ProxySQL-Benutzer, indem Sie zu ClusterControl -> Knoten -> ProxySQL-Knoten auswählen -> Benutzer -> Benutzer importieren gehen . Sie erhalten den folgenden Dialog:

Aktivieren Sie das Kontrollkästchen [email protected] und klicken Sie auf Weiter. In den Benutzereinstellungen Seite, wählen Sie Hostgruppe 10 als Standard-Hostgruppe für den Benutzer:

Wir können dann überprüfen, ob ProxySQL auf dem WHM/cPanel-Server korrekt ausgeführt wird, indem wir den folgenden Befehl verwenden:

$ 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

Port 3306 sollte von ProxySQL überwacht werden, um alle MySQL-Verbindungen zu akzeptieren. Port 6032 ist der ProxySQL-Admin-Port, zu dem wir eine Verbindung herstellen, um ProxySQL-Komponenten wie Benutzer, Hostgruppen, Server und Variablen zu konfigurieren und zu überwachen.

Gehen Sie an dieser Stelle zu ClusterControl -> Topology , sollten Sie die folgende Topologie sehen:

MySQL-UNIX-Socket konfigurieren

Wenn Sie in einer Linux-Umgebung den MySQL-Host als „localhost“ definieren, versucht der Client/die Anwendung, eine Verbindung über die UNIX-Socket-Datei herzustellen, die sich standardmäßig unter /var/lib/mysql/mysql.sock auf dem cPanel-Server befindet. Die Verwendung der Socket-Datei ist die am meisten empfohlene Methode für den Zugriff auf den MySQL-Server, da sie im Vergleich zu TCP-Verbindungen weniger Overhead verursacht. Eine Socket-Datei enthält eigentlich keine Daten, sie transportiert sie. Es ist wie eine lokale Pipe, die der Server und die Clients auf demselben Rechner verwenden können, um sich zu verbinden und Anforderungen und Daten auszutauschen.

Wenn sich Ihre Anwendung jedoch über "localhost" und Port 3306 als Datenbankhost und -port verbindet, wird sie über die Socket-Datei verbunden. Wenn Sie "127.0.0.1" und Port 3306 verwenden, verbindet sich die Anwendung höchstwahrscheinlich über TCP mit der Datenbank. Dieses Verhalten wird in der MySQL-Dokumentation gut erklärt. In einfachen Worten, verwenden Sie die Socket-Datei (oder "localhost") für die lokale Kommunikation und verwenden Sie TCP, wenn die Anwendung eine Remoteverbindung herstellt.

In cPanel wird die MySQL-Socket-Datei vom cpservd-Prozess überwacht und würde mit einer anderen Socket-Datei verknüpft, wenn wir einen anderen Pfad als den Standardpfad konfigurieren würden. Angenommen, wir haben eine nicht standardmäßige MySQL-Socket-Datei wie im vorherigen Abschnitt konfiguriert:

$ cat /etc/my.cnf | grep socket
socket=/var/lib/mysql/mysql2.sock

cPanel über den cpservd-Prozess würde dies korrigieren, indem ein Symlink zum Standard-Socket-Pfad erstellt wird:

(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

Um zu vermeiden, dass cpservd dies automatisch erneut korrigiert (cPanel hat einen Begriff für dieses Verhalten namens „automagically“), müssen wir die MySQL-Überwachung deaktivieren, indem wir zu WHM -> Service Manager gehen (wir werden sowieso nicht das lokale MySQL verwenden) und deaktivieren Sie das Kontrollkästchen „Überwachen“ für MySQL, wie im folgenden Screenshot gezeigt:

Speichern Sie die Änderungen in WHM. Es ist jetzt sicher, die Standard-Socket-Datei zu entfernen und mit dem folgenden Befehl einen symbolischen Link zur ProxySQL-Socket-Datei zu erstellen:

(whm)$ ln -s /tmp/proxysql.sock /var/lib/mysql/mysql.sock

Stellen Sie sicher, dass die Socket-MySQL-Socket-Datei jetzt zur ProxySQL-Socket-Datei umgeleitet wird:

(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

Wir müssen auch die Standard-Anmeldeinformationen in /root/.my.cnf wie folgt ändern:

(whm)$ cat ~/.my.cnf
[client]
#password="T<y4ar&cgjIu"
user=root
password='[email protected]'
socket=/var/lib/mysql/mysql.sock

Eine kleine Erklärung - Die erste Zeile, die wir auskommentiert haben, ist das MySQL-Root-Passwort, das von cPanel für den lokalen MySQL-Server generiert wurde. Wir werden das nicht verwenden, daher steht das '#' am Anfang der Zeile. Dann haben wir das MySQL-Root-Passwort für unser MySQL-Replikations-Setup und den UNIX-Socket-Pfad hinzugefügt, der jetzt ein symbolischer Link zur ProxySQL-Socket-Datei ist.

An diesem Punkt sollten Sie auf dem WHM-Server als Root-Benutzer auf unseren MySQL-Replikationscluster zugreifen können, indem Sie einfach „mysql“ eingeben, zum Beispiel:

(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>

Beachten Sie, dass die Serverversion 5.5.30 (ProxySQL) ist. Wenn Sie sich wie oben verbinden können, können wir den Integrationsteil wie im nächsten Abschnitt beschrieben konfigurieren.

WHM/cPanel-Integration

WHM unterstützt eine Reihe von Datenbankservern, nämlich MySQL 5.7, MariaDB 10.2 und MariaDB 10.3. Da WHM jetzt nur ProxySQL sieht und es als Version 5.5.30 erkannt wird (wie oben angegeben), wird WHM sich über eine nicht unterstützte MySQL-Version beschweren. Sie können zu WHM -> SQL-Dienste -> MySQL-Profile verwalten gehen und klicken Sie auf die Schaltfläche Validieren. Sie sollten eine rote Toaster-Benachrichtigung in der oberen rechten Ecke erhalten, die über diesen Fehler informiert.

Daher müssen wir die MySQL-Version in ProxySQL auf die gleiche Version wie unser MySQL-Replikationscluster ändern. Sie können diese Informationen abrufen, indem Sie die folgende Anweisung auf dem Masterserver ausführen:

mysql> SELECT @@version;
+------------+
| @@version  |
+------------+
| 5.7.26-log |
+------------+

Melden Sie sich dann bei der ProxySQL-Verwaltungskonsole an, um die mysql-server_version zu ändern Variable:

(whm)$ mysql -uproxysql-admin -p -h192.168.0.16 -P6032

Verwenden Sie die SET-Anweisung wie folgt:

mysql> SET mysql-server_version = '5.7.26';

Laden Sie dann die Variable in die Laufzeit und speichern Sie sie auf der Festplatte, um sie dauerhaft zu machen:

mysql> LOAD MYSQL VARIABLES TO RUNTIME;
mysql> SAVE MYSQL VARIABLES TO DISK;

Überprüfen Sie schließlich die Version, die ProxySQL darstellt:

mysql> SHOW VARIABLES LIKE 'mysql-server_version';
+----------------------+--------+
| Variable_name        | Value  |
+----------------------+--------+
| mysql-server_version | 5.7.26 |
+----------------------+--------+

Wenn Sie erneut versuchen, eine Verbindung zu MySQL herzustellen, indem Sie den Befehl „mysql“ ausführen, sollten Sie jetzt „Server version:5.7.26 (ProxySQL)“ im Terminal erhalten.

Jetzt können wir das MySQL-Root-Passwort unter WHM -> SQL Services -> Manage MySQL Profiles aktualisieren . Bearbeiten Sie das localhost-Profil, indem Sie das Passwortfeld unten mit dem MySQL-Root-Passwort unseres Replikationsclusters ändern. Klicken Sie anschließend auf die Schaltfläche Speichern. Wir können dann auf „Validate“ klicken, um zu überprüfen, ob WHM über den ProxySQL-Dienst korrekt auf unseren MySQL-Replikationscluster zugreifen kann. Sie sollten den folgenden grünen Toaster in der oberen rechten Ecke sehen:

Wenn Sie die grüne Toaster-Benachrichtigung erhalten, können wir mit der Integration von ProxySQL über den cPanel-Hook fortfahren.

ProxySQL-Integration über cPanel-Hook

ProxySQL als Mittelsmann zwischen WHM und MySQL-Replikation benötigt einen Benutzernamen und ein Passwort für jeden MySQL-Benutzer, der es durchläuft. Wenn bei der aktuellen Architektur ein Benutzer über das Control Panel erstellt wird (WHM über die Kontoerstellung oder cPanel über den MySQL-Datenbankassistenten), erstellt WHM den Benutzer automatisch direkt in unserem MySQL-Replikationscluster unter Verwendung von [email protected] (das importiert wurde vorher in ProxySQL). Derselbe Datenbankbenutzer würde jedoch nicht automatisch zur ProxySQL-Tabelle mysql_users hinzugefügt.

Aus Sicht des Endbenutzers würde dies nicht funktionieren, da alle localhost-Verbindungen zu diesem Zeitpunkt über ProxySQL geleitet werden sollten. Wir brauchen eine Möglichkeit, cPanel mit ProxySQL zu integrieren, wobei ProxySQL für alle MySQL-benutzerbezogenen Operationen, die von WHM und cPanel ausgeführt werden, benachrichtigt werden muss und die erforderlichen Aktionen zum Hinzufügen/Entfernen/Aktualisieren seiner internen mysql_users-Tabelle ausführen muss.

Der beste Weg, diese Komponenten zu automatisieren und zu integrieren, ist die Verwendung des standardisierten cPanel-Hakensystems. Standardisierte Hooks lösen Anwendungen aus, wenn cPanel &WHM eine Aktion ausführen. Verwenden Sie dieses System, um benutzerdefinierten Code (Hook-Aktionscode) auszuführen, um die Funktionsweise von cPanel und WHM in bestimmten Szenarien (Hook-Ereignisse) anzupassen.

Erstellen Sie zunächst eine Perl-Moduldatei namens ProxysqlHook.pm im Verzeichnis /usr/local/cpanel:

$ touch /usr/local/cpanel/ProxysqlHook.pm

Kopieren Sie dann die Zeilen von hier und fügen Sie sie ein. Weitere Informationen finden Sie im Github-Repository unter ProxySQL cPanel Hook.

Konfigurieren Sie die ProxySQL-Verwaltungsschnittstelle von Zeile 16 bis 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';

Nachdem der Hook nun vorhanden ist, müssen wir ihn beim cPanel-Hook-System registrieren:

(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

Aus der obigen Ausgabe geht hervor, dass sich dieses Modul in eine Reihe von cPanel- und WHM-Ereignissen einklinkt:

  • Whostmgr::Accounts::Create - WHM -> Kontofunktionen -> Neues Konto erstellen
  • Whostmgr::Accounts::Remove - WHM -> Kontofunktionen -> Konto kündigen
  • Cpanel::UAPI::Mysql::create_user - cPanel -> Datenbanken -> MySQL-Datenbanken -> Neuen Benutzer hinzufügen 
  • Cpanel::Api2::MySQLFE::createdbuser - cPanel -> Datenbanken -> MySQL-Datenbanken -> Neuen Benutzer hinzufügen (erfordert Softaculous-Integration).
  • Cpanel::UAPI::Mysql::delete_user - cPanel -> Datenbanken -> MySQL-Datenbanken -> Benutzer löschen
  • Cpanel::Api2::MySQLFE::deletedbuser - cPanel -> Datenbanken -> MySQL-Datenbanken -> Neuen Benutzer hinzufügen (erfordert Softaculous-Integration).
  • Cpanel::UAPI::Mysql::set_privileges_on_database - cPanel -> Datenbanken -> MySQL-Datenbanken -> Benutzer zur Datenbank hinzufügen
  • Cpanel::Api2::MySQLFE::setdbuserprivileges - cPanel -> Datenbanken -> MySQL-Datenbanken -> Benutzer zur Datenbank hinzufügen (erfordert Softaculous-Integration).
  • Cpanel::UAPI::Mysql::rename_user - cPanel -> Datenbanken -> MySQL-Datenbanken -> Benutzer umbenennen
  • Cpanel::UAPI::Mysql::set_password - cPanel -> Datenbanken -> MySQL-Datenbanken -> Passwort ändern

Wenn das obige Ereignis ausgelöst wird, führt das Modul die erforderlichen Aktionen aus, um die mysql_users-Tabelle in ProxySQL zu synchronisieren. Es führt die Operationen über die ProxySQL-Verwaltungsschnittstelle aus, die auf Port 6032 auf dem WHM-Server ausgeführt wird. Daher ist es wichtig, die richtigen Benutzeranmeldeinformationen für den ProxySQL-Administratorbenutzer anzugeben, um sicherzustellen, dass alle Benutzer korrekt mit ProxySQL synchronisiert werden.

Beachten Sie, dass dieses Modul, ProxysqlHook.pm, noch nie in der realen Hosting-Umgebung (mit vielen Konten und vielen Plugins von Drittanbietern) getestet wurde und offensichtlich nicht alle MySQL-bezogenen Ereignisse in cPanel abdeckt. Wir haben es mit der kostenlosen Softaculous-Edition getestet und es funktionierte hervorragend über cPanel API2-Hooks. Möglicherweise sind weitere Änderungen erforderlich, um die vollständige Automatisierung zu ermöglichen.

Das war es fürs Erste. Im nächsten Teil werden wir uns mit den Vorgängen nach der Bereitstellung befassen und sehen, was wir mit unserer hochverfügbaren MySQL-Serverlösung für unsere Hosting-Server im Vergleich zu einem eigenständigen Standard-MySQL-Setup gewinnen könnten.