180 lines
5.5 KiB
Markdown
180 lines
5.5 KiB
Markdown
|
+++
|
||
|
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.
|
||
|
<!--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;
|
||
|
```
|