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

Replica MySQL con ProxySQL su server WHM/cPanel:prima parte

WHM e cPanel è senza dubbio il pannello di controllo di hosting più popolare per ambienti basati su Linux. Supporta una serie di backend di database:MySQL, MariaDB e PostgreSQL come datastore dell'applicazione. WHM supporta solo configurazioni di database standalone ed è possibile distribuirlo localmente (configurazione predefinita) o in remoto, integrandosi con un server di database esterno. Quest'ultimo sarebbe meglio se si desidera avere una migliore distribuzione del carico, poiché WHM/cPanel gestisce una serie di processi e applicazioni come HTTP(S), FTP, DNS, MySQL e simili.

In questo post del blog, ti mostreremo come integrare una configurazione di replica MySQL esterna in WHM senza problemi, per migliorare la disponibilità del database e scaricare il server di hosting WHM/cPanel. I provider di hosting che eseguono MySQL localmente sul server WHM saprebbero quanto sia impegnativo MySQL in termini di utilizzo delle risorse (a seconda del numero di account che ospita e delle specifiche del server).

Replica MySQL su WHM/cPanel

Per impostazione predefinita, WHM supporta nativamente sia MariaDB che MySQL come configurazione standalone. Puoi collegare un server MySQL esterno a WHM, ma fungerà da host autonomo. Inoltre, gli utenti di cPanel devono conoscere l'indirizzo IP del server MySQL e specificare manualmente l'host esterno nella loro applicazione web se questa funzione è abilitata.

In questo post del blog, utilizzeremo il file socket UNIX ProxySQL per ingannare WHM/cPanel nella connessione al server MySQL esterno tramite il file socket UNIX. In questo modo, hai la sensazione di eseguire MySQL in locale in modo che gli utenti possano utilizzare "localhost" con la porta 3306 come host del database MySQL.

Il diagramma seguente illustra l'architettura finale:

Abbiamo un nuovo server WHM, installato con WHM/cPanel 80.0 (build 18). Poi abbiamo altri tre server:uno per ClusterControl e due per la replica master-slave. ProxySQL verrà installato sul server WHM stesso.

Distribuzione della replica MySQL

Al momento della stesura di questo articolo, stiamo utilizzando WHM 80.0 (build 18) che supporta solo fino a MySQL 5.7 e MariaDB 10.3. In questo caso, utilizzeremo MySQL 5.7 di Oracle. Supponiamo che tu abbia già installato ClusterControl sul server ClusterControl.

Innanzitutto, configura SSH senza password dal server ClusterControl ai server di replica MySQL. Sul server ClusterControl, eseguire:

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

Assicurati di poter eseguire il comando seguente su ClusterControl senza richiedere la password in mezzo:

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

Quindi vai su ClusterControl -> Deploy -> MySQL Replication e inserisci le informazioni richieste. Nel secondo passaggio, scegli Oracle come fornitore e 5.7 come versione del database:

Quindi, specificare l'indirizzo IP del master e dello slave:

Presta attenzione al segno di spunta verde subito prima dell'indirizzo IP. Significa che ClusterControl è in grado di connettersi al server ed è pronto per il passaggio successivo. Fare clic su Distribuisci per avviare la distribuzione. Il processo di distribuzione dovrebbe richiedere dai 15 ai 20 minuti.

Distribuzione di ProxySQL su WHM/cPanel

Dal momento che vogliamo che ProxySQL prenda il controllo della porta MySQL predefinita 3306, dobbiamo prima modificare il server MySQL esistente installato da WHM per ascoltare altre porte e altri file socket. In /etc/my.cnf, modificare le seguenti righe (aggiungerle se non esistono):

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

Quindi, riavvia il server MySQL sul server cPanel:

$ systemctl restart mysqld

