Replica Master Master per MySQL

ediamo 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