带从服务器的MySql主主复制之一
博客已经搬家,请访问如下地址:http://www.czhphp.com
本篇简单的介绍一下MySql主动-主动模式下的主主复制,虽然这种模式的复制会出现很多问题,最明显的就是自增主键的冲突问题,但是在某些特定的环境下,还是会用到这种复制模式。
假设我们的主从主从复制结构是由4台服务器构成,2台master,2台slave。
master服务器1:192.168.0.100 slave服务器1:192.168.0.101
master服务器2:192.168.0.200 slave服务器2:192.168.0.201
构成的结构图如下:
首先,分别在4台机器上安装MySql,并使用MySql自带的my-medium.cnf作为初始配置文件,在4台服务器里分别执行如下命令。
1
2
|
[root@m /s/m/s ~] # yum -y install mysql mysql-server [root@m /s/m/s ~] # \cp -f /usr/share/doc/mysql-server-*/my-medium.cnf /etc/my.cnf |
第一步,配置2台主(Master)服务器配置文件,此步分别在2台主(Master)里操作。
1.在192.168.0.100的/etc/my.cnf的[mysqld]域后里添加
1
2
3
4
5
6
7
8
9
10
11
|
server_id = 100 log_bin = mysql-bin log_bin_index = mysql-bin.index log_slave_updates = 1 relay_log = mysql-relay-bin relay_log_index = mysql-relay-bin.index sync_binlog = 1 max_binlog_size = 200M auto_increment_increment = 2 auto_increment_offset = 1 slave-skip-errors = 1062,1053 |
2.在192.168.0.200的/etc/my.cnf的[mysqld]域后里添加
1
2
3
4
5
6
7
8
9
10
11
|
server_id = 200 log_bin = mysql-bin log_bin_index = mysql-bin.index log_slave_updates = 1 relay_log = mysql-relay-bin relay_log_index = mysql-relay-bin.index sync_binlog = 1 max_binlog_size = 200M auto_increment_increment = 2 auto_increment_offset = 2 slave-skip-errors = 1062,1053 |
为了解决我前面提到的同时插入数据时的自增主键冲突问题,我们加了
1
2
|
auto_increment_increment 定义AUTO_INCREMENT的步长 auto_increment_offset 定义AUTO_INCREMENT的起点值 |
两个参数的配置,这样就解决了这个冲突问题,但是如果某一方写入频繁,某一方写入很少,会造成大量的键空间浪费,而且这不能解决所有主动模式下的主主复制的其他问题,所有没有特殊需要,我推荐你尽量不要用这种复制模式,在下篇我将介绍一种更好的结构->主动被动模式下的主主复制。
第二步,配置2台从(Slave)服务器配置文件,此步分别在2台从(Slave)里操作。
1.在192.168.0.101的/etc/my.cnf的[mysqld]域后追加
1
2
3
4
5
6
7
8
9
10
|
server_id = 101 log_bin = mysql-bin log_bin_index = mysql-bin.index log_slave_updates = 1 relay_log = mysql-relay-bin relay_log_index = mysql-relay-bin.index max_binlog_size = 200M read_only = 1 slave-skip-errors = 1062,1053 skip_slave_start = 1 |
2.在192.168.0.201的/etc/my.cnf的[mysqld]域后追加
1
2
3
4
5
6
7
8
9
10
|
server_id = 201 log_bin = mysql-bin log_bin_index = mysql-bin.index log_slave_updates = 1 relay_log = mysql-relay-bin relay_log_index = mysql-relay-bin.index max_binlog_size = 200M read_only = 1 slave-skip-errors = 1062,1053 skip_slave_start = 1 |
*注意:以上的设置参数,如果设定文件/etc/my.cnf里本身就有的话,就先给删掉,再追加我们的设置。
第三步,启动MySql,为root用户设置密码,并创建复制账户,在4台服务器里分别执行:
1
2
3
4
5
6
7
8
9
|
[root@m /s/m/s ~] # /etc/init.d/mysqld start [root@m /s/m/s ~] # /usr/bin/mysqladmin -u root password 'rootpassword' [root@m /s/m/s ~] # mysql -uroot -p Enter password: mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser' @'192.168. 0.% ' IDENTIFIED BY ' replpass'; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) |
第四步,启动复制:
对于主服务器2(192.168.0.200)来说,主服务器1和从服务器2都是它的从服务器,因此在主服务器1(192.168.0.100)和从服务器2(192.168.0.201)里分别执行:
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@master1 /slave2 ~] # mysql -uroot -p Enter password: mysql> CHANGE MASTER TO MASTER_HOST= '192.168.0.200' , -> MASTER_PORT=3306, -> MASTER_USER= 'repluser' , -> MASTER_PASSWORD= 'replpass' , -> MASTER_LOG_FILE= 'mysql-bin.000001' , -> MASTER_LOG_POS=0; Query OK, 0 rows affected (0.20 sec) mysql> START SLAVE; Query OK, 0 rows affected (0.00 sec) mysql> SHOW SLAVE STATUS\G |
同理在主服务器2(192.168.0.200)和从服务器1(192.168.0.101)里分别执行:
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@master2 /slave1 ~] # mysql -uroot -p Enter password: mysql> CHANGE MASTER TO MASTER_HOST= '192.168.0.100' , -> MASTER_PORT=3306, -> MASTER_USER= 'repluser' , -> MASTER_PASSWORD= 'replpass' , -> MASTER_LOG_FILE= 'mysql-bin.000001' , -> MASTER_LOG_POS=0; Query OK, 0 rows affected (0.20 sec) mysql> START SLAVE; Query OK, 0 rows affected (0.00 sec) mysql> SHOW SLAVE STATUS\G |
到此为止,配置完成,你可以在主服务器里分别插入并删除一些数据做测试了,如果上面SHOW SLAVE STATUS\G也正常,
可是从服务器并未从主服务复制数据,那么你在相对于该服务器的从服务器的MySql里执行一下:
1
2
|
mysql> STOP SLAVE; mysql> START SLAVE; |
如果还是不行,那么你就要检查你的设置并查看MySql的日志文件了。