MySQL replication: ottimizzare le prestazioni del database di WordPress


Introduzione

La configurazione classica di WordPress prevede, in linea di massima, un database MySQL ed un server a gestire il tutto in maniera unificata: col trascorrere del tempo, come abbiamo sottolineato in più occasioni, la gestione di un sito a database singolo finisce per risultare inadeguata, e può essere utile valutare scenari differenti di configurazione.Il passaggio ad un’architettura di questo tipo, in cui sostanzialmente c’è un singolo sito fatto in WordPress e più database di “appoggio”sincronizzati tra loro, è alla base della configurazione di cui parleremo oggi (e che cercheremo di descrivere nel dettaglio).

Quello che si può fare nella pratica per realizzare questo tipo di possibilità  è provare ad utilizzare una configurazione scalabile, in cui si sfruttano la database replication ed un particolare plugin (HyperDB). La database replication è un meccanismo master-slave in cui non c’è più un solo database MySQL, ma almeno due – di cui il secondo ed i successivi vengono attivati ed usati all’occorrenza. Questo ovviamente comporta un comportamento di sincronizzazione del sistema, che deve mantenere allineati tutti i db con gli stessi dati per evitare perdite degli stessi, errori imprevedibili e via dicendo. Qual è il vantaggio di tutto questo? L’architettura può aiutare a migliorare le performance non tanto in scrittura quando, di fatto, in fase di lettura dello stesso, ed è peraltro estendibile a più database “clonati” da quello originale.

Partiamo dal presupposto che la tua configurazione includa due server di applicazioni WordPress con bilanciamento del carico che si connettono a un server di database MySQL separato (consulta i prerequisiti per un tutorial su come configurarlo). Non è strettamente necessario disporre di server delle applicazioni con bilanciamento del carico per seguire questo tutorial, ma il server di database MySQL dovrebbe essere separato dai server delle applicazioni.

Prerequisiti

L’architettura in questione presuppone l’uso di più VPS che comunicano tra di loro, e nello specifico configurate come segue:

  • haproxy-www: un server di bilanciamento indicato come HAProxy , che farà  da entry point
  • wordpress-1: istanza di WordPress
  • wordpress-2: istanza di WordPress duplicata
  • mysql-1: istanza del database MySQL
  • mysql-2: istanza duplicata di MySQL

A livello generale, il client accederà  al sito mediante il server bilanciato, che poi dirotterà  la richiesta su uno dei due server WP indicati e farà  infine accesso al database. Le richieste di lettura saranno indirizzate a seconda delle necessità  e del carico di lavoro sul server su una delle due istanze, mentre quelle di scrittura le manderemo soltanto sulla prima (che poi si auto-sincronizzerà  sulla seconda).

Immagine tratta da https://www.digitalocean.com/community/tutorials/how-to-optimize-wordpress-performance-with-mysql-replication-on-ubuntu-14-04 – Fonte del tutorial

Set Up della configurazione master-slave

Prima di poter configurare il nostro WordPress per funzionare da più server di database, dobbiamo impostare la nostra replica MySQL in modo che funzioni in automatico. Sulla VPS di mysql-2, installiamo MySQL Server:

sudo apt-get update
sudo apt-get install mysql-server

Impostiamo la password di root ed andiamo al passaggio successivo.

Configure Existing MySQL Server as a Master

Sull’istanza di mysql-1 (che sarà  il master) editiamo il file di configurazione di MySQL:

sudo vi /etc/mysql/my.cnf

ed andiamo ad impostare le seguenti righe:

bind-address = mysql1private_IP

server-id = 1

log_bin = /var/log/mysql/mysql-bin.log

ovvero:

  • bind-address: l’indirizzo IP della VPS mysql-1
  • server-id: l’identificativo del server, in questo caso 1
  • log_bin: posizione del file di log

che poi vuol dire, nella pratica:

bind-address = <span class=“highlight”>mysql1privateIP</span>
server-id = 1
logbin = /var/log/mysql/mysql-bin.log

Riavviamo l’istanza di MySQL:

sudo service mysql restart

Ora possiamo connetterci all’istanza via MySQL

mysql -u root -p

Inseriamo la password e poi creiamo l’utenza slave che andrà  ad accedere:

CREATE USER ‘repl’@’<span class=“highlight”>%</span>’ IDENTIFIED BY ’<span class=“highlight”>repl_password</span>’;
GRANT REPLICATION SLAVE ON . TO ‘repl’@’%’;

Fare un backup di mysql-1

Sempre dalla console MySQL, diamo il seguente comando per bloccare il database in sola lettura:

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
EXIT

e poi facciamo un dump con il nome masterdump.sql:

mysqldump --lock-all-tables -u root -p --all-databases > masterdump.sql

Mediante scp possiamo inviare il file in questione sull’altra istanza, nella cartella /tmp:

