Database Replication · 4 min read · Oct 08, 2025

Il Cluster Web Perfetto Bilanciato e ad Alta Disponibilità Con 2 Server Che Eseguono Xen Su Ubuntu 8.04 Hardy Heron - Pagina 4

10. Replicazione MySQL (web1, web2)

10.1 Installazione di MySQL 5.0

apt-get install mysql-server-5.0 mysql-client-5.0

Per assicurarci che la replicazione funzioni, dobbiamo far ascoltare MySQL su tutte le interfacce, quindi commentiamo la riga bind-address = 127.0.0.1 in /etc/mysql/my.cnf:

vi /etc/mysql/my.cnf

[...]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1
[...]

Riavvia MySQL dopo:

/etc/init.d/mysql restart

Su web1

Ora impostiamo un utente di replicazione slave2_user che può essere utilizzato da web2.example.com per accedere al database MySQL:

mysql -u root -p

Nella shell MySQL, esegui i seguenti comandi:

GRANT REPLICATION SLAVE ON . TO ‘slave2_user’@’%’ IDENTIFIED BY ‘slave2_password’;
FLUSH PRIVILEGES;
quit;

Su web2

Ora ripetiamo gli ultimi due passaggi su web2.example.com:

mysql -u root -p

GRANT REPLICATION SLAVE ON . TO ‘slave1_user’@’%’ IDENTIFIED BY ‘slave1_password’;
FLUSH PRIVILEGES;
quit;

Su web1 E web2

Ora creeremo un database che sarà utilizzato in seguito per il server di posta:

mysqladmin -u root -p create mail

Successivamente, andiamo nella shell MySQL:

mysql -u root -p

Nella shell MySQL, creiamo l’utente mail_admin con la password mail_admin_password (sostituiscila con la tua password) che ha privilegi SELECT, INSERT, UPDATE, DELETE sul database mail. Questo utente sarà utilizzato da Postfix e Courier per connettersi al database di posta:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail. TO ‘mail_admin’@’localhost’ IDENTIFIED BY ‘mail_admin_password’;
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.
TO ‘mail_admin’@’localhost.localdomain’ IDENTIFIED BY ‘mail_admin_password’;
FLUSH PRIVILEGES;
quit;

10.2 Configurazione della Replicazione

Ora configuriamo la replicazione master-master in /etc/mysql/my.cnf. Le opzioni di configurazione cruciali per la replicazione master-master sono auto_increment_increment e auto_increment_offset:

  • auto_increment_increment controlla l’incremento tra i valori SUCCESSIVI di AUTO_INCREMENT.
  • auto_increment_offset determina il punto di partenza per i valori della colonna AUTO_INCREMENT.

Supponiamo di avere N nodi MySQL (N=2 in questo esempio), quindi auto_increment_increment ha il valore N su tutti i nodi, e ogni nodo deve avere un valore diverso per auto_increment_offset (1, 2, …, N).

Ora configuriamo i nostri due nodi MySQL:

Su web1

vi /etc/mysql/my.cnf

aggiungi le seguenti righe subito sotto “[mysqld]”:

server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
#use 192.168.1.105 if you didnt install a crossover cable on eth1
master-host = 192.168.0.105
master-user = slave1_user
master-password = slave1_password
master-connect-retry = 60
replicate-do-db = mail
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = mail
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

e modifica la riga “max_binlog_size”:

[...]
max_binlog_size         = 500M
[...]

/etc/init.d/mysql restart

Su web2

vi /etc/mysql/my.cnf

server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2
#use 192.168.1.104 if you didnt install a crossover cable on eth1
master-host = 192.168.0.104
master-user = slave2_user
master-password = slave2_password
master-connect-retry = 60
replicate-do-db = mail
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = mail
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

e modifica la riga “max_binlog_size”:

[...]
max_binlog_size         = 500M
[...]

/etc/init.d/mysql restart

Su web1 E web2

Ora avvieremo la replicazione:

mysql -u root -p

Nella shell MySQL, esegui i seguenti comandi:

reset master;
stop slave;
reset slave;

Ora esegui il seguente:

Su web1

CHANGE MASTER TO MASTER_HOST=’192.168.0.105’, MASTER_USER=’slave1_user’, MASTER_PASSWORD=’slave1_password’, MASTER_LOG_FILE=’mysql-bin.000001’, MASTER_LOG_POS=98;

start slave;
quit;

Su web2

CHANGE MASTER TO MASTER_HOST=’192.168.0.104’, MASTER_USER=’slave2_user’, MASTER_PASSWORD=’slave2_password’, MASTER_LOG_FILE=’mysql-bin.000001’, MASTER_LOG_POS=98;

start slave;
quit;

Ora la replicazione dovrebbe funzionare.

10.3 Testare la replicazione

Su web1 E web2

mysql -u root -p

Nella shell MySQL, esegui i seguenti comandi:

show slave status \G;

Ci sono 3 righe importanti nell’output che dovrebbero apparire così:

[...]
Slave_IO_State: Waiting for master to send event
[...]
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: mail
[...]

Ora puoi uscire da mysql:

quit;

Su web1

Inseriremo alcuni dati su web1.example.com per il test e che serviranno nel capitolo successivo per la posta:

mysql -u root -p

Nella shell MySQL, esegui i seguenti comandi:

use mail;

Creeremo le seguenti tabelle:

CREATE TABLE domains (
domain varchar(50) NOT NULL,
transport varchar(128) NOT NULL default ‘smtp:[192.168.1.104]’,
PRIMARY KEY (domain) )
TYPE=MyISAM;

CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;

CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT ‘10485760’,
PRIMARY KEY (email)
) TYPE=MyISAM;

CREATE TABLE transport (
domain varchar(128) NOT NULL default ‘’,
transport varchar(128) NOT NULL default ‘’,
UNIQUE KEY domain (domain)
) TYPE=MyISAM;

quit;

Queste tabelle appena create dovrebbero apparire anche nel database mail di web2, grazie alla replicazione.

Su web2

Ora verificheremo che:

mysql -u root -p

Nella shell MySQL, esegui i seguenti comandi:

use mail;
show tables;

L’output dovrebbe essere:

+----------------+
| Tables_in_mail |
+----------------+
| domains         |
| forwardings    |
| transport        |
| users              |
+----------------+
4 rows in set (0.00 sec)

quit;

Se vedi che la replicazione funziona.

10.4 Creazione dell’utente per l’directord

Ora creeremo l’utente che si connetterà al database nel file ldirectord.php.

Su web1 E web2

mysql -u root -p

Nella shell MySQL, esegui i seguenti comandi:

GRANT USAGE ON . TO ‘ldirectord’@’localhost’ IDENTIFIED BY ‘LDIRECTORD_PASSWORD’;
quit;

Ora quando vai con il tuo browser agli indirizzi:

http://192.168.1.104/ldirectord.php

ed

http://192.168.1.105/ldirectord.php

Dovresti vedere:

Connected to MySQL

visualizzato sullo schermo.

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.