作者回复: 非常好👍
作者回复: 3 这个应该是可以做到自动化的。
4 这个概率比较小,其实即使是别的三节点的方案,也架不住挂两个实例,所以这个不是MySQL主备的锅。
前面两点提得很对哈。
其实MySQL到现在,还是提供了很多方案可选的。很多是业务权衡的结果。
比如说,异步复制,在主库异常掉电的时候可能会丢数据。
这个大家知道以后,有一些就改成semi-sync了,但是还是有一些就留着异步复制的模式,因为semi-sync有性能影响(一开始35%,现在好点15%左右,看具体环境),而可能这些业务认为丢一两行,可以从应用层日志去补。 就保留了异步复制模式。
最后,为什么主从备份用得最多,我觉得有历史原因。多年前MySQL刚要开始火的时候,大家发现这个主备模式好方便,就都用了。
而基于其他协议的方案,都是后来出现的,并且还是陆陆续续出点bug。
涉及到线上服务,大家使用新方案的热情总是局限在测试环境的多。
semi-sync也是近几年才开始稳定并被一些公司开始作为默认配置。
新技术的推广,在数据库上,确实比其他领域更需要谨慎些,也算是业务决定的吧^_^
好问题👍
以上仅一家之言哈😆
作者回复: 是的,因为算的是:当前执行时间,跟*日志时间*的差距
而这个日志时间,是在A上执行出来的。
好问题,很好的验证过程。
作者回复: 你已经理解GTID的机制啦👍
作者回复: 嗯,多一跳确实是应该多1分钟,在c的最长延迟时间应该是2分钟
作者回复: 是的,
不过reset master这种语句。。就算是基于position的协议,谁在线上主库上执行,也是直接当做删数据论处的了😅
作者回复: 好问题,👍
在binlog文件开头,有一个Previous_gtids, 用于记录 “生成这个binlog的时候,实例的Executed_gtid_set”, 所以启动的时候只需要解析最后一个文件;
同样的,由于有这个Previous_gtids,可以快速地定位GTID在哪个文件里。
作者回复: 对的
总之就是,一个主备关系里,备库的GTID集合应该包含主库的GTID集合。
作者回复: 大没关系呀,是分段的,比如 server_uuid_of_a:1-1000000,就一个段
作者回复: 这种情况下,不可能业务完全无感知,
但是如果业务代码有“重连并重试”的逻辑,并且切换足够快,就可以对业务无影响,前提是要解决主备延迟问题,就是25、26两篇提到的
作者回复: docker中跑MySQL没问题的~
作者回复: 哈哈,you got it
作者回复: 你这个是好问题,
确实只是跳过一个event,不过文档中说了呀
“the slave continues to skip events until it reaches the end of the group. ”,
所以效果上等效于跳过一个事务哦
作者回复: 看一下这个语句的结果, 会受这几个参数的影响哈
select * from information_schema.GLOBAL_VARIABLES where VARIABLE_NAME in ('master_info_repository','relay_log_info_repository','sync_master_info','sync_relay_log_info', 'sync_binlog', 'innodb_flush_log_at_trx_commit');
作者回复: 1. 这个也是异步复制导致的,只有semi-sync能解了。。
2. 不是哦,如果“ A 是主库,A' 备库,B 是 A'的从库”,那所有A的更新也都会通过A'传给B,所以B的GTID集合正常就是包含了A和A'的
3. “如果只有一主一从,有 binlog 丢失”,是的,就只有备库重做了
作者回复: 这个想法很不错 👍
作者回复: 提交事务的时候才生成GTID