Paxos协议是用来解决分布式事务分歧的,以Mgr的多个节点为例,如果多个节点只有一个写节点(主),是不存在分布式事务的;如果多个节点同时写入,就可能会有分歧,在同一时刻A节点要修改账户增加100块,B节点同时要修改账户增加200块,这个账户就会有疑惑,到底是听A的还是听B的,还是两个同时听还是干脆两个都不听,这里有矛盾了,因此Paxos分布式协议就可以完美的解决这个分歧。

先看看Paxos的原始定义:

1.Only a value that has been proposed may be chosen,只有被提出(Propose)的值才可能被最终选定(Chosen)

2.Only a single value is chosen, and 只有一个值会被选定

3.A process never learns that a value has been chosen unless it actually

has been. 进程只会获知到已经确认被选定(Chosen)的值

这一段晦涩难懂,在研读完Mysql Mgr源码之后,我来根据Mgr Xcom的协议把这段话翻译一下:Mgr多个节点初始状态是一致的,如果不一致可以通过clone插件重置为一致状态。

多写模式下,任何一个节点都可以提议修改状态机,既从一个一致状态转换到另一个一致状态。

如果要修改状态机,必须获得一个提议号,提议号单调递增,一致状态的推进严格遵循提议号,前一个提议的状态更改未完成,不能提前执行和应用下一个提议。

一个提议,根据多数派协议来获得批准,不同节点相同的提议号以票号大的提议为准,最终所有节点学习到的内容是票号最大的那份内容。

票数相同,票号大的取胜;票数和票号相同,节点号大的的取胜。

为了提高并发,可以同时发起多个提议,但是提议是有先后顺序,因此,状态机的更迭也是有先后顺序,不允许提前消费。

多个提议对于同一条数据修订需要进行certify校验,既全局冲突检查,防止多个节点提议号不同,但是修订同一条记录而破坏事务的一致性。

有了这些理论保障,我们看看之前提出的分布式事务是如何避免分歧的。

一句话概括MGR三个节点提议和执行顺序,提议号由(msgno,node)组成,提议执行顺序order by msgno,node,例如:(80,0) (79,1) (79,2);0号节点提议号最大执行顺序最晚,1号节点提议号最小最先执行;如果同时提议,则按照提议顺序执行,期间会进行certify校验;如果只有一个节点提议,则小于这个提议号的提议都会忽略,并产生新的提议顺序。详细如下:

0号节点提议之后的表现:(81,0) (81,1) (81,2)

1号节点提议之后的表现:(80,0) (79,1) (79,2)

2号节点提议之后的表现:(80,0) (80,1) (79,2)

/*

Certify transaction.

*/

seq_number = //冲突检查,如果并为MGR产生GTID

cert_module->certify(tcle->get_snapshot_version(), tcle->get_write_set(),

!tcle->is_gtid_specified(), tcle->get_server_uuid(),

gle, local_transaction);

/**

Conflict detection is performed when:

1) group is on multi-master mode;

2) group is on single-primary mode and primary is applying relay logs with transactions from a previous primary.

*/

Certify()

