作者 张彦东 · 沃趣科技数据库技术专家
出品 沃趣科技
01 多主模式
在多主模式下(group_replication_single_primary_mode = OFF),所有成员不会区分primary和standby角色。加入该组时,与其他组成员兼容的任何成员都被设置为读写模式,并且可以处理写事务,即使它们是并发执行的。
如果组复制中的某个成员停止接受写事务,例如,在某个节点意外宕机的情况下,可以将与其连接的客户端重定向或故障转移到处于读写模式的任何其他健康的成员。组复制本身不处理客户端故障转移,因此需要使用中间件框架(例如MySQL Router 8.0,代理,连接器或应用程序本身)来实现。下图说明了MGR集群的多主模式下故障转移的实现:
组复制在集群内保证了系统的最终一致性。一旦入栈流量减少,所有组成员将具有相同的数据内容。当流量在集群内部下发时,事务可以在某些成员之间先进行持久化,特别是如果某些成员的写入吞吐量小于其他成员的情况下,则可能导致性能差的节点上读取到旧数据。在多主模式下,写入速度较慢的成员还可能积压过多的事务,从而导致更大的冲突和认证失败风险。为了避免这些问题,可以针对不同的业务场景使用组复制自带的流控机制,以最大程度地减少不同成员之间的事务差异。关于MGR的流控机制,我们在后面进行详细讨论。从MySQL 8.0.14开始,如果要为集群中的每个事务都拥有一个事务一致性保证,则可以使用group_replication_consistency系统变量来做到这一点。可以选择适合集群工作负载和数据读写优先级的设置,同时考虑到提高一致性整个集群对性能的影响。还可以为单个会话设置该系统变量,用来保护特别是对并发敏感的事务。有关事务一致性的更多信息,我们在后面的章节详细描述。
02 事务描述 当MGR集群是以多主的模式在线上运行时,集群通过以下两条原则对不同成员之间的事务进行严格的一致性检测,以保证这些事务可以在集群内提交成功: 1.如果在SERIALIZABLE隔离级别下执行事务,则在集群中同步数据时,该事务将提交失败。 2.如果事务是针对具有具有级联约束的外键的表执行的,则在集群中同步数据时,该事务将提交失败。group_replication_enforce_update_everywhere_checks系统变量控制上述行为。在多主模式下,通常应将系统变量设置为ON,但是可以选择将系统变量设置为OFF来禁用检查。在单主模式下部署时,必须将系统变量设置为OFF。
如果对同一对象进行更改(使用DDL)并更改对象包含的数据(使用DML),则需要通过同一个节点处理更改,而DDL操作尚未完成并在各处复制。否则,当操作中断或仅部分完成时,可能导致数据不一致。如果集群以单主服务器模式部署,则不会发生此问题,因为所有数据更改都是通过同一个节点(主节点)执行的。
在具有使用不同MySQL Server版本的成员的多主模式下运行的集群中,组复制会自动管理运行在MySQL 8.0.17或更高版本的成员的读写状态和只读状态。如果成员离开集群,则运行当前最低版本的成员将自动设置为读写模式。当使用group_replication_switch_to_multi_primary_mode自定义函数时,将以单主模式运行的组更改为以多主模式运行时,组复制会自动将成员设置为正确的模式。如果新增成员运行的MySQL版本高于组中存在的最低版本的成员,则该成员将自动置于只读模式,而运行最低版本的成员将处于读写模式。
虽然MGR插件内置了很多自动化功能。但有时可能需要了解幕后发生了什么。如果有需要,可以通过performance_schema下的表查询集群的整个状态(包括视图、冲突统计信息和服务状态等)。复制协议的分布式特性、以及组成员在事务和元数据上的一致性,要求组内的一些元数据和状态信息在组内所有成员间相互同步,这就使得检查组的状态等信息变得更加简单。你只需要连接到集群内的任意一个成员中,并通过performance_schema下的相关复制状态信息表执行select语句进行查询,就可以获取到组相关的本地和全局信息。有关更多信息,我们放在MGR状态监控中会详细讨论。
MGR的总体架构图如下:
MGR 插件包含一组用于捕获,应用和生命循环的API,这些API控制着MGR插件如何与MySQL Server交互。这些接口是放置在事务执行管道中的一些钩子(它们将MySQL Server的核心与MGR插件隔离开来),逻辑上将MySQL Server内核与MGR插件隔离开来。其中有一些接口提供把通讯信息从Server发送给MGR插件(例如:Server启动、恢复、接受连接以及Server即将提交事务的事件通知),有一些接口提供把通讯信息从MGR插件发送给MySQL Server(例如:MGR插件命令MySQL Server提交、终止一个正在执行的事务,或者让该事务写入relay log中排队等候处理)。 在这些API的下一层,是一组组件(capture、applier、Recovery),组复制中的三个核心模块,当上层API发生调用,将根据调用类型路由到下面这三个模块执行相应的逻辑: capture 组件负责跟踪与正在执行的事务相关的上下文信息。 applier 组件负责在数据库上应用远程事务,其实就是读取relay log中数据进行回放。 Recovery 组件管理数据库节点的分布式恢复相关的工作,以及负责在一个新的Server加入集群时选择一个引导节点,协调新加入节点的数据追赶的更新步骤(包括相关的数据回追,失败处理等),以及对选择引导节点失败之后做出一些响应。简而言之就是管理集群成员的recovery。 继续沿着堆栈向下,复制协议模块包含复制协议中的一些特定逻辑。例如:处理冲突检测,接收和传播事务到集群中。 MGR 插件体系结构的最后两层是组通信系统(GCS) API和基于paxos的组通信引擎(XCom)的实现。GCS API是一个高级API,它抽象了构建复制状态机所需的属性,具体属性我们在前文已经描述过了。因此,它将消息层的实现与插件的其余上层组件解耦。组通信引擎处理与复制组成员之间的通信,主要提供基于Paxos协议的变体实现数据一致性的核心功能。 | 作者简介 张彦东·沃趣科技数据库工程师 MySQL爱好者,熟悉MySQL体系结构,擅长MySQL故障诊断和排查,喜好钻研开源技术,热衷于MySQL及其周边技术分享。相关链接
MySQL 一个让你怀疑人生的hang死现象
集群架构(单主模式)——基础篇
组复制背景:初识MGR---基础篇
MySQL权限表损坏导致无法启动
K8S服务暴露: HAProxy在RDS场景下的妙用
深入浅出Zookeeper(五):Leader选举
深入浅出Zookeeper(四):客户端的请求在服务器中经历了什么
深入浅出Zookeeper(三):Watch实现剖析
组复制常见疑问 | 全方位认识 MySQL 8.0 Group Replication
组复制要求和限制 | 全方位认识 MySQL 8.0 Group Replication
组复制系统变量 | 全方位认识 MySQL 8.0 Group Replication
组复制升级 | 全方位认识 MySQL 8.0 Group Replication
组复制性能 | 全方位认识 MySQL 8.0 Group Replication
组复制安全 | 全方位认识 MySQL 8.0 Group Replication
组复制常规操作-使用xtrabackup备份恢复或添加组成员 | 全方位认识MySQL8.0 Group Replication
组复制常规操作-网络分区&混合使用IPV6与IPV4 | 全方位认识 MySQL 8.0 Group Replication
组复制常规操作-分布式恢复 | 全方位认识 MySQL 8.0 Group Replication
组复制常规操作-事务一致性保证 | 全方位认识 MySQL 8.0 Group Replication
组复制常规操作-在线配置组 | 全方位认识 MySQL 8.0 Group Replication
再述mysqldump时域问题
揭秘 MySQL 主从环境中大事务的传奇事迹
MySQL 执行DDL语句 hang住了怎么办?
手把手教你认识OPTIMIZER_TRACE
MySQL行级别并行复制能并行应用多少个binlog group?
binlog server还是不可靠吗?
MySQL binlog基于时间点恢复数据失败是什么鬼?
MySQL高可用工具Orchestrator系列六:Orchestrator/raft一致性集群
MySQL高可用工具Orchestrator系列五:raft多节点模式安装
MySQL高可用工具Orchestrator系列四:拓扑恢复
MySQL高可用工具Orchestrator系列三:探测机制
select into outfile问题一则
开源监控系统Prometheus的前世今生
prometheus监控多个MySQL实例
prometheus配置MySQL邮件报警
MySQL问题两则
Kubernetes scheduler学习笔记
直方图系列1
执行计划-12:基数反馈
执行计划-11:真实数据
执行计划-10:猜想
执行计划-9:多倍操作
执行计划-8:成本、时间等
大数据量删除的思考(四)
大数据量删除的思考(三)
日志信息记录表|全方位认识 mysql 系统库
复制信息记录表|全方位认识 mysql 系统库
时区信息记录表|全方位认识 mysql 系统库
Oracle RAC Cache Fusion系列十八:Oracle RAC Statisticsand Wait Events
Oracle RAC Cache Fusion 系列十七:Oracle RAC DRM
Oracle RAC CacheFusion 系列十六:Oracle RAC CurrentBlock Server
更多干货,欢迎来撩~