Lets assume you have the following configuration
DBServer1 : 172.20.10.217 = (IP Address of Master1/Slave 2)
DBServer2 : 172.20.10.218 = (IP Address of Master2/Slave 1)
Procedure
1. Install mysql on Master1 and Slave1
2. On Master1, make changes in my.cnf :
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock old_passwords=1 # Replication log-bin=mysql-bin.log server-id=1 [mysql.server] user=mysql basedir=/var/lib/mysql [mysqld_safe] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
3. On Master1, restart mysql.
[root@db1 ~]# /etc/init.d/mysqld start Starting MySQL: [ OK ]
4. On Master1, create a replication slave account in mysql.
mysql> grant replication slave on *.* to 'repl'@172.20.10.218 identified by 'slave';
5. On Master1 Check the current log position of the database
mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 | 100 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
6. Now edit my.cnf on Slave1:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock old_passwords=1 # Replication log-bin=mysql-bin.log server-id=2 [mysql.server] user=mysql basedir=/var/lib/mysql [mysqld_safe] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
7. Restart Mysql on Slave1
[root@db2 ~]# /etc/init.d/mysqld start Starting MySQL: [ OK ]
8. Login to MySQL stop and reset the slave.
mysql> stop slave mysql> reset slave
9. Follow the current position of the logs from Master DB based on the master status above
mysql> CHANGE MASTER TO MASTER_HOST='172.20.10.217', MASTER_USER='repl', MASTER_PASSWORD='slave', MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=100; Query OK, 0 rows affected (0.09 sec)
10. Restart mysql Slave1 and check the slave status:
mysql> start slave; mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.20.10.217 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: MASTERMYSQL01-bin.000004 Read_Master_Log_Pos: 100 Relay_Log_File: MASTERMYSQL02-relay-bin.000015 Relay_Log_Pos: 3630 Relay_Master_Log_File: MASTERMYSQL01-bin.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 4 Relay_Log_Space: 3630 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 1519187 1 row in set (0.00 sec)
Take note of the highlight lines Slave_IO_Running and Slave_SQL_Running state value must be YES.
11. On Master1:
mysql> show master status; +------------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------------+----------+--------------+------------------+ |MysqlMYSQL01-bin.000004 | 100 | | | +------------------------+----------+--------------+------------------+ 1 row in set (0.00 sec
The above scenario is consider as Master-Slave!
Next we will create a slave master scenario for the same systems and so the scenario when combined can be called as master master.
12. On Master2/Slave1 Create a replication slave account:
mysql> grant replication slave on *.* to 'repl'@172.20.10.217 identified by 'slave2';
13. On Master2/Slave1 Check the current log position of the database
mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 | 100 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
14. On Master1/Slave2 Follow the current position of the logs from Master1 DB based on the master status above
mysql> CHANGE MASTER TO MASTER_HOST='172.20.10.218', MASTER_USER='repl', MASTER_PASSWORD='slave2', MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=100; Query OK, 0 rows affected (0.09 sec)
15. On Master1/Slave2 Start Slave:
mysql> start slave;
16. On mysql Master1/Slave2:
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.20.10.218 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: Mysql1MYSQL02-bin.000004 Read_Master_Log_Pos: 100 Relay_Log_File: Mysql1MYSQL01-relay-bin.000004 Relay_Log_Pos: 120 Relay_Master_Log_File: Mysql1MYSQL02-bin.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 100 Relay_Log_Space: 120 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 103799 1 row in set (0.00 sec) ERROR: No query specified
Check the Slave_IO_Running and Slave_SQL_Running make sure states are in Yes . To test that its working fine create tables in the database and you will see changes in slave.
You have now a setup called Master-MasterReplication!
var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-37138722-1']); _gaq.push(['_trackPageview']);
(function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();