关于一致性:技术分享-无损半同步复制下主从高可用切换后数据一致吗
作者:芬达 “芬达的数据库学习笔记" 公众号作者,国内最沉闷 mysql ocp 考试探讨群群主,群号:120242978 。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 高能正告,因作者能力无限,文章的剖析过程没有基于 MySQL 源码,而是依据一些业界大佬的文章和官网文档整顿和思考得出的论断,如果感觉说得有情理,请点个赞,如果感觉胡言乱语请留言。本文的受众是至多曾经入门 MySQL 的 DBA。前言1. 咱们简略地温习一下半同步的原理: MySQL5.7 默认参数下咱们开启了半同步,在一个事务提交(commit) 的过程时,在 MySQL 层的 write binlog 步骤后,Master 节点须要收到至多一个 Slave 节点回复的 ACK (示意收到了binlog )后,能力持续下一个事务; 如果在肯定工夫内(Timeout)内没有收到 ACK ,则切换为异步复制模式。 这能保证数据不失落的高可用需要,因为他能保障从库确认到这个事务后,再告诉主库提交事务。这种模式下,至多一个从库的日志数据和主库保障同步,从而保障主库挂了后,数据不失落,因为最新数据的是从库。 2. 我先说一下我的半同步保证数据一致性的相干设置 sync_binlog=1innodb_flush_log_at_trx_commit=1...(等等)好了,不列出来了,我保障我半同步设置了最靠谱设置,不会因为参数设置谬误而失落数据。 3. 我再解释一下术语: lossless semi-sync replication 、无损半同步、加强半同步,都是一回事,说的是 MySQL5.7 参数rpl_semi_sync_master_wait_point=AFTER_SYNC设置下的半同步,他是默认值,解决高可用切换后的幻读问题。MySQL5.6 没有这个参数设置,这个版本在高可用切换后有概率呈现幻读,产生数据失落,那就是数据不统一。如没有特地指出,本文的"半同步" 均指的是无损半同步。 4. 而后还有一点要留神的,kill -9 主库 mysqld 和 被动 shutdown 主库 mysqld 的行为引发高可用切换是不一样,后者行为有概率会导致幻读,也就是数据失落,具体起因看这两篇文章具体理解。 《如何正确地敞开 MySQL 数据库?99%的 DBA 都是错的!》 《技术分享 | 聊聊 MySQL 关机的故事》》 5. 我确保我测试时,半同步复制没有降级为异步复制。 ...