sql >> Databasteknik >  >> RDS >> MariaDB

MySQL-replikering med ProxySQL på WHM/cPanel-servrar:Del ett

WHM och cPanel är utan tvekan den mest populära värdkontrollpanelen för Linux-baserade miljöer. Den stöder ett antal databasbackends - MySQL, MariaDB och PostgreSQL som applikationsdatalager. WHM stöder endast fristående databasinställningar och du kan antingen få den distribuerad lokalt (standardkonfiguration) eller på distans, genom att integrera med en extern databasserver. Det senare skulle vara bättre om du vill ha bättre lastfördelning, eftersom WHM/cPanel hanterar ett antal processer och applikationer som HTTP(S), FTP, DNS, MySQL och liknande.

I det här blogginlägget kommer vi att visa dig hur du integrerar en extern MySQL-replikeringsinställning i WHM sömlöst, för att förbättra databasens tillgänglighet och avlasta WHM/cPanel-värdservern. Värdleverantörer som kör MySQL lokalt på WHM-servern skulle veta hur krävande MySQL är när det gäller resursutnyttjande (beroende på antalet konton den är värd för och serverspecifikationerna).

MySQL-replikering på WHM/cPanel

Som standard stöder WHM naturligt både MariaDB och MySQL som en fristående installation. Du kan ansluta en extern MySQL-server till WHM, men den kommer att fungera som en fristående värd. Dessutom måste cPanel-användarna känna till IP-adressen för MySQL-servern och manuellt ange den externa värden i sin webbapplikation om den här funktionen är aktiverad.

I det här blogginlägget kommer vi att använda ProxySQL UNIX-socket-fil för att lura WHM/cPanel att ansluta till den externa MySQL-servern via UNIX-socket-fil. På så sätt får du känslan av att köra MySQL lokalt så att användare kan använda "localhost" med port 3306 som MySQL-databasvärd.

Följande diagram illustrerar den slutliga arkitekturen:

Vi har en ny WHM-server, installerad med WHM/cPanel 80.0 (build 18). Sedan har vi ytterligare tre servrar - en för ClusterControl och två för master-slave replikering. ProxySQL kommer att installeras på själva WHM-servern.

Distribuera MySQL-replikering

När detta skrivs använder vi WHM 80.0 (bygg 18) som endast stöder upp till MySQL 5.7 och MariaDB 10.3. I det här fallet kommer vi att använda MySQL 5.7 från Oracle. Vi antar att du redan har installerat ClusterControl på ClusterControl-servern.

Först, ställ in lösenordslös SSH från ClusterControl-server till MySQL-replikeringsservrar. På ClusterControl-servern gör du:

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

Se till att du kan köra följande kommando på ClusterControl utan lösenordsuppmaning däremellan:

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

Gå sedan till ClusterControl -> Deploy -> MySQL-replikering och ange den information som krävs. I det andra steget väljer du Oracle som leverantör och 5.7 som databasversion:

Ange sedan IP-adressen för master och slav:

Var uppmärksam på den gröna bocken precis före IP-adressen. Det betyder att ClusterControl kan ansluta till servern och är redo för nästa steg. Klicka på Distribuera för att starta distributionen. Distributionsprocessen bör ta 15 till 20 minuter.

Distribuera ProxySQL på WHM/cPanel

Eftersom vi vill att ProxySQL ska ta över standard MySQL-port 3306, måste vi först modifiera den befintliga MySQL-servern installerad av WHM för att lyssna på andra portar och andra socketfiler. I /etc/my.cnf, ändra följande rader (lägg till dem om de inte finns):

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

Starta sedan om MySQL-servern på cPanel-servern:

$ systemctl restart mysqld

Vid det här laget bör den lokala MySQL-servern lyssna på port 3307, endast binda till localhost (vi stänger ner den från extern åtkomst för att vara säkrare). Nu kan vi fortsätta att distribuera ProxySQL på WHM-värden, 192.168.0.16 via ClusterControl.

Ställ först in lösenordslös SSH från ClusterControl-noden till WHM-servern som vi vill installera ProxySQL:

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

