近期刚刚实施了一套同城多IDC间的MySQL主从同步方案,主要功能是实现的一主多从数据复制,但真正实施起来确又并不是如此简单。
最主要的制约因素无外乎就是通信带宽和数据量负载大小。
方案实施的背景:
4个集群的IDC机房间通过20Mb专线相互连通;
选取IDC A的mysql数据库作为master;
该master角色的mysql数据库,会有一部分表的数据量异常大,单表过亿;
该master数据库的binlog日志量平均每天60GB;
数据同步使用需求是,只需对数据库中的部分库表做同步即可,这部分小表的数据量分别在个位数到百万之间;
业务使用需求是,主从之间数据同步,同步延时只要控制在2分钟以内,就可以满足上层的业务使用需求。
基于以上情况的分析:
专线带宽有限,不可能复制全部库表数据,也不可能达到实时复制;
IDC间有库表复制需求的表只是一部分,这些表的存量数据在几条到一百万条之间;
复制策略设计为mysql master-->middle slave-->slave,master和middle slave位于同一IDC机房私网内;
第一阶段mysql主从,用于实现从全部库表中过滤出需要使用的部分表;
第二阶段mysql middle alve -->slave,用于实现指定的表在集群间的数据复制;
一、IDC内部mysql部分表主-从复制
IDC A mysql ha 双机部署在server1和server2上面,使用共享存储,双机软件为heartbeat。主、备机的硬件配置相同。对外服务使用的vip。在该方案 中,正常情况下mysql服务运行在主机上,而备机server2一直处在热备待机状态,资源大部分时间内是没有被利用到的。
这次我们把mysql从部署在数据库备机server2上面。因为在mysql ha进行主备切换时,要使用备机上的mysql用户、3306端口以及其它资源文件,所以在新增一个mysql实例作为slave时,需要完全得避开与这些资源的使用冲突。
1、mysql从的数据复制策略说明:
为减少对应用程序层面的干扰,暂不考虑在mysql主机上进行分库处理,因此也就无法使用binlog-do-db功能来控制仅复制指定的数据库(比如把待复制的表放入一个新的库中,然后基于这个库进行mysql主从间的数据复制)。
注:使用binlog-do-db参数并不安全,因为它会仅让指定的库打印binlog日志。这在发生意外故障,就无法满足进行全部库的日志回滚的要求了。
我 们选择使用在mysql从上通过Replicate-do-table功能,来控制哪些表的数据会被写入到mysql slave的数据库中,而这一操作的背景条件是在mysql主、从之间是进行的全部的数据库表复制(仅在从机上决定写入数据库时再按表做判断和过滤操 作)。
这个数据复制操作,是在IDC A局域网内主、备机网卡2通过网线直接,使用mysql主从复制功能中的mysql IO thread进行。主机的网卡1是用于业务生产使用。
每 天的binlog日志数据量大约有60GB,这些全部要复制到从机。从机只有先把binlog复制过来后,才能根据表过滤规则判断是否需要入库。从机会把 复制来的binlog存放在relaylog中,从中仅过滤出与过滤条件相符的库表事件,然后执行并记录到自己的binlog中。
通过以上设计, 在IDC A的mysql slave上只保留了我们需要在IDC间进行数据复制的那些小表,slave本身基于这些小表而产生的binlog日志量成功降低到每天100MB。通过 IDC间的专线,甚至是直接使用互联网带宽实施IDC间的这部分数据表的数据复制同步,可行性都是很高的。
mysql间的主从复制本来就是异步的,任何形式的实时热备的要求,都是在耍流氓。不同的技术满足不同的场景,绝大数企业是承受不了同城热备的成本的。
2、mysql从的部署信息说明:
安装目录:/data/mysql-middle-slave/mysql
数据目录:/data/mysql-middle-slave/mysql_datadir
sock文件:/data/mysql-middle-slave/mysql.sock
pid文件: /data/mysql-middle-slave/mysql_datadir/server2_HA.pid
配置文件:/data/mysql-middle-slave/mysql_conf/my.cnf
监听端口:9000
错误日志:/var/log/mysqld-slave.log
启动脚本:/etc/init.d/mysqld-slave 可以使用service mysqld-slave start/stop/restart管理
在server2本机登录middle-slave的mysql方法:mysql --port=9000--socket=/data/mysql-middle-slave/mysql.sock -uroot -p
3、mysql主从复制使用的网段
在IDC A的mysql主、备HA双机之间是通过主机的网卡2传输的双机心跳监测数据。网卡1是对外提供mysql服务的网卡,目前平均流量在100Mbps。
为减少对生产环境的影响,我们使用网卡2作为mysql主从间数据复制使用的网卡。主机为10.0.0.1,备机为10.0.0.2 。