Howto – ambiente di test – mysql – replica master-master

Vediamo ora come implementare una replica master-master per MySQL.

Per prima cosa bisogna scaricare  il database MySQL. Per questo ambiente di test scarichiamo il pacchetto binario dal sito MySQL,

Ad esempio su di una distribuzione debian-like procederemo come al solito con

aptitude search mysql 
aptitude install mysql-server

Andiamo ora a creare due istanze del db.

Creiamo come root le datadir

mkdir /var/lib/mysql-mm-1
mkdir /var/lib/mysql-mm-2

Sempre come root prepariamo le configurazioni

cp -rp /etc/mysql/my.cnf /etc/mysql-mm-1/my.cnf
cp -rp /etc/mysql/my.cnf /etc/mysql-mm-2/my.cnf

Editiamo ora il file my.cnf fino ad ottenere per il nodo 1 qualche cosa come

[client]
port            = 3307
socket          = /var/run/mysqld/mysqld-mm-1.sock

[mysqld_safe]
socket          = /var/run/mysqld/mysqld-mm-1.sock
nice            = 0

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld-mm-1.pid
socket          = /var/run/mysqld/mysqld-mm-1.sock
port            = 3307
basedir         = /usr
datadir         = /var/lib/mysql-mm-1
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
key_buffer              = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
myisam-recover         = BACKUP
query_cache_limit       = 1M
query_cache_size        = 16M
log_error = /var/log/mysql/error-mm-1.log
server-id               = 11
log_bin                 = /var/log/mysql/mm-1-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M

[mysqldump]
quick
quote-names
max_allowed_packet      = 16M

[mysql]

[isamchk]
key_buffer              = 16M

e per il nodo 2 qualche cosa come

[client]
port		= 3308
socket		= /var/run/mysqld/mysqld-mm-2.sock

[mysqld_safe]
socket		= /var/run/mysqld/mysqldi-mm-2.sock
nice		= 0

[mysqld]
user		= mysql
pid-file	= /var/run/mysqld/mysqld-mm-2.pid
socket		= /var/run/mysqld/mysqld-mm-2.sock
port		= 3308
basedir		= /usr
datadir		= /var/lib/mysql-mm-2
tmpdir		= /tmp
lc-messages-dir	= /usr/share/mysql
skip-external-locking
bind-address		= 127.0.0.1
key_buffer		= 16M
max_allowed_packet	= 16M
thread_stack		= 192K
thread_cache_size       = 8
myisam-recover         = BACKUP
query_cache_limit	= 1M
query_cache_size        = 16M
log_error = /var/log/mysql/error-mm-2.log
server-id		= 12
log_bin			= /var/log/mysql/mm-2-bin.log
expire_logs_days	= 10
max_binlog_size         = 100M

[mysqldump]
quick
quote-names
max_allowed_packet	= 16M

[mysql]
[isamchk]
key_buffer		= 16M

da notare in questi file:

  • port: ho usato porte non standard e diverse per i due nodi
  • server-id: ho dato due valori diversi ai due nodi
  • log-bin: ho abilitato i binary log
  • datadir: specifica per ogni nodo.

Devo ora popolare le directory dei dati:

mysql_install_db --user=mysql  --defaults-file=/etc/mysql-mm-1/my.cnf
mysql_install_db --user=mysql  --defaults-file=/etc/mysql-mm-2/my.cnf

Posso ora avviare i due database

mysqld_safe --defaults-file=/etc/mysql-mm-1/my.cnf &
mysqld_safe --defaults-file=/etc/mysql-mm-2/my.cnf &

Al primo avvio dovranno essere generati tutta una serie di file ma dopo un po’ i due database dovrebbero essere accessibili:

mysql --port 3307 --host 127.0.0.1 --user=root
mysql --port 3308 --host 127.0.0.1 --user=root

NB: su Ubuntu apparmor impedisce di eseguire questa procedura. Per escluderlo

aa-complain /usr/sbin/mysqld

Trattandosi di due istanze appena create non ci dobbiamo preoccupare allineare la situazione iniziale dei due nodi mysql imprtando dei backup.

Procediamo quindi a configurare il nodo mysql due come replica del nodo mysql uno.

Per prima cosa dobbiamo vedere lo stato come master del nodo uno:

mysql --port 3307 --host 127.0.0.1 --user=root
show master status\G

otterremo qualche cosa come

*************************** 1. row ***************************
            File: mm-1-bin.000005
        Position: 107
    Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

Nel caso avessimo ripristinato da un backup avremmo dovuto far riferimento a informazioni analoghe ma prese al momento del backup.
Abilitiamo ora la prima replica

mysql --port 3307 --host 127.0.0.1 --user=root
change master to MASTER_HOST='127.0.0.1', MASTER_PORT=3307 , MASTER_USER='root' , MASTER_LOG_FILE = 'mm-1-bin.000005', MASTER_LOG_POS =107;
show slave status\G

Ho qui utilizzato l’utente root. In condizioni non di test bisognerebbe utilizzare un utente con gli appositi permessi (REPLICATION_CLIENT, REPLICATION_SLAVE).
Lo stesso per l’altro nodo

mysql --port 3308 --host 127.0.0.1 --user=root
change master to MASTER_HOST='127.0.0.1', MASTER_PORT=3308 , MASTER_USER='root' , MASTER_LOG_FILE = 'mm-2-bin.000005', MASTER_LOG_POS =107;
show slave status\G

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *