1 故障检测
2 选举算法
考虑的第一个因素是哪个成员运行的是最低的 MySQL 版本。如果所有成员都运行 MySQL 8.0.17 或更高版本,那么组成员将首先按照发布的补丁版本进行排序。如果任何成员运行 MySQL 8.0.16 或更低的版本,成员将首先按其发布的主要版本排序,并忽略补丁版本。低版本优先是考虑到高版本同步到低版本,高版本可能有一些新特性,无法在从库正常回放,导致同步出现问题。 如果有多个成员运行最低的 MySQL 版本,则要考虑的第二个因素是每个成员的权重,由参数 group_replication_member_weight 指定。如果 MySQL 的版本为 5.7,则该参数不可用,将不考虑这个因素。系统变量 group_replication_member_weight 指定一个范围为 0-100 的数字。值越大,权重越高。 如果前面两个因素都一样,则考虑的是,每个成员生成的服务器 UUID 的词法顺序,如果 server_uuid 系统变量都指定了,则选择 UUID 排序最靠前的成员作为主。
3 故障转移
可靠性优先:如果有积压的事务,需要等积压的事务全被应用完,才能在新主上进行读写操作。 可用性优先:不管是否有积压的事务,直接在新主上进行读写操作。
4 视图
5 流控
证书队列中等待的事务数超过 group_replication_flow_control_certifier_threshold 配置的值时。 应用程序队列中等待的事务数超过 group_replication_flow_control_applier_threshold 配置的值时
6 事务执行流程

事务写 Binlog 之前会进入到 MGR 层; 事务消息通过 Paxos 广播到各个节点; 在各个节点上进行冲突检测(冲突检测详细过程会在稍后介绍); 认证通过后本地节点写 Binlog 完成提交; 其他节点写 Relay Log 后并完成回放。
7 冲突检测
首先计算出对 write set(write set 的组成是:索引名 + DB 名+ DB 名长度 + 表名 + 表名长度 + 构成索引唯一性的每个列的值 + 值长度) 做 murmur hash 算法的值,判断这个值在 certification_info 是否有相同的记录,有则表示冲突,事务回滚,没有则会把 write set 写入 certification_info ,并进行下一步。 然后判断事务执行时执行节点的 gtid_executed 和 certification_info 里面对应的 gtid_set。 如果 gtid_executed 是 gtid_set 的子集,说明该节点的事务执行时,其他节点已经对事务操作的数据进行了更改,则不能进行更新,事务回滚。 如果 gtid_executed 不是 gtid_set 的子集,表示其他节点没有对事务操作的数据有修改操作,则事务可以正常提交。
CREATE TABLE db1.t1 (i INT NOT NULL PRIMARY KEY, j INT UNIQUE KEY, k INT UNIQUE KEY);
INSERT INTO db1.t1 VALUES(1, 2, 3);
i -> PRIMARYdb13t1211 => PRIMARY 是主键名 (由主键生成的 write set)j -> jdb13t1221 => 'j' 是索引名 (由第一个唯一索引生成的 write set)k -> kdb13t1231 => 'k' 是所有名 (由第二个唯一索引生成的 write set)

文章转载自MySQL数据库联盟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