if (conflict_detection_enable) {

for (std::list::iterator it = write_set->begin();

it != write_set->end(); ++it) {

Gtid_set *certified_write_set_snapshot_version =

get_certified_write_set_snapshot_version(*it); //找出写集在本节点的gtid,既从certification_info map中查找历史认证过的gtid

//it = certification_info.find(item_str); return it->second;

/*

If the previous certified transaction snapshot version is not

a subset of the incoming transaction snapshot version, the current

transaction was executed on top of outdated data, so it will be

negatively certified. Otherwise, this transaction is marked

certified and goes into applier.

Snapshot_version mysql_bin_log.get_gtid_executed(sid_map, snapshot_version)

*/

if (certified_write_set_snapshot_version != NULL &&

!certified_write_set_snapshot_version->is_subset(snapshot_version))// snapshot_version来源于TCLE,当组复制钩子函数group_replication_trans_before_commit被执行时,带入当时执行节点的gtid快照;如果写集GTID为空,表示全新的写集,则继续执行,如果写集GTID不为空,是snapshot_version的子集,表示历史认证过,则继续执行;如果不是snapshot_version子集,说明这个写集有冲突不能使用,本地对某条记录执行过存在gtid,远程快照中不包含这个gtid,却要求修改同一条数据,对于本地事务处理,此时回滚本地事务,保留远程事务;对于远程事务处理,直接抛弃掉,不写入apply log。

goto end;

}

result = get_group_next_available_gtid(member_uuid);//从group_gtid_executed获取gtid,group_gtid_executed是一个全局的统一的视图,所有member保持一致,所以mgr产生的gtid都是全局唯一的

/*

Add generated transaction GTID to transaction snapshot version.

*/

snapshot_version->_add_gtid(get_group_sidno(), result);//写入最新的GTID到snapshot_version

//typedef std::unordered_map<:string gtid_set_ref> Certification_info;

//将写集的gtid写入本地的认证的数据结构Certification_info中

for (std::list::iterator it = write_set->begin();

it != write_set->end(); ++it)

{

certification_info.insert(std::pair<:string gtid_set_ref>(key, snapshot_version))

}

实验环节:

实验1:节点0,节点1同时执行相同记录,写冲突

实验2:节点0,节点1同时执行不同记录,并发执行

paxos整合mysql_Mysql Mgr与Paxos协议相关推荐

  1. paxos整合mysql_微信开源PhxSQL:高可用、强一致的MySQL集群(转载)

    作者: 陈俊超(junechen@tencent.com),微信后台高级工程师,主要负责微信后台核心模块的分布式架构设计和开发.早期负责微信附近的人,摇一摇,朋友圈,群聊等基础架构.现专注于PhxSQ ...

  2. mgr未同步 mysql_MySQL MGR 节点管理及故障切换

    MySQL MGR 节点管理及故障切换 MySQL Group Replication(MGR)框架让MySQL具备了自动主从切换和故障恢复能力. 本文介绍节点管理及故障切换: 1)MGR节点管理及故 ...

  3. Springboot 整合 WebSocket ,使用STOMP协议+Redis 解决负载场景问题(二)

    前言 上一篇,简单给大家整合了一下websocket,使用stomp方式. 这篇,就是考虑到单体的服务使用websocket ,按照上一篇的整合,确实没问题. 但是如果一旦是负载多台服务的时候,那么就 ...

  4. mgr mysql_MySQL MGR集群搭建

    本文来自网易云社区,转载务必请注明出处. 本文将从零开始搭建一个MySQL Group Replication集群,包含3个节点.简单介绍如何查询MGR集群状态信息.并介绍如何进行MGR节点上下线操作 ...

  5. mgr未同步 mysql_MySQL MGR如何修复数据不一致的节点

    1.在当前主节点创建全量备份(MySQLdump或xtrabackup): # /usr/bin/innobackupex --defaults-file=/etc/my.cnf --user=roo ...

  6. 超详细解析 | 一致性协议算法-2PC、3PC、Paxos、Raft、ZAB、NWR

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/VMW9 背景 在常见的分布式系统中, ...

  7. 一致性协议算法-2PC、3PC、Paxos、Raft、ZAB、NWR超详细解析

    背景 在常见的分布式系统中,总会发生诸如机器宕机或网络异常(包括消息的延迟.丢失.重复.乱序,还有网络分区)等情况. 一致性算法需要解决的问题就是如何在一个可能发生上述异常的分布式系统中,快速且正确地 ...

  8. 分布式一致性协议paxos

    Paxos协议/算法是分布式系统中比较重要的协议,它有多重要呢? <分布式系统的事务处理>: Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就 ...

  9. 理解分布式一致性:Paxos协议之Cheap Paxos Fast Paxos

    理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos Cheap Paxos Message flow: Cheap Multi-Paxos Fast Paxos ...

最新文章

  1. Azure实践系列 1:部署和基本配置Azure AD
  2. 新建arcgis api for android 项目失败
  3. 一文带你学会基于SpringAop实现操作日志的记录
  4. python语言是编译型语言-Python程序的执行过程原理(解释型语言和编译型语言)...
  5. 关于产品 / 市场契合点 PMF 的 12 个问题全解读(上)
  6. oracle 12c dg新特性,oracle 12c:新特性-网格(Grid)基础架构的增强
  7. 回调函数 —— 借助中间通用函数(形参里有函数指针,实现函数注册)调用不同的回调函数 (多态/分层)
  8. 人工神经网络_制作属于自己的人工神经网络
  9. 如何用php查不同,php-MySql调查不同查询
  10. python在json文件中查找指定数据_Python中json的取值 如何使用python提取json中指定字段的数据...
  11. 1438. 绝对差不超过限制的最长连续子数组
  12. 潘多拉PandoraBox官网下载地址
  13. bigemap 软件功能对比
  14. 单片机延时函数移植问题
  15. 60个有趣的经济学定律!
  16. 灵魂 我·将·归·来·开·放
  17. 我的世界服务器的启动器在哪个文件夹,原神启动器在哪 启动器位置文件介绍...
  18. 网络工程——软科中国大学专业排名
  19. 《龙芯生态白皮书(2022年)》发布,全方位展示LoongArch生态发展最新成果
  20. 采油高级工实际计算机,采油工高级实际管柱图.ppt

热门文章

  1. Pytorch model.train()
  2. Caused by: java.sql.SQLException: ORA-00918: column ambiguously defined
  3. kubespray部署Kubernets集群
  4. tensorflow中Dataset.shuffle函数的buffer size的含义解读
  5. UVA-673:Parentheses Balance踩坑
  6. ASIO插件 真的能提升 音质?(听音乐者必看)
  7. 如何利用GitHub发布个人网站
  8. 虚拟机浏览器花屏空白问题
  9. mac 装oh my zsh
  10. 计算圆环面积的c语言程序,C0610求圆环面积_C语言程序设计源代码_doc_大学课件预览_高等教育资讯网...