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. 只支持异步复制不支持半同步复制。