Você está na página 1de 7

MySQL Master-Master Replication

Whats MySQL Replication


Replication enables data from one MySQL database server (the master) to be replicated to one or
more MySQL database servers (the slaves).
So MySQL Master-Master Replication
In other words MySQL replication is the process by which data stored in a database, will be
copied to a second servers database. This is called MySQL master-slave replication. Today Im
going to focus on MySQL master-master replication where it allows data to be copied from
either server. In other words perform reads or writes from either server.

Image Courtesy : alexfilatov.com


Below are the two server we are going to use, Server X: 192.168.X.28 Server Y: 192.168.Y.29
Step 1 Install and Configure MySQL on Server X
sudo apt-get install mysql-serve

sudo apt-get install mysql-server mysql-client

We need to edit /etc/mysql/my.cnf on Server X and add below lines.


server-id = 1
log_bin = /var/log/mysql/mysql-b
binlog_do_db = sample
auto-increment-increment = 2
auto-increment-offset = 2

1
2
3
4
5
6

server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = sample
auto-increment-increment = 2
auto-increment-offset = 2
#bind-address = 127.0.0.1

After you save and quit that file, you need to restart mysql:

sudo service mysql restart

sudo service mysql restart

Open up the MySQL shell.


mysql -u root -p

mysql -u root -p

We have to create a user where the user is used for the replication. User replicator_user &
replace password with the password you wish.
create user 'replicator_user'@'%

create user 'replicator_user'@'%' identified by 'password';

Next, we need to give this user permissions to replicate the data:


grant replication slave on *.* to '

grant replication slave on *.* to 'replicator_user'@'%' identified by 'password'; flush privileges;

The following command will output important information which will be used later.
show master status;

show master status;

+------------------+----------+-----| File
| Position | Binlog_D
+------------------+----------+-----| mysql-bin.000001 | 1005 | sa
+------------------+----------+------

1
2
3
4
5
6

+------------------+----------+--------------+------------------+
| File
| Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 1005 | sample
|
|
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

lock the database to prevent any new changes


flush tables w ith read lock;

flush tables with read lock;

Lets export the database using mysqldump


mysqldump -u root -p sample >

mysqldump -u root -p sample > sample.sql

unlock the databases (making it writeable again).


unlock tables;

unlock tables;

Finish up by exiting the shell.


Step 2 Install and Configure MySQL on Server Y
We need to repeat the same steps that we followed on Server X.
sudo apt-get install mysql-serve

sudo apt-get install mysql-server mysql-client

Lets start by editing the /etc/mysql/my.cnf file.


server-id = 2
log_bin = /var/log/mysql/mysql-b
binlog_do_db = sample
auto-increment-increment = 2
auto-increment-offset = 1

1
2
3
4
5
6

server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = sample
auto-increment-increment = 2
auto-increment-offset = 1
#bind-address = 127.0.0.1

After you save and quit the file, you need to restart MySQL:
sudo service mysql restart

sudo service mysql restart

Its time to go into the MySQL shell.


mysql -u root -p

mysql -u root -p

Next, we need to create the database that we are going to replicate.


create database sample;

create database sample;

then exit
exit;

exit;

Import the database that you previously exported.


mysql -u root -p sample < /path/

mysql -u root -p sample < /path/to/sample.sql

Lets login the back to the shell. Just as on Server X, A user will be created which will be
responsible for the replication.
create user 'replicator_user'@'%

create user 'replicator_user'@'%' identified by 'password';

permissions for replication


grant replication slave on *.* to '

grant replication slave on *.* to 'replicator_user'@'%' identified by 'password'; flush privileges;

This will allow replication to begin. The following should be typed at the mysql shell
slave stop;
CHANGE MASTER TO MASTER_
slave start;

1
2
3

slave stop;
CHANGE MASTER TO MASTER_HOST = '192.168.X.28', MASTER_USER = 'replicator_user',
MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 1005;
slave start;

Now lets make a note of the master log file and position to use to replicate in the other direction
(from Server Y to Server X).
show master status;

show master status;


+------------------+----------+-----| File
| Position | Binlog_D
+------------------+----------+-----| mysql-bin.000001 | 433
| sa
+------------------+----------+------

1
2
3
4
5
6

+------------------+----------+--------------+------------------+
| File
| Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 433
| sample
|
|
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Step 3 Completing Replication on Server X


Running this command will replicate all data from Server Y.
slave stop;
CHANGE MASTER TO MASTER_
slave start;

1
2
3

slave stop;
CHANGE MASTER TO MASTER_HOST = '192.168.Y.29', MASTER_USER = 'replicator_user',
MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 433;
slave start;

You be able to see the details of the replication by typing in this command. The \G rearranges the
text to make it more readable.
show slave status\G;

show slave status\G;

As a verification that everything are working as expected examine the output of the above
command and make sure that Slave_IO_Running and Slave_SQL_Running are both YES.
Tips & Tricks
Above mentioned configuration is the minimal configuration for a MySQL master-master
replication. See the below for a full my.ini configurations.
server_id = 1
log_bin = /var/log/mysql/mysqllog_bin_index = /var/log/mysql/m
relay_log = /var/log/mysql/mysq
relay_log_index = /var/log/mys

server_id = 1

2
3
4
5
6
7
8
9
10

log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
expire_logs_days = 10
max_binlog_size = 100M
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 2

server_id = 2
log_bin = /var/log/mysql/mysql-b
log_bin_index = /var/log/mysql/m
relay_log = /var/log/mysql/mysq
relay_log_index = /var/log/mysq

1
2
3
4
5
6
7
8
9
10

server_id = 2
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
expire_logs_days = 10
max_binlog_size = 100M
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 1

Hope you got an idea how to do a MySQL master-master replication. If you have any questions
on MySQL master-master replication let me know in the comments below. Your feedback is
highly appreciated(happy-face).

Você também pode gostar