MySQL轻松实现一主多从,但要将多个实例的数据复制到一个实例中就比较难啦,幸好在MariaDB中已经实现multi-master replication 功能;
在介绍MariaDB的功能前,我们先看看一些开源的解决方案:
1、Tungsten replicator 支持异构数据复制,java实现,成本较高;
2、使用mysqlbinlog或者类似工具拉取binlog,实现较为简单;
3、采用级联复制,比如在两个master之间实现复制,M1->M2,M2上对应的表存储引擎使用Blackhole引擎,并且开启log-slave-update选项;最后在M2之后再挂一台slave即可;
4、采用Federated存储引擎,在一台实例上创建远端数据表的“软链接”
5、其他各种patch或者工具
以上几种方式,大家可能已经都接触过,最近MariaDB 10.0.5 beta版中已经集成这个功能:
实现方式:
多个复制通道管理:
MySQL管理每个复制通道都是通过Master_Info类,这些函数: start_slave|change_master|stop_slave|show_slave函数都需要一个Master_info指针即可;所以添加通道标示:
CHANGE MASTER ‘connection-name’ TO,START SLAVE ‘connection-name’,STOP SLAVE ‘connection-name’,SHOW SLAVE ‘connection-name’ STATUS;
其中可以通过设置默认connection name :
set @@default_master_connection='';
通道信息保存(暂不考虑类似5.6中的功能):
文件:
multi-master-info-file (master.info带上了multi-前缀),存储使用中的master connection name;
master-info-connection-name.info 当前slave连接master的信息;
relay-log-connection-name.seq-num 从master读取的复制信息;
这些文件的名称均被转换为小写;
此时,show slave status 显示为空,只能单个查看 show slave 'connection name';或者 show all slaves status 来查看状态;
其中binlog为做更改,全部记录在一起;
其他:
如果使用这种方案的话,业务数据不能重叠;
相关限制:
1、目前最多只能拥有64个master;
2、复制线程只能是两个:IO,SQL (解决中。。。);
3、xtradb innodb-recovery-update-relay-log 这个选项需要关闭;
4、slave_net_timeout 影响的是所有connection;
5、slave_heartbeat_period 不起作用;
6、半同步复制不能使用(解决中。。。。)
本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/1325322,如需转载请自行联系原作者