SPOT Blog

Progetti Soluzioni Tecnologia

Replicazione master-master MariaDB 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;
Data pubblicazione : 2022-07-19 | Ultima modifica : 2022-12-11

Categorie : Soluzioni | Tecnologia
Tags : Server | Database | Firewall | MariaDB | OpenSSL | UFW