sql >> Database teknologi >  >> RDS >> MariaDB

MySQL-replikering med ProxySQL på WHM/cPanel-servere:Del 1

WHM og cPanel er uden tvivl det mest populære hostingkontrolpanel til Linux-baserede miljøer. Det understøtter en række database-backends - MySQL, MariaDB og PostgreSQL som applikationsdatalageret. WHM understøtter kun selvstændige databaseopsætninger, og du kan enten få den installeret lokalt (standardkonfiguration) eller eksternt ved at integrere med en ekstern databaseserver. Sidstnævnte ville være bedre, hvis du vil have bedre belastningsfordeling, da WHM/cPanel håndterer en række processer og applikationer som HTTP(S), FTP, DNS, MySQL og sådan.

I dette blogindlæg vil vi vise dig, hvordan du kan integrere en ekstern MySQL-replikeringsopsætning i WHM problemfrit for at forbedre databasetilgængeligheden og aflaste WHM/cPanel-hostingserveren. Hostingudbydere, der kører MySQL lokalt på WHM-serveren, vil vide, hvor krævende MySQL er med hensyn til ressourceudnyttelse (afhængigt af antallet af konti, den hoster og serverspecifikationerne).

MySQL-replikering på WHM/cPanel

Som standard understøtter WHM naturligt både MariaDB og MySQL som en selvstændig opsætning. Du kan tilslutte en ekstern MySQL-server til WHM, men den vil fungere som en selvstændig vært. Derudover skal cPanel-brugere kende IP-adressen på MySQL-serveren og manuelt angive den eksterne vært i deres webapplikation, hvis denne funktion er aktiveret.

I dette blogindlæg skal vi bruge ProxySQL UNIX-socket-fil til at narre WHM/cPanel til at oprette forbindelse til den eksterne MySQL-server via UNIX-socket-fil. På denne måde får du fornemmelsen af ​​at køre MySQL lokalt, så brugere kan bruge "localhost" med port 3306 som deres MySQL-databasevært.

Følgende diagram illustrerer den endelige arkitektur:

Vi skal have en ny WHM-server installeret med WHM/cPanel 80.0 (build 18). Så har vi yderligere tre servere - en til ClusterControl og to til master-slave-replikering. ProxySQL vil blive installeret på selve WHM-serveren.

Implementering af MySQL-replikering

I skrivende stund bruger vi WHM 80.0 (build 18), som kun understøtter op til MySQL 5.7 og MariaDB 10.3. I dette tilfælde skal vi bruge MySQL 5.7 fra Oracle. Vi antager, at du allerede har installeret ClusterControl på ClusterControl-serveren.

For det første skal du opsætte adgangskodefri SSH fra ClusterControl-server til MySQL-replikeringsservere. På ClusterControl-serveren skal du gøre:

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

Sørg for, at du kan køre følgende kommando på ClusterControl uden adgangskodeprompt imellem:

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

Gå derefter til ClusterControl -> Deploy -> MySQL Replication og indtast de nødvendige oplysninger. På det andet trin skal du vælge Oracle som leverandør og 5.7 som databaseversion:

Angiv derefter IP-adressen på master og slave:

Vær opmærksom på det grønne flueben lige før IP-adressen. Det betyder, at ClusterControl er i stand til at oprette forbindelse til serveren og er klar til næste trin. Klik på Implementer for at starte implementeringen. Implementeringsprocessen bør tage 15 til 20 minutter.

Implementering af ProxySQL på WHM/cPanel

Da vi ønsker, at ProxySQL skal overtage standard MySQL-port 3306, skal vi først ændre den eksisterende MySQL-server installeret af WHM for at lytte til andre porte og andre socket-filer. I /etc/my.cnf skal du ændre følgende linjer (tilføj dem, hvis de ikke findes):

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

Genstart derefter MySQL-serveren på cPanel-serveren:

$ systemctl restart mysqld

På dette tidspunkt bør den lokale MySQL-server lytte på port 3307, kun binde til localhost (vi lukker den ned fra ekstern adgang for at være mere sikker). Nu kan vi fortsætte med at implementere ProxySQL på WHM-værten, 192.168.0.16 via ClusterControl.

Først skal du opsætte adgangskodefri SSH fra ClusterControl node til WHM-serveren, som vi vil installere ProxySQL:

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

