您好,欢迎访问一九零五行业门户网

自己动手实现Multi-Master Replication

直到今天为止,mysql依然只支持一个slave从一个master复制数据,虽然也可以做到一主多备(m->s),双主复制(m
通过研究源码,可以发现,mysql管理每个复制通道,都是通过一个master_info类(sql/rpl_mi.h中定义),start_slave/change_master/stop_slave/show_slave/end_slave这些函数都需要传入一个master_info指针,这就给我们改造多master提供了很大的便利,基本只需要为每个复制通道传入相应的master_info即可。
除了找到函数入口,还需要让语法支持多主,否则change master to语句并不能支持多主。我修改了sql_yacc.yy,支持如下语法:
change master ‘通道标识’ to,start slave ‘通道标识’,stop slave ‘通道标识’,show slave ‘通道标识’ status。
这样就可以支持多master的语法了。
另一个问题是怎么保存多个通道的信息,默认单通道的情况下,用master.info存master的信息,用relay-log.info存复制应用的情况。所以存储文件的名称也要修改,我的方式是,master.info和relay-log.info在末尾加上通道标识后缀,例如名为”plx”的通道,会存成master.info.plx和relay-log.info.plx。relay log因为有序列,所以增加”-通道标识”在序列前。
还有一个问题就是,操作命令都是用通道标识来确定一个通道,那么肯定需要持久化正在用的通道名称,以及建立通道后可以用通道名获取相应的master_info。于是我新建了一个master_info_index类(在sql/rpl_mi.h),里面包含一个通道标识和master_info指针的对应hash表,以及持久化需要的io_cache,通过master.info.index这个文件来存已有的通道标识。
命名实例如下:
-rw-rw—- 1 mysql mysql 10 feb 13 20:40 master.info.index -rw-rw—- 1 mysql mysql 76 feb 14 17:27 master.info.plx1 -rw-rw—- 1 mysql mysql 71 feb 14 17:27 master.info.plx2 -rw-rw—- 1 mysql mysql 90 feb 14 17:25 relay-log.info.plx1 -rw-rw—- 1 mysql mysql 90 feb 14 17:27 relay-log.info.plx2 -rw-rw—- 1 mysql mysql 160 feb 14 10:16 mysql-relay-bin-plx1.000011 -rw-rw—- 1 mysql mysql 83765425 feb 14 17:27 mysql-relay-bin-plx1.000012 -rw-rw—- 1 mysql mysql 106 feb 14 10:16 mysql-relay-bin-plx1.index -rw-rw—- 1 mysql mysql 160 feb 14 10:16 mysql-relay-bin-plx2.000014 -rw-rw—- 1 mysql mysql 83455792 feb 14 17:27 mysql-relay-bin-plx2.000015 -rw-rw—- 1 mysql mysql 106 feb 14 10:16 mysql-relay-bin-plx2.index
有了多master以后我们可以做什么呢?下面给两个应用场景。
第一个是一备多的备份。因为我们采用的分库策略,使我们一个集群会有很多个实例,每个实例里面有几个schema,但是肯定不会重复。例如第一个实例是1~3号schema。第二个实例就是4~6号schema,所以binlog应用到一起并不会冲突数据。这是我们测试的在线备份方案。
第二个是跨机房的ha。为了容灾或者加速,很多公司都采用在不同机房部署数据库的方式,所以就涉及到数据同步。为了保证每个机房产生的数据不冲突,一般来说我们采用的是auto_increment_increment,auto_increment_offset这两个参数,可以控制步进。例如双master,我们会配置主库是奇数序列的id,备库是偶数序列的id,这样切换时就算有少量binlog还未应用,也不会导致数据冲突。跨机房以后,例如两个机房都有双master,两个机房之间数据又需要同步,以前需要借助第三方脚本或者程序,有了多master,按如下方式搭建,设置步进为4,就可以保证每个机房有双master ha,机房之间数据又可以同步。
已知缺陷:
1. 我还没做reset slave ‘通道标识’命令,就是复制通道还不能重置,只能change master来改,不是做不了,因为暂时我们没这个需求,等稳定了再考虑这个细节。
2. 数据冲突没有检测。这个是无法解决的,我只是简单的调用了启动slave的函数来启动多个复制线程,binlog取到本地应用,有数据冲突是不能事先检测的,执行到了才会报出来,可以设置skip-slave-error,对全局有效。其他复制相关的也是全局有效。
最新版patch
已经修改了缺陷1,可以reset slave了。
其它类似信息

推荐信息