A questo punto, il server MySQL locale dovrebbe essere in ascolto sulla porta 3307, collegarsi solo a localhost (lo chiudiamo dall'accesso esterno per essere più sicuri). Ora possiamo procedere alla distribuzione di ProxySQL sull'host WHM, 192.168.0.16 tramite ClusterControl.

Innanzitutto, imposta SSH senza password dal nodo ClusterControl al server WHM che vogliamo installare ProxySQL:

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

Assicurati di poter eseguire il comando seguente su ClusterControl senza richiedere la password in mezzo:

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

Quindi, vai su ClusterControl -> Gestisci -> Load Balancer -> ProxySQL -> Distribuisci ProxySQL e specificare le informazioni richieste:

Compila tutti i dettagli necessari come evidenziato dalle frecce sopra nel diagramma. L'indirizzo del server è il server WHM, 192.168.0.16. La porta di ascolto è 3306 sul server WHM, e prende il controllo del MySQL locale che è già in esecuzione sulla porta 3307. Più in basso, specifichiamo l'amministratore ProxySQL e la password degli utenti di monitoraggio. Quindi includi entrambi i server MySQL nel set di bilanciamento del carico e quindi scegli "No" nella sezione Transazioni implicite. Fare clic su Distribuisci proxySQL per avviare la distribuzione.

Il nostro ProxySQL è ora installato e configurato con due gruppi host per la replica MySQL. Uno per il gruppo di scrittura (gruppo host 10), in cui tutte le connessioni verranno inoltrate al master e al gruppo di lettura (gruppo host 20) per tutti i carichi di lavoro di sola lettura che saranno bilanciati su entrambi i server MySQL.

Il passaggio successivo consiste nel concedere a MySQL l'utente root e importarlo in ProxySQL. Occasionalmente, WHM si connette in qualche modo al database tramite la connessione TCP, bypassando il file socket UNIX. In questo caso, dobbiamo consentire l'accesso root a MySQL sia da [email protected] che da [email protected] (l'indirizzo IP del server WHM) nel nostro cluster di replica.

Pertanto, è necessario eseguire la seguente istruzione sul server master (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;

Quindi, importa l'utente 'root'@'localhost' dal nostro server MySQL nell'utente ProxySQL andando su ClusterControl -> Nodes -> seleziona il nodo ProxySQL -> Utenti -> Importa utenti . Ti verrà presentata la seguente finestra di dialogo:

Spunta la casella [email protected] e fai clic su Avanti. Nelle Impostazioni utente pagina, scegli il gruppo host 10 come gruppo host predefinito per l'utente:

Possiamo quindi verificare se ProxySQL funziona correttamente sul server WHM/cPanel utilizzando il seguente comando:

$ 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

La porta 3306 è ciò che ProxySQL dovrebbe ascoltare per accettare tutte le connessioni MySQL. La porta 6032 è la porta di amministrazione di ProxySQL, dove ci collegheremo per configurare e monitorare i componenti ProxySQL come utenti, gruppi host, server e variabili.

A questo punto, vai su ClusterControl -> Topology , dovresti vedere la seguente topologia:

Configurazione del socket MySQL UNIX

In ambiente Linux, se si definisce l'host MySQL come "localhost", il client/l'applicazione tenterà di connettersi tramite il file socket UNIX, che per impostazione predefinita si trova in /var/lib/mysql/mysql.sock sul server cPanel. L'uso del file socket è il modo più consigliato per accedere al server MySQL, perché ha un sovraccarico inferiore rispetto alle connessioni TCP. Un file socket in realtà non contiene dati, li trasporta. È come una pipe locale che il server e i client sulla stessa macchina possono utilizzare per connettersi e scambiare richieste e dati.

Detto questo, se l'applicazione si connette tramite "localhost" e la porta 3306 come host e porta del database, si connetterà tramite file socket. Se utilizzi "127.0.0.1" e la porta 3306, molto probabilmente l'applicazione si connetterà al database tramite TCP. Questo comportamento è ben spiegato nella documentazione di MySQL. In parole semplici, usa il file socket (o "localhost") per la comunicazione locale e usa il TCP se l'applicazione si connette in remoto.

In cPanel, il file socket MySQL è monitorato dal processo cpservd e sarebbe collegato a un altro file socket se configurassimo un percorso diverso da quello predefinito. Ad esempio, supponiamo di aver configurato un file socket MySQL non predefinito come abbiamo configurato nella sezione precedente:

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

cPanel tramite il processo cpservd correggerebbe questo problema creando un collegamento simbolico al percorso del socket predefinito:

(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

Per evitare che cpservd corregga automaticamente questo (cPanel ha un termine per questo comportamento chiamato "automagicamente"), dobbiamo disabilitare il monitoraggio di MySQL andando su WHM -> Service Manager (non useremo comunque il MySQL locale) e deseleziona la casella di controllo "Monitor" per MySQL come mostrato nello screenshot qui sotto:

Salva le modifiche in WHM. È ora possibile rimuovere il file socket predefinito e creare un collegamento simbolico al file socket ProxySQL con il seguente comando:

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

Verificare che il file socket MySQL sia ora reindirizzato al file 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

Abbiamo anche bisogno di modificare le credenziali di accesso predefinite all'interno di /root/.my.cnf come segue:

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

Un po' di spiegazione - La prima riga che abbiamo commentato è la password di root MySQL generata da cPanel per il server MySQL locale. Non lo useremo, quindi '#' è all'inizio della riga. Quindi, abbiamo aggiunto la password di root MySQL per la nostra configurazione della replica MySQL e il percorso del socket UNIX, che ora è un collegamento simbolico al file socket ProxySQL.

A questo punto, sul server WHM dovresti essere in grado di accedere al nostro cluster di replica MySQL come utente root semplicemente digitando "mysql", ad esempio:

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

Si noti che la versione del server è 5.5.30 (ProxySQL). Se puoi connetterti come sopra, possiamo configurare la parte di integrazione come descritto nella sezione successiva.

Integrazione WHM/cPanel

WHM supporta una serie di server di database, vale a dire MySQL 5.7, MariaDB 10.2 e MariaDB 10.3. Poiché ora WHM vede solo ProxySQL ed è rilevato come versione 5.5.30 (come indicato sopra), WHM si lamenterà della versione MySQL non supportata. Puoi andare su WHM -> Servizi SQL -> Gestisci profili MySQL e fare clic sul pulsante Convalida. Dovresti ricevere una notifica di tostapane rossa nell'angolo in alto a destra che informa di questo errore.

Pertanto, dobbiamo modificare la versione di MySQL in ProxySQL con la stessa versione del nostro cluster di replica MySQL. Puoi ottenere queste informazioni eseguendo la seguente istruzione sul server principale:

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

Quindi, accedi alla console di amministrazione di ProxySQL per modificare mysql-server_version variabile:

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

Utilizzare l'istruzione SET come di seguito:

mysql> SET mysql-server_version = '5.7.26';

Quindi carica la variabile in runtime e salvala su disco per renderla persistente:

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

Infine verifica la versione che ProxySQL rappresenterà:

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

Se provi di nuovo a connetterti a MySQL eseguendo il comando "mysql", ora dovresti ottenere "Versione server:5.7.26 (ProxySQL)" nel terminale.

Ora possiamo aggiornare la password di root MySQL in WHM -> Servizi SQL -> Gestisci profili MySQL . Modifica il profilo localhost modificando il campo Password in basso con la password root MySQL del nostro cluster di replica. Fare clic sul pulsante Salva una volta terminato. Possiamo quindi fare clic su "Convalida" per verificare se WHM può accedere correttamente al nostro cluster di replica MySQL tramite il servizio ProxySQL. Dovresti ottenere il seguente tostapane verde nell'angolo in alto a destra:

Se ricevi la notifica del tostapane verde, possiamo procedere all'integrazione di ProxySQL tramite hook cPanel.

Integrazione ProxySQL tramite cPanel Hook

ProxySQL come intermediario tra la replica WHM e MySQL deve avere un nome utente e una password per ogni utente MySQL che lo attraverserà. Con l'architettura attuale, se si crea un utente tramite il pannello di controllo (WHM tramite la creazione dell'account o cPanel tramite la procedura guidata del database MySQL), WHM creerà automaticamente l'utente direttamente nel nostro cluster di replica MySQL utilizzando [email protected] (che è stato importato in ProxySQL in anticipo). Tuttavia, lo stesso utente del database non verrebbe aggiunto automaticamente alla tabella mysql_users di ProxySQL.

Dal punto di vista dell'utente finale, questo non funzionerebbe perché tutte le connessioni localhost a questo punto dovrebbero essere passate tramite ProxySQL. Abbiamo bisogno di un modo per integrare cPanel con ProxySQL, per cui per qualsiasi operazione relativa all'utente MySQL eseguita da WHM e cPanel, ProxySQL deve essere notificato ed eseguire le azioni necessarie per aggiungere/rimuovere/aggiornare la sua tabella mysql_users interna.

Il modo migliore per automatizzare e integrare questi componenti è utilizzare il sistema di aggancio standardizzato cPanel. Gli hook standardizzati attivano le applicazioni quando cPanel e WHM eseguono un'azione. Utilizza questo sistema per eseguire codice personalizzato (codice azione hook) per personalizzare il funzionamento di cPanel e WHM in scenari specifici (eventi agganciabili).

Innanzitutto, crea un file del modulo Perl chiamato ProxysqlHook.pm nella directory /usr/local/cpanel:

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

Quindi, copia e incolla le righe da qui. Per ulteriori informazioni, controlla il repository Github su ProxySQL cPanel Hook.

Configura l'interfaccia di amministrazione di ProxySQL dalla riga 16 fino alla 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';

Ora che l'hook è a posto, dobbiamo registrarlo con il sistema di hook 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

Dall'output sopra, questo modulo si aggancia a una serie di eventi cPanel e WHM:

  • Whostmgr::Account::Crea - WHM -> Funzioni account -> Crea un nuovo account
  • Whostmgr::Account::Rimuovi - WHM -> Funzioni account -> Chiudi un account
  • Cpanel::UAPI::Mysql::create_user - cPanel -> Database -> Database MySQL -> Aggiungi nuovo utente 
  • Cpanel::Api2::MySQLFE::createdbuser - cPanel -> Database -> Database MySQL -> Aggiungi nuovo utente (richiede l'integrazione con Softaculous).
  • Cpanel::UAPI::Mysql::delete_user - cPanel -> Database -> Database MySQL -> Elimina utente
  • Cpanel::Api2::MySQLFE::deletedbuser - cPanel -> Database -> Database MySQL -> Aggiungi nuovo utente (richiede l'integrazione con Softaculous).
  • Cpanel::UAPI::Mysql::set_privileges_on_database - cPanel -> Database -> Database MySQL -> Aggiungi utente al database
  • Cpanel::Api2::MySQLFE::setdbuserprivileges - cPanel -> Database -> Database MySQL -> Aggiungi utente al database (richiede l'integrazione con Softaculous).
  • Cpanel::UAPI::Mysql::rename_user - cPanel -> Database -> Database MySQL -> Rinomina utente
  • Cpanel::UAPI::Mysql::set_password - cPanel -> Database -> Database MySQL -> Cambia password

Se l'evento sopra viene attivato, il modulo eseguirà le azioni necessarie per sincronizzare la tabella mysql_users in ProxySQL. Esegue le operazioni tramite l'interfaccia di amministrazione ProxySQL in esecuzione sulla porta 6032 del server WHM. Pertanto, è fondamentale specificare le credenziali utente corrette per l'utente amministratore di ProxySQL per assicurarsi che tutti gli utenti vengano sincronizzati correttamente con ProxySQL.

Tieni presente che questo modulo, ProxysqlHook.pm non è mai stato testato nell'ambiente di hosting reale (con molti account e molti plug-in di terze parti) e ovviamente non copre tutti gli eventi relativi a MySQL all'interno di cPanel. L'abbiamo testato con l'edizione gratuita di Softaculous e ha funzionato molto tramite gli hook API2 di cPanel. Potrebbero essere necessarie ulteriori modifiche per abbracciare la piena automazione.

Per ora è tutto. Nella parte successiva, esamineremo le operazioni successive all'implementazione e ciò che potremmo ottenere con la nostra soluzione server MySQL ad alta disponibilità per i nostri server di hosting rispetto alla configurazione standalone standard di MySQL.