179 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| +++
 | |
| images = ['images/blog/mariadb-replication-master-master.jpg']
 | |
| categories = ['Soluzioni', 'Technology']
 | |
| tags = ['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.
 | |
| <!--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;
 | |
| ```
 | 
