现在的位置: 首页 > 综合 > 正文

Mysql Multi Master replication 之TaobaoPatch

2012年10月24日 ⁄ 综合 ⁄ 共 2093字 ⁄ 字号 评论关闭

1. 淘宝Patch
现在已经合并进mariadb10.0.版本,大家可以从
http://bazaar.launchpad.net/~maria-captains/maria/10.0-mdev253/changes

下载
该补丁主要针对有多个Master并且Mater上的Database都不相同。

它不要求主库是特定的版本,当Slave连多个Master的时候只需要在Change Master后面加上一个connection name来表明连的具体是哪一个主库。
语法如下:

1 CHANGE MASTER "test1" TO MASTER_HOST='host1', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_PORT=7777, MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=751;

当Slave连上多个主库的时候会在slave的数据目录下看到多份Relay Log、master.info、relay-log.info、mysqld-relay-bin.index

命名如下:

 1 -rw-rw---- 1 ddb netease 59 Oct 16 17:11 relay-log-test1.info
 2 -rw-rw---- 1 ddb netease 57 Oct 16 17:07 relay-log-test2.info
 3 
 4 -rw-rw---- 1 ddb netease 448 Oct 16 17:08 mysqld-relay-bin-test1.000008
 5 -rw-rw---- 1 ddb netease 736 Oct 16 17:11 mysqld-relay-bin-test1.000009
 6 -rw-rw---- 1 ddb netease 64 Oct 16 17:08 mysqld-relay-bin-test1.index
 7 -rw-rw---- 1 ddb netease 471 Oct 16 17:07 mysqld-relay-bin-test2.000013
 8 -rw-rw---- 1 ddb netease 415 Oct 16 17:07 mysqld-relay-bin-test2.000014
 9 -rw-rw---- 1 ddb netease 64 Oct 16 17:07 mysqld-relay-bin-test2.index
10 -rw-rw---- 1 ddb netease 76 Oct 16 17:11 master-test1.info
11 -rw-rw---- 1 ddb netease 76 Oct 16 17:07 master-test2.info
12 -rw-rw---- 1 ddb netease 12 Oct 16 15:21 multi-master.info

同时也会有一个multi-master.info用来存储所有的connection name.

ddb@db-35:~/zty/plinux/node1$ cat multi-master.info
test1
test2

Mysql Replication上基本上所有的命令都能在这上面使用。
在Slave上查看所有Slave状态的命令如下:

mysql> show all slaves status\G

如果要查看某一个Slave如下:

mysql> show slave "connection name" status \G

还有Start Slave、Stop Slave 命令都差不多,具体请看:

https://kb.askmonty.org/en/multi-source-replication/

假设遇到这样的情况:
Slave上连着多个Master,但是有一个Slave-Master因为主键冲突断掉了,我们只需要Skip这个Slave-Master上的一个Event。改如何做?
当然我们也可以重新Change Master到一个新的位置。
但是作者提供了一个更加便捷的方法,如下:

1 mysql> set @@default_master_connection='test1';
2 Query OK, 0 rows affected (0.00 sec)
3 
4 mysql> 
5 mysql> 
6 mysql> stop slave ; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave ;

 

像这样的话,设置了set @@default_master_connection='test1',表明以下所有操作只针对这一个Slave-Master上,命令也和普通的Mysql完全相同。

还有几个比较疑惑的地方:

1. 在主库上Grant Privileges 是否会复制到Slave上?
经过我的测试,主库上授权操作会复制到Slave。

2. 如果有多个主库都在DatabaseName相同的DB下创建一个相同的表,会怎么样?
如果一个Slave有两个Matser,都在test下创建了一个Table T ,这样Slave上肯定会有一个Slave-master挂掉。

优点;
1. 对DBA友好,命令容易使用。
2. 省去了部署中间层的麻烦。
缺点:
1. 可能还有未知BUG。
2. 只支持异步复制不支持半同步复制。

抱歉!评论已关闭.