Sørg for, at du kan køre følgende kommando på ClusterControl uden adgangskodeprompt imellem:

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

Gå derefter til ClusterControl -> Administrer -> Load Balancers -> ProxySQL -> Implementer ProxySQL og angiv de nødvendige oplysninger:

Udfyld alle nødvendige detaljer som fremhævet af pilene ovenfor i diagrammet. Serveradressen er WHM-serveren, 192.168.0.16. Lytteporten er 3306 på WHM-serveren, og overtager den lokale MySQL, som allerede kører på port 3307. Længere nede angiver vi ProxySQL admin og overvågningsbrugernes adgangskode. Inkluder derefter begge MySQL-servere i belastningsbalanceringssættet, og vælg derefter "Nej" i afsnittet Implicitte transaktioner. Klik på Implementer ProxySQL for at starte implementeringen.

Vores ProxySQL er nu installeret og konfigureret med to værtsgrupper til MySQL-replikering. En for forfattergruppen (værtsgruppe 10), hvor alle forbindelser vil blive videresendt til masteren og læsegruppen (værtsgruppe 20) for alle skrivebeskyttede arbejdsbelastninger, som vil blive afbalanceret til begge MySQL-servere.

Det næste trin er at give MySQL root-bruger og importere den til ProxySQL. Af og til forbinder WHM sig på en eller anden måde til databasen via TCP-forbindelse og omgår UNIX-socket-filen. I dette tilfælde skal vi tillade MySQL root-adgang fra både [email protected] og [email protected] (IP-adressen på WHM-serveren) i vores replikeringsklynge.

