WHM en cPanel zijn zonder twijfel het meest populaire hostingcontrolepaneel voor op Linux gebaseerde omgevingen. Het ondersteunt een aantal database-backends - MySQL, MariaDB en PostgreSQL als de applicatiedatastore. WHM ondersteunt alleen stand-alone database-instellingen en u kunt het lokaal (standaardconfiguratie) of op afstand laten implementeren door te integreren met een externe databaseserver. Dat laatste zou beter zijn als je een betere verdeling van de belasting wilt hebben, aangezien WHM/cPanel een aantal processen en applicaties afhandelt zoals HTTP(S), FTP, DNS, MySQL en dergelijke.
In deze blogpost laten we je zien hoe je een externe MySQL-replicatie-setup naadloos in WHM integreert, om de databasebeschikbaarheid te verbeteren en de WHM/cPanel-hostingserver te ontlasten. Hostingproviders die MySQL lokaal op de WHM-server uitvoeren, weten hoe veeleisend MySQL is in termen van het gebruik van bronnen (afhankelijk van het aantal accounts dat het host en de serverspecificaties).
MySQL-replicatie op WHM/cPanel
Standaard ondersteunt WHM zowel MariaDB als MySQL als een zelfstandige installatie. U kunt een externe MySQL-server aansluiten op WHM, maar deze zal als een zelfstandige host fungeren. Bovendien moeten de cPanel-gebruikers het IP-adres van de MySQL-server weten en handmatig de externe host specificeren in hun webtoepassing als deze functie is ingeschakeld.
In deze blogpost gaan we ProxySQL UNIX-socketbestand gebruiken om WHM/cPanel te misleiden bij het verbinden met de externe MySQL-server via UNIX-socketbestand. Op deze manier krijgt u het gevoel dat u MySQL lokaal draait, zodat gebruikers "localhost" met poort 3306 als hun MySQL-databasehost kunnen gebruiken.
Het volgende diagram illustreert de uiteindelijke architectuur:
We hebben een nieuwe WHM-server, geïnstalleerd met WHM/cPanel 80.0 (build 18). Dan hebben we nog drie servers - één voor ClusterControl en twee voor master-slave-replicatie. ProxySQL wordt op de WHM-server zelf geïnstalleerd.
MySQL-replicatie implementeren
Op het moment van schrijven gebruiken we WHM 80.0 (build 18) dat slechts tot MySQL 5.7 en MariaDB 10.3 ondersteunt. In dit geval gaan we MySQL 5.7 van Oracle gebruiken. We gaan ervan uit dat u ClusterControl al op de ClusterControl-server hebt geïnstalleerd.
Stel eerst wachtwoordloze SSH in van de ClusterControl-server naar MySQL-replicatieservers. Doe op de ClusterControl-server:
$ ssh-copy-id 192.168.0.31
$ ssh-copy-id 192.168.0.32
Zorg ervoor dat u de volgende opdracht op ClusterControl kunt uitvoeren zonder dat er tussendoor om een wachtwoord wordt gevraagd:
$ ssh 192.168.0.31 "sudo ls -al /root"
$ ssh 192.168.0.32 "sudo ls -al /root"
Ga dan naar ClusterControl -> Deploy -> MySQL-replicatie en voer de vereiste informatie in. Kies in de tweede stap Oracle als leverancier en 5.7 als databaseversie:
Geef vervolgens het IP-adres van de master en slave op:
Let op het groene vinkje vlak voor het IP-adres. Het betekent dat ClusterControl verbinding kan maken met de server en klaar is voor de volgende stap. Klik op Implementeren om de implementatie te starten. Het implementatieproces duurt 15 tot 20 minuten.
ProxySQL implementeren op WHM/cPanel
Omdat we willen dat ProxySQL de standaard MySQL-poort 3306 overneemt, moeten we eerst de bestaande MySQL-server die door WHM is geïnstalleerd aanpassen om naar andere poorten en andere socketbestanden te luisteren. Pas in /etc/my.cnf de volgende regels aan (voeg ze toe als ze niet bestaan):
socket=/var/lib/mysql/mysql2.sock
port=3307
bind-address=127.0.0.1
Start vervolgens de MySQL-server opnieuw op de cPanel-server:
$ systemctl restart mysqld
Op dit moment zou de lokale MySQL-server moeten luisteren op poort 3307, alleen binden aan localhost (we sluiten het af van externe toegang om veiliger te zijn). Nu kunnen we ProxySQL implementeren op de WHM-host, 192.168.0.16 via ClusterControl.
Stel eerst SSH zonder wachtwoord in vanaf het ClusterControl-knooppunt naar de WHM-server die we ProxySQL willen installeren:
(clustercontrol)$ ssh-copy-id [email protected]
Zorg ervoor dat u de volgende opdracht op ClusterControl kunt uitvoeren zonder dat er tussendoor om een wachtwoord wordt gevraagd:
(clustercontrol)$ ssh 192.168.0.16 "sudo ls -al /root"
Ga vervolgens naar ClusterControl -> Beheren -> Load Balancers -> ProxySQL -> ProxySQL implementeren en specificeer de vereiste informatie:
Vul alle benodigde details in zoals aangegeven door de pijlen hierboven in het diagram. Het serveradres is de WHM-server, 192.168.0.16. De luisterpoort is 3306 op de WHM-server, die de lokale MySQL overneemt die al op poort 3307 draait. Verderop specificeren we het ProxySQL-admin en het wachtwoord van de bewakingsgebruikers. Voeg vervolgens beide MySQL-servers toe aan de taakverdelingsset en kies vervolgens "Nee" in het gedeelte Impliciete transacties. Klik op ProxySQL implementeren om de implementatie te starten.
Onze ProxySQL is nu geïnstalleerd en geconfigureerd met twee hostgroepen voor MySQL-replicatie. Een voor de schrijversgroep (hostgroep 10), waar alle verbindingen worden doorgestuurd naar de master en de lezersgroep (hostgroep 20) voor alle alleen-lezen workloads die worden gebalanceerd naar beide MySQL-servers.
De volgende stap is om MySQL root gebruiker toe te kennen en te importeren in ProxySQL. Af en toe maakt WHM op de een of andere manier verbinding met de database via een TCP-verbinding, waarbij het UNIX-socketbestand wordt omzeild. In dit geval moeten we MySQL-roottoegang toestaan van zowel [email protected] als [email protected] (het IP-adres van de WHM-server) in ons replicatiecluster.
Het uitvoeren van de volgende instructie op de hoofdserver (192.168.0.31) is dus noodzakelijk:
(master)$ mysql -uroot -p
mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.16' IDENTIFIED BY '[email protected]' WITH GRANT OPTION;
Importeer vervolgens de 'root'@'localhost'-gebruiker van onze MySQL-server in ProxySQL-gebruiker door naar ClusterControl -> Nodes -> kies het ProxySQL-knooppunt -> Gebruikers -> Gebruikers importeren . U krijgt het volgende dialoogvenster te zien:
Vink het selectievakje [email protected] aan en klik op Volgende. In de Gebruikersinstellingen pagina, kies hostgroep 10 als de standaard hostgroep voor de gebruiker:
We kunnen dan controleren of ProxySQL correct draait op de WHM/cPanel-server door het volgende commando te gebruiken:
$ 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
Poort 3306 is wat ProxySQL zou moeten luisteren om alle MySQL-verbindingen te accepteren. Poort 6032 is de ProxySQL-beheerpoort, waar we verbinding mee maken om ProxySQL-componenten zoals gebruikers, hostgroepen, servers en variabelen te configureren en te bewaken.
Als u nu naar ClusterControl -> Topologie . gaat , zou u de volgende topologie moeten zien:
MySQL UNIX-socket configureren
Als u in een Linux-omgeving MySQL-host definieert als "localhost", zal de client/toepassing proberen verbinding te maken via het UNIX-socketbestand, dat zich standaard op /var/lib/mysql/mysql.sock op de cPanel-server bevindt. Het gebruik van het socketbestand is de meest aanbevolen manier om toegang te krijgen tot de MySQL-server, omdat het minder overhead heeft in vergelijking met TCP-verbindingen. Een socketbestand bevat eigenlijk geen gegevens, het transporteert het. Het is als een lokale pijp die de server en de clients op dezelfde machine kunnen gebruiken om verbinding te maken en verzoeken en gegevens uit te wisselen.
Dat gezegd hebbende, als uw toepassing verbinding maakt via "localhost" en poort 3306 als de databasehost en poort, zal deze verbinding maken via een socketbestand. Als u "127.0.0.1" en poort 3306 gebruikt, zal de toepassing hoogstwaarschijnlijk via TCP verbinding maken met de database. Dit gedrag wordt goed uitgelegd in de MySQL-documentatie. In eenvoudige bewoordingen, gebruik socket-bestand (of "localhost") voor lokale communicatie en gebruik TCP als de toepassing op afstand verbinding maakt.
In cPanel wordt het MySQL-socketbestand gecontroleerd door het cpserd-proces en zou het worden gekoppeld aan een ander socketbestand als we een ander pad dan het standaardpad zouden configureren. Stel dat we bijvoorbeeld een niet-standaard MySQL-socketbestand hebben geconfigureerd zoals we in de vorige sectie hebben geconfigureerd:
$ cat /etc/my.cnf | grep socket
socket=/var/lib/mysql/mysql2.sock
cPanel via het cpservd-proces zou dit corrigeren door een symbolische link naar het standaard socketpad te maken:
(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
Om te voorkomen dat cpservd dit automatisch opnieuw corrigeert (cPanel heeft een term voor dit gedrag genaamd "automagically"), moeten we MySQL-bewaking uitschakelen door naar WHM -> Service Manager te gaan (we gaan sowieso niet de lokale MySQL gebruiken) en schakel het selectievakje "Monitor" uit voor MySQL, zoals weergegeven in de onderstaande schermafbeelding:
Sla de wijzigingen op in WHM. Het is nu veilig om het standaard socketbestand te verwijderen en een symbolische koppeling naar het ProxySQL-socketbestand te maken met de volgende opdracht:
(whm)$ ln -s /tmp/proxysql.sock /var/lib/mysql/mysql.sock
Controleer of het socket MySQL-socketbestand nu wordt omgeleid naar het ProxySQL-socketbestand:
(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
We moeten ook de standaard inloggegevens in /root/.my.cnf als volgt wijzigen:
(whm)$ cat ~/.my.cnf
[client]
#password="T<y4ar&cgjIu"
user=root
password='[email protected]'
socket=/var/lib/mysql/mysql.sock
Een beetje uitleg - De eerste regel die we hebben opgemerkt, is het MySQL-rootwachtwoord dat door cPanel is gegenereerd voor de lokale MySQL-server. Dat gaan we niet gebruiken, daarom staat de '#' aan het begin van de regel. Vervolgens hebben we het MySQL-rootwachtwoord toegevoegd voor onze MySQL-replicatie-installatie en het UNIX-socketpad, dat nu een symbolische koppeling is naar het ProxySQL-socketbestand.
Op dit punt zou u op de WHM-server toegang moeten hebben tot ons MySQL-replicatiecluster als rootgebruiker door simpelweg "mysql" te typen, bijvoorbeeld:
(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>
Merk op dat de serverversie 5.5.30 (ProxySQL) is. Als u verbinding kunt maken zoals hierboven, kunnen we het integratiegedeelte configureren zoals beschreven in de volgende sectie.
WHM/cPanel-integratie
WHM ondersteunt een aantal databaseservers, namelijk MySQL 5.7, MariaDB 10.2 en MariaDB 10.3. Aangezien WHM nu alleen de ProxySQL ziet en wordt gedetecteerd als versie 5.5.30 (zoals hierboven vermeld), zal WHM klagen over een niet-ondersteunde MySQL-versie. U kunt naar WHM -> SQL Services -> MySQL-profielen beheren . gaan en klik op de knop Valideren. Je zou een rode broodroostermelding in de rechterbovenhoek moeten krijgen met informatie over deze fout.
Daarom moeten we de MySQL-versie in ProxySQL wijzigen in dezelfde versie als ons MySQL-replicatiecluster. U kunt deze informatie verkrijgen door de volgende instructie op de hoofdserver uit te voeren:
mysql> SELECT @@version;
+------------+
| @@version |
+------------+
| 5.7.26-log |
+------------+
Log vervolgens in op de ProxySQL-beheerconsole om de mysql-server_version te wijzigen variabele:
(whm)$ mysql -uproxysql-admin -p -h192.168.0.16 -P6032
Gebruik het SET-statement zoals hieronder:
mysql> SET mysql-server_version = '5.7.26';
Laad vervolgens de variabele in runtime en sla deze op schijf op om hem persistent te maken:
mysql> LOAD MYSQL VARIABLES TO RUNTIME;
mysql> SAVE MYSQL VARIABLES TO DISK;
Controleer ten slotte de versie die ProxySQL zal vertegenwoordigen:
mysql> SHOW VARIABLES LIKE 'mysql-server_version';
+----------------------+--------+
| Variable_name | Value |
+----------------------+--------+
| mysql-server_version | 5.7.26 |
+----------------------+--------+
Als u opnieuw probeert verbinding te maken met MySQL door de opdracht "mysql" uit te voeren, zou u nu "Serverversie:5.7.26 (ProxySQL)" in de terminal moeten krijgen.
Nu kunnen we het MySQL-rootwachtwoord bijwerken onder WHM -> SQL Services -> MySQL-profielen beheren . Bewerk het localhost-profiel door het veld Wachtwoord onderaan te wijzigen met het MySQL-rootwachtwoord van ons replicatiecluster. Klik op de knop Opslaan als u klaar bent. We kunnen dan op "Valideren" klikken om te controleren of WHM correct toegang heeft tot ons MySQL-replicatiecluster via ProxySQL-service. U zou de volgende groene broodrooster in de rechterbovenhoek moeten krijgen:
Als u de groene broodroostermelding krijgt, kunnen we doorgaan met het integreren van ProxySQL via cPanel hook.
ProxySQL-integratie via cPanel Hook
ProxySQL als tussenpersoon tussen WHM en MySQL-replicatie moet een gebruikersnaam en wachtwoord hebben voor elke MySQL-gebruiker die er doorheen gaat. Met de huidige architectuur, als men een gebruiker aanmaakt via het configuratiescherm (WHM via het aanmaken van een account of cPanel via de MySQL Database-wizard), zal WHM de gebruiker automatisch rechtstreeks in ons MySQL-replicatiecluster maken met [email protected] (dat is geïmporteerd vooraf in ProxySQL). Dezelfde databasegebruiker wordt echter niet automatisch toegevoegd aan de ProxySQL mysql_users-tabel.
Vanuit het perspectief van de eindgebruiker zou dit niet werken omdat alle localhost-verbindingen op dit punt via ProxySQL moeten worden doorgegeven. We hebben een manier nodig om cPanel te integreren met ProxySQL, waarbij ProxySQL voor alle MySQL-gebruikersgerelateerde bewerkingen die door WHM en cPanel worden uitgevoerd, op de hoogte moet worden gesteld en de nodige acties moet ondernemen om de interne mysql_users-tabel toe te voegen/verwijderen/bijwerken.
De beste manier om deze componenten te automatiseren en te integreren is door gebruik te maken van het cPanel gestandaardiseerde haaksysteem. Gestandaardiseerde hooks activeren toepassingen wanneer cPanel &WHM een actie uitvoeren. Gebruik dit systeem om aangepaste code uit te voeren (hook action code) om aan te passen hoe cPanel &WHM in specifieke scenario's werken (hookable events).
Maak eerst een Perl-modulebestand met de naam ProxysqlHook.pm in de map /usr/local/cpanel:
$ touch /usr/local/cpanel/ProxysqlHook.pm
Kopieer en plak vervolgens de regels vanaf hier. Bekijk voor meer informatie de Github-repository op ProxySQL cPanel Hook.
Configureer de ProxySQL-beheerdersinterface van regel 16 tot 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';
Nu de haak op zijn plaats zit, moeten we deze registreren bij het cPanel haaksysteem:
(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
Uit de bovenstaande uitvoer haakt deze module aan op een aantal cPanel- en WHM-gebeurtenissen:
- Whostmgr::Accounts::Create - WHM -> Accountfuncties -> Maak een nieuw account
- Whostmgr::Accounts::Remove - WHM -> Accountfuncties -> Een account beëindigen
- Cpanel::UAPI::Mysql::create_user - cPanel -> Databases -> MySQL-databases -> Nieuwe gebruiker toevoegen
- Cpanel::Api2::MySQLFE::createdbuser - cPanel -> Databases -> MySQL-databases -> Nieuwe gebruiker toevoegen (vereist voor Softaculous-integratie).
- Cpanel::UAPI::Mysql::delete_user - cPanel -> Databases -> MySQL-databases -> Gebruiker verwijderen
- Cpanel::Api2::MySQLFE::deletedbuser - cPanel -> Databases -> MySQL-databases -> Nieuwe gebruiker toevoegen (vereist voor Softaculous-integratie).
- Cpanel::UAPI::Mysql::set_privileges_on_database - cPanel -> Databases -> MySQL-databases -> Gebruiker toevoegen aan database
- Cpanel::Api2::MySQLFE::setdbuserprivileges - cPanel -> Databases -> MySQL-databases -> Gebruiker aan database toevoegen (vereist voor Softaculous-integratie).
- Cpanel::UAPI::Mysql::rename_user - cPanel -> Databases -> MySQL-databases -> Gebruiker hernoemen
- Cpanel::UAPI::Mysql::set_password - cPanel -> Databases -> MySQL-databases -> Wachtwoord wijzigen
Als de bovenstaande gebeurtenis wordt geactiveerd, voert de module de nodige acties uit om de tabel mysql_users in ProxySQL te synchroniseren. Het voert de bewerkingen uit via de ProxySQL-beheerdersinterface die wordt uitgevoerd op poort 6032 op de WHM-server. Het is dus van vitaal belang om de juiste gebruikersreferenties voor ProxySQL-beheerdersgebruiker op te geven om ervoor te zorgen dat alle gebruikers correct met ProxySQL worden gesynchroniseerd.
Houd er rekening mee dat deze module, ProxysqlHook.pm, nooit is getest in de echte hostingomgeving (met veel accounts en veel plug-ins van derden) en uiteraard niet alle MySQL-gerelateerde gebeurtenissen binnen cPanel dekt. We hebben het getest met de gratis editie van Softaculous en het werkte uitstekend via cPanel API2-haken. Mogelijk zijn er nog wat aanpassingen nodig om volledige automatisering te omarmen.
Dat is het voor nu. In het volgende deel zullen we kijken naar de operaties na de implementatie en wat we zouden kunnen winnen met onze zeer beschikbare MySQL-serveroplossing voor onze hostingservers in vergelijking met de standaard stand-alone MySQL-configuratie.