+++ 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](https://mariadb.org) (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](https://help.ubuntu.com/community/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``` ```bash ufw allow from server1-ip to server2-ip 3306 comment "Allow replication from server1" ``` Su ```server1``` ```bash 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](https://hohnstaedt.de/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``` ```sql 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``` ```sql 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 : ```bash 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 : ```bash 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 : ```sql 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``` : ```sql 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 : ```sql SHOW SLAVE STATUS\G; ``` ##### 8. Configurare ```server2``` come SLAVE di ```server1``` Su ```server1``` eseguire il comando : ```sql 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``` : ```sql 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 : ```sql SHOW SLAVE STATUS\G; ```