Derfor er det nødvendigt at køre følgende sætning på masterserveren (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;

Importer derefter 'root'@'localhost'-bruger fra vores MySQL-server til ProxySQL-bruger ved at gå til ClusterControl -> Noder -> vælg ProxySQL-noden -> Brugere -> Importer brugere . Du vil blive præsenteret for følgende dialogboks:

Marker afkrydsningsfeltet [email protected], og klik på Næste. I Brugerindstillinger side, skal du vælge værtsgruppe 10 som standard værtsgruppe for brugeren:

Vi kan derefter kontrollere, om ProxySQL kører korrekt på WHM/cPanel-serveren ved at bruge følgende 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 er, hvad ProxySQL skal lytte for at acceptere alle MySQL-forbindelser. Port 6032 er ProxySQL-administrationsporten, hvor vi vil oprette forbindelse for at konfigurere og overvåge ProxySQL-komponenter som brugere, værtsgrupper, servere og variabler.

På dette tidspunkt, hvis du går til ClusterControl -> Topologi , bør du se følgende topologi:

Konfiguration af MySQL UNIX-socket

I Linux-miljø, hvis du definerer MySQL-vært som "localhost", vil klienten/applikationen forsøge at oprette forbindelse via UNIX-socket-filen, som som standard er placeret på /var/lib/mysql/mysql.sock på cPanel-serveren. Brug af socket-filen er den mest anbefalede måde at få adgang til MySQL-serveren på, fordi den har mindre overhead sammenlignet med TCP-forbindelser. En socket-fil indeholder faktisk ikke data, den transporterer dem. Det er som et lokalt rør, som serveren og klienterne på den samme maskine kan bruge til at forbinde og udveksle anmodninger og data.

Når det er sagt, hvis din applikation forbinder via "localhost" og port 3306 som databasevært og port, vil den oprette forbindelse via socket-fil. Hvis du bruger "127.0.0.1" og port 3306, vil programmet højst sandsynligt oprette forbindelse til databasen via TCP. Denne adfærd er godt forklaret i MySQL-dokumentationen. Med enkle ord, brug socket-fil (eller "localhost") til lokal kommunikation og brug TCP, hvis applikationen opretter fjernforbindelse.

I cPanel overvåges MySQL-socket-filen af ​​cpservd-processen og ville blive knyttet til en anden socket-fil, hvis vi konfigurerede en anden sti end standardstien. Antag for eksempel, at vi konfigurerede en ikke-standard MySQL-socket-fil, som vi konfigurerede i forrige afsnit:

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

cPanel via cpservd-processen ville rette dette ved at oprette et symbollink til standard socket-stien:

(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

For at undgå, at cpservd automatisk genretter dette (cPanel har en betegnelse for denne adfærd kaldet "automagisk"), er vi nødt til at deaktivere MySQL-overvågning ved at gå til WHM -> Service Manager (vi kommer ikke til at bruge den lokale MySQL alligevel) og fjern markeringen i "Monitor" afkrydsningsfeltet for MySQL som vist på skærmbilledet nedenfor:

Gem ændringerne i WHM. Det er nu sikkert at fjerne standard socket-filen og oprette et symlink til ProxySQL socket-fil med følgende kommando:

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

Bekræft, at socket-MySQL-socket-filen nu er omdirigeret til 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 skal også ændre standardloginoplysningerne i /root/.my.cnf som følger:

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

Lidt forklaring - Den første linje, vi kommenterede ud, er MySQL root-adgangskoden genereret af cPanel til den lokale MySQL-server. Vi kommer ikke til at bruge det, derfor er '#' i begyndelsen af ​​linjen. Derefter tilføjede vi MySQL root-adgangskoden til vores MySQL-replikeringsopsætning og UNIX-socketsti, som nu er et symbolsk link til ProxySQL-socketfilen.

På dette tidspunkt bør du på WHM-serveren være i stand til at få adgang til vores MySQL-replikeringsklynge som root-bruger ved blot at skrive "mysql", for eksempel:

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

Bemærk, at serverversionen er 5.5.30 (ProxySQL). Hvis du kan tilslutte som ovenfor, kan vi konfigurere integrationsdelen som beskrevet i næste afsnit.

WHM/cPanel-integration

WHM understøtter en række databaseservere, nemlig MySQL 5.7, MariaDB 10.2 og MariaDB 10.3. Da WHM nu kun ser ProxySQL, og den er registreret som version 5.5.30 (som nævnt ovenfor), vil WHM klage over ikke-understøttet MySQL-version. Du kan gå til WHM -> SQL Services -> Administrer MySQL-profiler og klik på knappen Valider. Du bør få en rød brødristermeddelelse i øverste højre hjørne, der fortæller om denne fejl.

Derfor er vi nødt til at ændre MySQL-versionen i ProxySQL til den samme version som vores MySQL-replikeringsklynge. Du kan få disse oplysninger ved at køre følgende sætning på masterserveren:

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

Log derefter på ProxySQL-administrationskonsollen for at ændre mysql-server_version variabel:

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

Brug SET-sætningen som nedenfor:

mysql> SET mysql-server_version = '5.7.26';

Indlæs derefter variablen i runtime og gem den på disken for at gøre den persistent:

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

Bekræft endelig den version, som ProxySQL repræsenterer:

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

Hvis du igen prøver at oprette forbindelse til MySQL ved at køre "mysql"-kommandoen, skulle du nu få "Serverversion:5.7.26 (ProxySQL)" i terminalen.

Nu kan vi opdatere MySQL root-adgangskoden under WHM -> SQL Services -> Administrer MySQL-profiler . Rediger localhost-profilen ved at ændre feltet Adgangskode nederst med MySQL root-adgangskoden til vores replikeringsklynge. Klik på knappen Gem, når du er færdig. Vi kan derefter klikke på "Valider" for at bekræfte, om WHM kan få adgang til vores MySQL-replikeringsklynge via ProxySQL-tjenesten korrekt. Du bør få følgende grønne brødrister i øverste højre hjørne:

Hvis du får den grønne brødristermeddelelse, kan vi fortsætte med at integrere ProxySQL via cPanel-hook.

ProxySQL-integration via cPanel Hook

ProxySQL som mellemmand mellem WHM og MySQL-replikering skal have et brugernavn og en adgangskode for hver MySQL-bruger, der skal igennem det. Med den nuværende arkitektur, hvis man opretter en bruger via kontrolpanelet (WHM via kontooprettelse eller cPanel via MySQL Database wizard), vil WHM automatisk oprette brugeren direkte i vores MySQL replikeringsklynge ved hjælp af [email protected] (som er blevet importeret ind i ProxySQL på forhånd). Den samme databasebruger vil dog ikke automatisk blive tilføjet til ProxySQL mysql_users-tabellen.

Fra slutbrugerens perspektiv ville dette ikke fungere, fordi alle lokale værtsforbindelser på dette tidspunkt skal sendes gennem ProxySQL. Vi har brug for en måde at integrere cPanel med ProxySQL, hvorved for enhver MySQL-brugerrelaterede operationer udført af WHM og cPanel, skal ProxySQL underrettes og udføre de nødvendige handlinger for at tilføje/fjerne/opdatere dens interne mysql_users-tabel.

Den bedste måde at automatisere og integrere disse komponenter på er ved at bruge cPanels standardiserede krogsystem. Standardiserede kroge udløser applikationer, når cPanel &WHM udfører en handling. Brug dette system til at udføre tilpasset kode (hook action code) for at tilpasse, hvordan cPanel &WHM fungerer i specifikke scenarier (hookable events).

For det første skal du oprette en Perl-modulfil kaldet ProxysqlHook.pm under mappen /usr/local/cpanel:

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

Kopier og indsæt derefter linjerne herfra. For mere info, tjek Github-lageret på ProxySQL cPanel Hook.

Konfigurer ProxySQL admin-grænsefladen fra linje 16 til 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 hvor krogen er på plads, skal vi registrere den med cPanel krogsystemet:

(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

Fra outputtet ovenfor tilsluttes dette modul til en række cPanel- og WHM-begivenheder:

  • Whostmgr::Konti::Opret - WHM -> Kontofunktioner -> Opret en ny konto
  • Whostmgr::Konti::Fjern - WHM -> Kontofunktioner -> Afslut en konto
  • Cpanel::UAPI::Mysql::create_user - cPanel -> Databaser -> MySQL-databaser -> Tilføj ny bruger 
  • Cpanel::Api2::MySQLFE::createdbuser - cPanel -> Databaser -> MySQL-databaser -> Tilføj ny bruger (kræver for Softaculous-integration).
  • Cpanel::UAPI::Mysql::delete_user - cPanel -> Databaser -> MySQL-databaser -> Slet bruger
  • Cpanel::Api2::MySQLFE::deletedbuser - cPanel -> Databaser -> MySQL-databaser -> Tilføj ny bruger (kræver for Softaculous-integration).
  • Cpanel::UAPI::Mysql::set_privileges_on_database - cPanel -> Databaser -> MySQL-databaser -> Tilføj bruger til databasen
  • Cpanel::Api2::MySQLFE::setdbuserprivileges - cPanel -> Databaser -> MySQL-databaser -> Føj bruger til databasen (kræver for Softaculous-integration).
  • Cpanel::UAPI::Mysql::rename_user - cPanel -> Databaser -> MySQL-databaser -> Omdøb bruger
  • Cpanel::UAPI::Mysql::set_password - cPanel -> Databaser -> MySQL-databaser -> Skift adgangskode

Hvis hændelsen ovenfor udløses, vil modulet udføre de nødvendige handlinger for at synkronisere mysql_users-tabellen i ProxySQL. Den udfører operationerne via ProxySQL admin-grænseflade, der kører på port 6032 på WHM-serveren. Derfor er det vigtigt at angive de korrekte brugeroplysninger for ProxySQL-administratorbrugeren for at sikre, at alle brugere bliver synkroniseret korrekt med ProxySQL.

Bemærk, at dette modul, ProxysqlHook.pm aldrig er blevet testet i det rigtige hostingmiljø (med mange konti og mange tredjeparts plugins) og naturligvis ikke dækker alle MySQL-relaterede begivenheder i cPanel. Vi har testet det med Softaculous gratis udgave, og det fungerede meget via cPanel API2 kroge. Nogle yderligere ændringer kan være nødvendige for at omfavne fuld automatisering.

Det var det for nu. I den næste del vil vi se nærmere på operationerne efter implementeringen, og hvad vi kan vinde med vores meget tilgængelige MySQL-serverløsning til vores hostingservere, hvis det sammenlignes med standard standalone MySQL-opsætning.


  1. Ret "FEJL:kolonnen "colname" eksisterer ikke" i PostgreSQL, når du bruger UNION, EXCEPT eller INTERSECT

  2. Problem med SQLiteOpenHelper på Android 2.X og 3.X

  3. Sådan konverteres epoke til mySQL tidsstempel i JAVA

  4. Sådan gendannes en SQL Server-database på en Mac ved hjælp af SQL Operations Studio