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

Soluzioni | Technology | Server | Database | Firewall | MariaDB | OpenSSL | UFW

#### Tags

Custom CMS Database Desktop Application Dovecot E-Commerce File Server Firewall Home Assistant Home Automation MariaDB NAS Networking Office Server OpenSSL OpnSense Oracle Database Pascal PostgreSQL Privacy PWA Router Security Server Software Development System Administration UFW VPN Web Application

#### Ultimi articoli

Automazione casa con Home Assistant
BrainMinder - second brain web application
Applicazione web con funzionalità di foglio di calcolo e sincronizzazione
Database link con PostgreSQL