5.5 KiB
+++ images = ['images/blog/mariadb-replication-master-master.jpg'] categoriesspot = ['Solutions', 'Technology'] tagsspot = ['Server', 'Database', 'Firewall', 'MariaDB', 'OpenSSL', 'UFW'] date = '2022-07-19' lastmod = '2022-12-11' title = 'Replicazione master-master MariaDB tramite Internet' published = true translationKey ='mariadb-replication-master-master-internet' slug = 'mariadb-replicazione-master-master-tramite-internet' +++
MariaDB (e MySQL) consentono di configurare la replica master-slave tra due servers. Una replica di tipo master-master può esere implementata tramite Galera, ma richiede almeno 3 servers. Se si dispone di 2 servers è possibile configurare una replica master-master duplicando in maniera incrociata la replica master-slave.
Questa funzionalità può essere implementata anche tramite servers collegati tra di loro tramite Internet, cifrando la connessione nativa di MariaDB tramite certificati SSL e controllando l'accesso al servizio tramite firewall software (ufw ad esempio).
Supponendo quindi di disporre di 2 servers server1
e server2
le procedure
da seguire sono le seguenti.
1. Predisposizione delle regole dei firewall
Per far comunicare i due servers tra di loro, è necessario consentire la comunicazione sull porta TCP di MariaDB (default 3306)
Su server2
ufw allow from server1-ip to server2-ip 3306 comment "Allow replication from server1"
Su server1
ufw allow from server2-ip to server1-ip 3306 comment "Allow replication from server2"
2. Generazione dei certificati SSL
Per rendere sicura la connessione tra i due servers si può sfruttare la connettività SSL già presente in MariaDB generando la propria CA (Certification Authority) ed i rispettivi certificati per i due servers.
XCA è un ottimo software visuale per generare e mantenere i certificati SSL.
Un'alternativa alla connessione diretta e cifrata tramite SSL è la creazione di un VPN che colleghi i due servers.
3. Allineamento dati servers
Nel caso in cui i due servers contengano già dati, sarà necessario procedere con un allineamento preventivo tramite esportazione ed importazione dei databases interessati, in modo che entrambi i servers contengano gli stessi databases, tables e records.
4. Creare gli utenti dedicati su ogni server per consentire la replica
Su server1
creare l'utente per la connessione da server2
e dargli i permessi
per la replica verso server1
CREATE USER 'server2'@'server2-ip' IDENTIFIED BY 'server2pwd';
GRANT REPLICATION SLAVE ON *.* TO 'server2'@'server2-ip';
FLUSH PRIVILEGES;
Su server2
creare l'utente per la connessione da server1
e dargli i permessi
per la replica verso server2
CREATE USER 'server1'@'server1-ip' IDENTIFIED BY 'server1pwd';
GRANT REPLICATION SLAVE ON *.* TO 'server1'@'server1-ip';
FLUSH PRIVILEGES;
5. Configurare server1
In file server.conf :
key_buffer_size = 64M
max_allowed_packet = 64M
server-id = 1
report_host = server1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
log-slave-updates
auto_increment_increment=1
auto_increment_offset=1
slave-skip-errors=1062,1032,1007,1008,1050,1396
skip-slave-start=FALSE
6. Configurare server2
In file server.conf :
key_buffer_size = 64M
max_allowed_packet = 64M
server-id = 2
report_host = server2
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
log-slave-updates
auto_increment_increment=2
auto_increment_offset=2
slave-skip-errors=1062,1032,1007,1008,1050,1396
skip-slave-start=FALSE
7. Configurare server1
come SLAVE di server2
Su server2
eseguire il comando :
SHOW MASTER STATUS \G;
e prendere nota dei valori : File
e Position
che andranno sostituiti nelle
variabili rispettivamente MASTER_LOG_FILE
e MASTER_LOG_POS
nel codice seguente
da eseguire su server1
:
CHANGE MASTER TO
MASTER_HOST='server2-ip',
MASTER_USER='server1',
MASTER_PASSWORD='server1pwd',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=17680369,
MASTER_CONNECT_RETRY=10,
MASTER_SSL=1,
MASTER_SSL_CA='/etc/mysql/ssl/ca.crt',
MASTER_SSL_CERT='/etc/mysql/ssl/server1.crt',
MASTER_SSL_KEY='/etc/mysql/ssl/server1.key';
START SLAVE;
Verificare lo stato della replica slave con il comando :
SHOW SLAVE STATUS\G;
8. Configurare server2
come SLAVE di server1
Su server1
eseguire il comando :
SHOW MASTER STATUS \G;
e prendere nota dei valori : File
e Position
che andranno sostituiti nelle
variabili rispettivamente MASTER_LOG_FILE
e MASTER_LOG_POS
nel codice seguente
da eseguire su server2
:
CHANGE MASTER TO
MASTER_HOST='server1-ip',
MASTER_USER='server2',
MASTER_PASSWORD='server2pwd',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000051',
MASTER_LOG_POS=825490817,
MASTER_CONNECT_RETRY=10,
MASTER_SSL=1,
MASTER_SSL_CA='/etc/mysql/ssl/ca.crt',
MASTER_SSL_CERT='/etc/mysql/ssl/server2.crt',
MASTER_SSL_KEY='/etc/mysql/ssl/server2.key';
START SLAVE;
Verificare lo stato della replica slave con il comando :
SHOW SLAVE STATUS\G;