scp masterdump.sql user@mysql2private_IP:/tmp

Adesso facciamo login su mysql-1:

mysql -u root -p

sblocchiamo l’istanza

SET GLOBAL read_only = OFF;
UNLOCK TABLES;

ed interroghiamo lo status scrivendo:

SHOW MASTER STATUS;

prendiamo nota dei valori di File e Position:

| File | Position | BinlogDoDB | BinlogIgnoreDB |

| mysql-bin.000001 | 408 | | |

Configurare l’istanza mysql-2

Ora vorremo importare il database master nell’istanza slave per sincronizzarli in preparazione per la replica. Su mysql-2, importiamo il dump masterdump.sql:

mysql -u root -p < /tmp/masterdump.sql

Successivamente, configureremo mysql-2 come slave di replica. Su mysql-2, modifica il file di configurazione di MySQL:

sudo vi /etc/mysql/my.cnf

Cerchiamo le seguenti due righe:

bind-address = 127.0.0.1

server-id=1

e cambiamole come segue:

bind-address = mysql2private_IP
server-id = 2

Salviamo tutto, a questo punto e riavviamo mysql:

sudo service mysql restart

Adesso rientriamo nella console del database:

mysql -u root -p

ed impostiamo i seguenti valori:

  • MASTER_HOST: IP dell’istanza mysql-1
  • MASTER_USER: , repl
  • MASTER_PASSWORD: password per repl
  • MASTERLOGFILE: Impostiamo il valore di FILE precedentemente rilevato, ovver ad es. mysql-bin.000001
  • MASTERLOGPOS: Impostiamo il valore di POSITION precedentemente rilevato, ovvero nel nostro esempio con SHOW MASTER STATUS la colonna riportava 408

Per avviare l’istanza in questione, a questo punto, basta lanciare il processo con:

START SLAVE;

e per verificare lo status, cioè se effettivamente funziona:

SHOW SLAVE STATUS\G

Come configurare HyperDB su WordPress

Secondo la strutturazione del database che abbiamo visto, ci sono due istanze “ombra” dello stesso database e sono destinate ad usi diversi (anche se non perfettamente distinti, in effetti):

  • aggiornamenti in scrittura al db: master;
  • richieste di lettura: master e slave

Possiamo fare tutto da SSH: prima di tutto ci scarichiamo il file del plugin ufficiale dal repository, e poi lo scompattiamo (in questo modo dovrà  solo essere attivato dal backend di WP):

cd ~; 
wget http://downloads.wordpress.org/plugin/hyperdb.zip
sudo apt-get install zip
unzip hyperdb.zip

Adesso ci dobbiamo copiare il file db-config.php nella root del sito e poi personalizzarlo a dovere:

cp ~/hyperdb/db-config.php /var/www/html/
pico /var/www/html/db-config.php

La seconda volta che vediamo l’occorrenza della stringa DB_HOST, è il db slave e dovremmo configurarla su questa falsariga:

$wpdb->adddatabase(array(
‘host’ => DB
HOST,
‘user’ => DBUSER,
‘password’ => DB
PASSWORD,
‘name’ => DB_NAME,
‘write’ => 0, ‘read’ => 1, ‘dataset’ => ‘global’, ‘timeout’ => 0.2, ));

La prima occorrenza nel file della variabile DB_HOST coincide con la definizione del db master, e ce ne accorgiamo dal valore di DBHOST pari al riferimento DBSLAVE1`:

‘host’ => DBSLAVE1

Adesso il DB_SLAVE_1 deve essere riferito all’interno del wp-config.php classico: andiamo a cercare il db host ed impostiamo la variabile mysql2private_IP al posto di localhost:

define(‘DBSLAVE1’, ’<span class=“highlight”>mysql2private_IP</span>’);

Then save and exit.

Infine, copiamo il file db.phpnella cartella wp-content , e rendiamolo in sola lettura per sicurezza:

cp ~/hyperdb/db.php /var/www/html/wp-content/

sudo chmod a-w /var/www/html/wp-content/db.php

e per sicurezza impostiamogli pure i ruoli utente corretti con chown:

sudo chown -R www-data:www-data /var/www/html/

Fatto! Da adesso la configurazione del database di WordPress dovrebbe funzionare.

Foto di copertina: Boitumelo Phetla on Unsplash

👇 Da non perdere 👇



Questo portale web esiste da 4559 giorni (12 anni), e contiene ad oggi 4194 articoli (circa 3.355.200 parole in tutto) e 20 servizi online gratuiti. – Leggi un altro articolo a caso
Privacy e termini di servizio / Cookie - Il nostro network è composto da Lipercubo , Pagare.online e Trovalost
Seguici su Telegram, ne vale la pena ❤️ ➡ @trovalost
Questo sito contribuisce alla audience di sè stesso.