作者:杨涛涛
资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
来源于客户的一个问题。客户对组复制的数据一致性保障机制非常困惑,一直不太明白,其实就是对组复制参数 group_replication_consistency
几个值的含义不太清楚。这里我举了几个简单的例子,来说明这个参数包含的几个选项的真实含义。
一、概念
组复制的概念:组复制是 MySQL 基于传统的主从复制开发的一个插件。这个插件改善了原生主从复制的一些重大功能缺陷,诸如数据一致性监测管理、自动冲突监测、自动故障监测、自动收缩扩容节点、自动数据回补等等。
组复制功能自 MySQL 5.7 发布到现在最新版 MySQL 8.0.20,经历了各种缺陷修复、功能升级,目前已经比较完善。
参数 group_replication_consistency
共 5 个值可选:
1. EVENTUAL:确保最终一致性,并不能保证数据实时同步。(MySQL 8.0.14 之前只有这一个选项)
2. BEFORE:确保本地强一致性,并不保证其他节点数据实时同步。
3. AFTER:确保全局强一致性,可以保证所有节点数据实时同步。
4. BEFORE_AND_AFTER:最高级别,确保本地强一致性,全局强一致性。结合 BEOFRE 和 AFTER 的特性。
5. BEFORE_ON_PRIMARY_FAILOVER:确保从节点晋升为主节点后的本地一致性。
接下来,在组复制的默认模式下讨论 EVENTUAL,BEFORE,AFTER 这三类值的含义以及使用场景。
二、环境准备
debian-ytt1:3306(写节点,简称节点 1)
debian-ytt2:3306(读节点,简称节点 2)
debian-ytt3:3306(读节点,简称节点 3)
以下为集群 ytt_mgr 的状态,节点 1 为主,节点 2 和节点 3 为从。
MySQL debian-ytt1:3306 ssl ytt Py > c1 = dba.get_cluster('ytt_mgr');
MySQL debian-ytt1:3306 ssl ytt Py > c1.status();
{
"clusterName": "ytt_mgr",
"defaultReplicaSet": {
"name": "default",
"primary": "debian-ytt1:3306",
"ssl": "REQUIRED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"debian-ytt1:3306": {
"address": "debian-ytt1:3306",
"mode": "R/W",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.20"
},
"debian-ytt2:3306": {
"address": "debian-ytt2:3306"