设为首页 收藏本站
查看: 344|回复: 0

[经验分享] (转)MySQL双主复制环境中BINLOG日志的解析

[复制链接]

尚未签到

发表于 2016-10-22 08:20:25 | 显示全部楼层 |阅读模式
MySQL Replication的双主高可用是很常用的数据库高可用方案,在数据库软件升级、大数据量更新、对象结构变更等方面相比普通的M-S结构有巨大优势。但是,多主模式由于只有两个实例,在读写分离方面不太好处理,如果为每个


master各挂载几个slave的话,一旦该master宕机,则这一组slave也统统失去了数据更新的有效来源。


本文主要通过分析MySQL数据库记录的BINLOG日志,验证当某个master宕机时,挂载于其下的slave是否有在不丢失(损坏)数据的前提下,变更master。


文章中的测试环境如下:
MASTER:
10.0.0.110:3306
10.0.0.111:3306
两者互为主从,构成了双主架构。
SLAVE:
10.0.0.111:3307,是10.0.0.110:3306的SLAVE。


有表如下:
mysql> desc j1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| vl    | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)


为有效分析mysql的binlog记录的信息,验证不同节点上操作对各slave的影响(每个mysql节点均可视为slave,即使是双主的两个master),下面分别在两个master身份的节点上均执行写操作:


先是在111:3306端操作:
mysql> insert into j1 values (1,'a');
Query OK, 1 row affected (0.00 sec)


然后到110:3306端再操作:
mysql> insert into j1 values (2,'b');
Query OK, 1 row affected (0.00 sec)


下面分别各个节点去查看生成的binlog日志


-----------------------------------------------------------------------------------
110:3306端执行mysqlbinlog
# mysqlbinlog -v --base64-output=DECODE-ROWS binlog/mysql-bin.000019


输出信息中如下:
/*!*/;
# at 547
# at 592
#111117 16:25:14 server id 1113306  end_log_pos 592     Table_map: `jssdb`.`j1` mapped to number 34
#111117 16:25:14 server id 1113306  end_log_pos 628     Write_rows: table id 34 flags: STMT_END_F
### INSERT INTO jssdb.j1
### SET
###   @1=1
###   @2='a'
# at 628
#111117 16:25:14 server id 1113306  end_log_pos 655     Xid = 20
COMMIT/*!*/;
# at 655
#111117 12:40:39 server id 1103306  end_log_pos 729     Query   thread_id=5     exec_time=0     error_code=0
SET TIMESTAMP=1321504839/*!*/;
SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/;
BEGIN
/*!*/;
# at 729
# at 774
#111117 12:40:39 server id 1103306  end_log_pos 774     Table_map: `jssdb`.`j1` mapped to number 34
#111117 12:40:39 server id 1103306  end_log_pos 810     Write_rows: table id 34 flags: STMT_END_F
### INSERT INTO jssdb.j1
### SET
###   @1=2
###   @2='b'
# at 810
#111117 12:40:39 server id 1103306  end_log_pos 837     Xid = 22
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;


------------------------------------------------------------------------------------
111:3306
# mysqlbinlog -v --base64-output=DECODE-ROWS 3306/binlog/mysql-bin.000023


输出信息中如下:
/*!*/;
# at 557
# at 602
#111117 16:25:14 server id 1113306  end_log_pos 602     Table_map: `jssdb`.`j1` mapped to number 34
#111117 16:25:14 server id 1113306  end_log_pos 638     Write_rows: table id 34 flags: STMT_END_F
### INSERT INTO jssdb.j1
### SET
###   @1=1
###   @2='a'
# at 638
#111117 16:25:14 server id 1113306  end_log_pos 665     Xid = 16
COMMIT/*!*/;
# at 665
#111117 12:40:39 server id 1103306  end_log_pos 729     Query   thread_id=5     exec_time=14298 error_code=0
SET TIMESTAMP=1321504839/*!*/;
SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/;
BEGIN
/*!*/;
# at 729
# at 774
#111117 12:40:39 server id 1103306  end_log_pos 774     Table_map: `jssdb`.`j1` mapped to number 34
#111117 12:40:39 server id 1103306  end_log_pos 810     Write_rows: table id 34 flags: STMT_END_F
### INSERT INTO jssdb.j1
### SET
###   @1=2
###   @2='b'
# at 810
#111117 12:40:39 server id 1103306  end_log_pos 837     Xid = 19
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
------------------------------------------------------------------------------------
111:3307slave端查看relay-bin-log文件:
# mysqlbinlog -v --base64-output=DECODE-ROWS 3307/data/mysql-relay-bin.000009


输出信息中如下:
/*!*/;
# at 693
# at 738
#111117 16:25:14 server id 1113306  end_log_pos 592     Table_map: `jssdb`.`j1` mapped to number 34
#111117 16:25:14 server id 1113306  end_log_pos 628     Write_rows: table id 34 flags: STMT_END_F
### INSERT INTO jssdb.j1
### SET
###   @1=1
###   @2='a'
# at 774
#111117 16:25:14 server id 1113306  end_log_pos 655     Xid = 20
COMMIT/*!*/;
# at 801
#111117 12:40:39 server id 1103306  end_log_pos 729     Query   thread_id=5     exec_time=0     error_code=0
SET TIMESTAMP=1321504839/*!*/;
SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/;
BEGIN
/*!*/;
# at 875
# at 920
#111117 12:40:39 server id 1103306  end_log_pos 774     Table_map: `jssdb`.`j1` mapped to number 34
#111117 12:40:39 server id 1103306  end_log_pos 810     Write_rows: table id 34 flags: STMT_END_F
### INSERT INTO jssdb.j1
### SET
###   @1=2
###   @2='b'
# at 956
#111117 12:40:39 server id 1103306  end_log_pos 837     Xid = 22
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
------------------------------------------------------------------------------------
通过分析上述信息可以看到,不管master是什么,其slave记录的binlog信息中server id和end_log_pos是恒定的。


由于110:3306和111:3306互为主从关系,而其它slave只能跟一台master,当110或111任意mysql服务中断,可以根据当前slave读取到的binlog位置,重点在于:
#111117 12:40:39 server id 1103306  end_log_pos 837     Xid = 22


每个slave都会有这样的信息(包括110/111和3306),因此可以到仍然alive的master端查看binlog,通过前面那个信息中得到的关键字过滤,确定行号信息中对应的end_log_pos的位置,再向上读取一行,即前一行信息:
# at 810


得到这个信息后,分别在各个slave端change master,指定成当前存活的那个binlog文件和position即可。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-289620-1-1.html 上篇帖子: 本周技术关注[面向webapps运维]: Mysql Host '...' is blocked 错误 下篇帖子: MyBatis学习 之 一、MyBatis简介与配置MyBatis+Spring+MySql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表