Se till att du kan köra följande kommando på ClusterControl utan lösenordsuppmaning däremellan:

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

Gå sedan till ClusterControl -> Hantera -> Lastbalanserare -> ProxySQL -> Deploy ProxySQL och ange den information som krävs:

Fyll i alla nödvändiga detaljer som markerats med pilarna ovan i diagrammet. Serveradressen är WHM-servern, 192.168.0.16. Lyssningsporten är 3306 på WHM-servern och tar över den lokala MySQL som redan körs på port 3307. Längre ner anger vi ProxySQL-admin och övervakningsanvändares lösenord. Inkludera sedan båda MySQL-servrarna i lastbalanseringsuppsättningen och välj sedan "Nej" i avsnittet Implicita transaktioner. Klicka på Deploy ProxySQL för att starta distributionen.

Vår ProxySQL är nu installerad och konfigurerad med två värdgrupper för MySQL-replikering. En för skrivargruppen (värdgrupp 10), där alla anslutningar kommer att vidarebefordras till mastern och läsargruppen (värdgrupp 20) för alla skrivskyddade arbetsbelastningar som kommer att balanseras till båda MySQL-servrarna.

Nästa steg är att bevilja MySQL root-användare och importera den till ProxySQL. Ibland ansluter WHM på något sätt till databasen via TCP-anslutning och kringgår UNIX-socket-filen. I det här fallet måste vi tillåta MySQL root-åtkomst från både [email protected] och [email protected] (IP-adressen för WHM-servern) i vårt replikeringskluster.

