| 
									
										
										
										
											2024-10-04 11:58:15 +02:00
										 |  |  | +++ | 
					
						
							|  |  |  | images = ['images/blog/mariadb-replication-master-master.jpg'] | 
					
						
							| 
									
										
										
										
											2025-09-15 08:46:36 +02:00
										 |  |  | categories = ['Soluzioni', 'Technology'] | 
					
						
							|  |  |  | tags = ['Server', 'Database', 'Firewall', 'MariaDB', 'OpenSSL', 'UFW'] | 
					
						
							| 
									
										
										
										
											2024-10-04 11:58:15 +02:00
										 |  |  | 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. | 
					
						
							|  |  |  | <!--more--> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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; | 
					
						
							|  |  |  | ``` |