Därför är det nödvändigt att köra följande sats på huvudservern (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;

Importera sedan 'root'@'localhost'-användare från vår MySQL-server till ProxySQL-användare genom att gå till ClusterControl -> Noder -> välj ProxySQL-noden -> Användare -> Importera användare . Du kommer att presenteras med följande dialogruta:

Markera kryssrutan [email protected] och klicka på Nästa. I Användarinställningar sida, välj värdgrupp 10 som standardvärdgrupp för användaren:

Vi kan sedan verifiera om ProxySQL körs korrekt på WHM/cPanel-servern genom att använda följande kommando:

$ 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 är vad ProxySQL ska lyssna för att acceptera alla MySQL-anslutningar. Port 6032 är ProxySQL-adminporten, där vi kommer att ansluta för att konfigurera och övervaka ProxySQL-komponenter som användare, värdgrupper, servrar och variabler.

Vid det här laget, om du går till ClusterControl -> Topologi , bör du se följande topologi:

Konfigurera MySQL UNIX-socket

I Linux-miljö, om du definierar MySQL-värd som "localhost", kommer klienten/applikationen att försöka ansluta via UNIX-socketfilen, som som standard finns på /var/lib/mysql/mysql.sock på cPanel-servern. Att använda socket-filen är det mest rekommenderade sättet att komma åt MySQL-servern, eftersom den har mindre overhead jämfört med TCP-anslutningar. En socket-fil innehåller faktiskt inte data, den transporterar den. Det är som ett lokalt rör som servern och klienterna på samma maskin kan använda för att ansluta och utbyta förfrågningar och data.

Med det sagt, om din applikation ansluter via "localhost" och port 3306 som databasvärd och port, kommer den att ansluta via socket-fil. Om du använder "127.0.0.1" och port 3306 kommer programmet troligen att ansluta till databasen via TCP. Detta beteende är väl förklarat i MySQL-dokumentationen. Med enkla ord, använd socket-fil (eller "localhost") för lokal kommunikation och använd TCP om applikationen fjärransluter.

I cPanel övervakas MySQL-socketfilen av cpservd-processen och skulle länkas till en annan socketfil om vi konfigurerade en annan sökväg än standardsökvägen. Anta till exempel att vi konfigurerade en MySQL-socketfil som inte är standard som vi konfigurerade i föregående avsnitt:

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

cPanel via cpservd-processen skulle korrigera detta genom att skapa en symbollänk till standardsockets sökväg:

(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

För att undvika att cpservd automatiskt korrigerar detta (cPanel har en term för detta beteende som kallas "automagiskt"), måste vi inaktivera MySQL-övervakning genom att gå till WHM -> Service Manager (vi kommer inte att använda den lokala MySQL ändå) och avmarkera kryssrutan "Monitor" för MySQL som visas i skärmdumpen nedan:

Spara ändringarna i WHM. Det är nu säkert att ta bort standardsocketfilen och skapa en symbollänk till ProxySQL-socketfilen med följande kommando:

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

Kontrollera att socket MySQL-socket-filen nu omdirigeras till ProxySQL-socket-fil:

(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

Vi måste också ändra standardinloggningsuppgifterna i /root/.my.cnf enligt följande:

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

Lite förklaring - Den första raden som vi kommenterade är MySQL root-lösenordet som genereras av cPanel för den lokala MySQL-servern. Vi kommer inte att använda det, därför är '#' i början av raden. Sedan lade vi till MySQL-rootlösenordet för vår MySQL-replikeringsinställning och UNIX-sockets sökväg, som nu är en symbolisk länk till ProxySQL-socketfilen.

Vid det här laget bör du på WHM-servern kunna komma åt vårt MySQL-replikeringskluster som rootanvändare genom att helt enkelt skriva "mysql", till exempel:

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

Observera att serverversionen är 5.5.30 (ProxySQL). Om du kan ansluta enligt ovan kan vi konfigurera integrationsdelen enligt beskrivningen i nästa avsnitt.

WHM/cPanel-integration

WHM stöder ett antal databasservrar, nämligen MySQL 5.7, MariaDB 10.2 och MariaDB 10.3. Eftersom WHM nu bara ser ProxySQL och den detekteras som version 5.5.30 (som nämnts ovan), kommer WHM att klaga på en MySQL-version som inte stöds. Du kan gå till WHM -> SQL Services -> Hantera MySQL-profiler och klicka på knappen Validera. Du bör få en röd brödrostavisering i det övre högra hörnet som berättar om detta fel.

Därför måste vi ändra MySQL-versionen i ProxySQL till samma version som vårt MySQL-replikeringskluster. Du kan få denna information genom att köra följande programsats på huvudservern:

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

Logga sedan in på ProxySQL-administratörskonsolen för att ändra mysql-server_version variabel:

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

Använd SET-satsen enligt nedan:

mysql> SET mysql-server_version = '5.7.26';

Ladda sedan variabeln i runtime och spara den på disken för att göra den beständig:

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

Verifiera slutligen versionen som ProxySQL kommer att representera:

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

Om du försöker ansluta till MySQL igen genom att köra "mysql"-kommandot, bör du nu få "Serverversion:5.7.26 (ProxySQL)" i terminalen.

Nu kan vi uppdatera MySQL root-lösenordet under WHM -> SQL Services -> Hantera MySQL-profiler . Redigera localhost-profilen genom att ändra fältet Lösenord längst ner med MySQL-rotlösenordet för vårt replikeringskluster. Klicka på knappen Spara när du är klar. Vi kan sedan klicka på "Validera" för att verifiera om WHM kan komma åt vårt MySQL-replikeringskluster via ProxySQL-tjänsten korrekt. Du bör få följande gröna brödrost i det övre högra hörnet:

Om du får det gröna brödrostmeddelandet kan vi fortsätta att integrera ProxySQL via cPanel-kroken.

ProxySQL-integration via cPanel Hook

ProxySQL som mellanhand mellan WHM och MySQL-replikering måste ha ett användarnamn och lösenord för varje MySQL-användare som kommer att passera genom det. Med den nuvarande arkitekturen, om man skapar en användare via kontrollpanelen (WHM via skapande av konto eller cPanel via MySQL Database wizard), kommer WHM automatiskt att skapa användaren direkt i vårt MySQL-replikeringskluster med [email protected] (som har importerats i ProxySQL i förväg). Samma databasanvändare skulle dock inte läggas till i ProxySQL mysql_users-tabellen automatiskt.

Ur slutanvändarens perspektiv skulle detta inte fungera eftersom alla lokala värdanslutningar vid denna tidpunkt bör skickas via ProxySQL. Vi behöver ett sätt att integrera cPanel med ProxySQL, där för alla MySQL-användarrelaterade operationer som utförs av WHM och cPanel, måste ProxySQL meddelas och göra de nödvändiga åtgärderna för att lägga till/ta bort/uppdatera dess interna mysql_users-tabell.

Det bästa sättet att automatisera och integrera dessa komponenter är att använda cPanels standardiserade kroksystem. Standardiserade krokar utlöser applikationer när cPanel &WHM utför en åtgärd. Använd det här systemet för att exekvera anpassad kod (hook action code) för att anpassa hur cPanel &WHM fungerar i specifika scenarier (hookable events).

Skapa först en Perl-modulfil som heter ProxysqlHook.pm under katalogen /usr/local/cpanel:

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

Kopiera och klistra sedan in raderna härifrån. För mer information, kolla in Github-förrådet på ProxySQL cPanel Hook.

Konfigurera Admin-gränssnittet för ProxySQL från rad 16 till 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 när kroken är på plats måste vi registrera den med cPanel-kroken:

(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

Från utgången ovan kopplar denna modul till ett antal cPanel- och WHM-händelser:

  • Whostmgr::Konton::Skapa - WHM -> Kontofunktioner -> Skapa ett nytt konto
  • Whostmgr::Konton::Ta bort - WHM -> Kontofunktioner -> Avsluta ett konto
  • Cpanel::UAPI::Mysql::create_user - cPanel -> Databaser -> MySQL-databaser -> Lägg till ny användare 
  • Cpanel::Api2::MySQLFE::createdbuser - cPanel -> Databaser -> MySQL-databaser -> Lägg till ny användare (kräver för Softaculous-integrering).
  • Cpanel::UAPI::Mysql::delete_user - cPanel -> Databaser -> MySQL-databaser -> Ta bort användare
  • Cpanel::Api2::MySQLFE::deletedbuser - cPanel -> Databaser -> MySQL-databaser -> Lägg till ny användare (kräver för Softaculous-integrering).
  • Cpanel::UAPI::Mysql::set_privileges_on_database - cPanel -> Databaser -> MySQL-databaser -> Lägg till användare i databasen
  • Cpanel::Api2::MySQLFE::setdbuserprivileges - cPanel -> Databaser -> MySQL-databaser -> Lägg till användare i databasen (kräver för Softaculous-integrering).
  • Cpanel::UAPI::Mysql::rename_user - cPanel -> Databaser -> MySQL-databaser -> Byt namn på användare
  • Cpanel::UAPI::Mysql::set_password - cPanel -> Databaser -> MySQL-databaser -> Ändra lösenord

Om händelsen ovan utlöses kommer modulen att utföra de nödvändiga åtgärderna för att synkronisera tabellen mysql_users i ProxySQL. Den utför operationerna via ProxySQL admin-gränssnitt som körs på port 6032 på WHM-servern. Därför är det viktigt att ange rätt användaruppgifter för ProxySQL-adminanvändare för att säkerställa att alla användare synkroniseras med ProxySQL korrekt.

Notera att denna modul, ProxysqlHook.pm aldrig har testats i den riktiga värdmiljön (med många konton och många tredjeparts plugins) och uppenbarligen inte täcker alla MySQL-relaterade händelser inom cPanel. Vi har testat det med Softaculous free edition och det fungerade bra via cPanel API2-krokar. Vissa ytterligare ändringar kan behövas för att omfatta full automatisering.

Det var allt för nu. I nästa del kommer vi att undersöka operationerna efter implementeringen och vad vi kan vinna med vår mycket tillgängliga MySQL-serverlösning för våra värdservrar om vi jämför med standard fristående MySQL-installation.


  1. Hur man skapar en skrivskyddad användare i PostgreSQL

  2. Fyra vanliga myter om molnteknik

  3. Konvertera tidsstämpel till datum i Oracle SQL

  4. Hur gör jag en otydlig matchning av företagsnamn i MYSQL med PHP för automatisk komplettering?