这篇文章关于两阶段提交和Paxos讲的很好
http://blog.chinaunix.net/uid-16723279-id-3803058.html

点评:2PC绝对是CP的死党,是分布式情况下强一致性算法,因此缺点也是很明显的,
单点coordinator是个严重问题:
没有热备机制,coordinator节点crash了或者连接它的网路坏了会阻塞该事务;
吞吐量不行,没有充分发动数量更多的participants的力量,一旦某个participant第一阶段投了赞成票就得在他上面加独占锁,其他事务不得介入,直到当前事务提交or回滚
注:3PC能解决coordinator和participants都挂掉的情况。
paxos
Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。
算法的核心过程分为两阶段:
prepare阶段:
a:proposer 选择一个提案编号 n 并将 prepare 请求发送给 足够多的acceptors
b:acceptor 收到 prepare 消息后,如果提案的编号大于它已经回复的所有 prepare 消息,则 acceptor 将自己上次接受的提案[2b]回复给 proposer,并承诺不再回复小于 n 的提案
accept阶段:
a:当一个 proposor 收到了 acceptors 对 prepare 的回复后,就进入批准阶段。它要向回复 prepare 请求的 acceptors 发送 accept 请求,包括编号 n 和一个suitable value(下文会讲这个value的来头)
b:在不违背自己向其他 proposer 的承诺[1b]的前提下,acceptor 收到 accept 请求后丢弃曾经accept过的value[2b]接着接受这个请求并持久化
本来还有第三阶段:proposer最终提交事务,它跟2PC的第二阶段基本一样:proposer收到过半的accept后向所有acceptor发布最终的决议(有的实现版本是由learner负责统计accept票数并发布决议,这里为了跟2PC作比较不特别区分)
proposer选择一个会自增的编号n,这个编号可以由一个统一的机构颁发,但是一定得保证从这里取得的编号是自增且唯一的(即多个proposer取到的编号存在时序关系);
名词解释
一个锁:当acceptor收到prepare消息后,当且仅当这是它见过的最大的编号n时,持久化该n,并将最近一次接受提案的value返回给propose,并加锁:在1b阶段只回复大于n的prepare消息,2b阶段不接受小于n的accept请求,对于大于n的的accept请求会被接受并导致该acceptor之前所接受过的value被清空
suitable value:proposer收到足够多的prepare回复后,会决定出一个suitable value作为提案:在1b中如果收集到的每一种回复都不能形成多数派,也就是说acceptor的情况有点类似乌合之众,那么proposer就可以按照它的意愿来进行投票,即可以任意设置suitable value;如果收集到的某种value过半了,则将这个value作为suitable value发起accept请求
总结
paxos虽然也是分布式情况下强一致性算法,但他在2PC上至少有两点改进
不存在说网路问题导致事务阻塞甚至失败,尤其是连接coordinator的,因为paxos的角色是可以互串的,必要时participant也能充当coordinator
加在任何一个在1b2b阶段投了赞成票的participant上的锁是可以被砸开的:只要新提案的编号更大,这样就提高吞吐量了,当然频繁的产生新proposer可能会导致活锁:永远无法达成协议,最好设置一个超时机制,过了一定的时间才产生一个proposer
这篇文章关于两阶段提交和Paxos讲的很好的更多相关文章
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 转载
1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接 ...
- 分布式事务、XA、两阶段提交、一阶段提交
本文原文连接:http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的分布式事务的规范 ...
- 分布式事务 & 两阶段提交 & 三阶段提交
可以参考这篇文章: http://blog.csdn.net/whycold/article/details/47702133 两阶段提交保证了分布式事务的原子性,这些子事务要么都做,要么都不做. 而 ...
- MySQL binlog 组提交与 XA(两阶段提交)--1
参考了网上几篇比较靠谱的文章 http://www.linuxidc.com/Linux/2015-11/124942.htm http://blog.csdn.net/woqutechteam/ar ...
- XA: 事务和两阶段提交
本文原文连接:http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的两阶段提交协议, ...
- 基于两阶段提交的分布式事务实现(UP-2PC)
引言:分布式事务是分布式数据库的基础性功能,在2017年上海MySQL嘉年华(IMG)和中国数据库大会(DTCC2018)中作者都对银联UPSQL Proxy的分布式事务做了简要介绍,受限于交流形式难 ...
- 聊一聊 MySQL 中的数据编辑过程中涉及的两阶段提交
MySQL 数据库中的两阶段提交,不知道您知道不?这篇文章就简单的聊一聊 MySQL 数据库中的两阶段提交,两阶段提交发生在数据变更期间(更新.删除.新增等),两阶段提交过程中涉及到了 MySQL 数 ...
- 全网最牛X的!!! MySQL两阶段提交串讲
目录 一.吹个牛 二.事务及它的特性 三.简单看下两阶段提交的流程 四.两阶段写日志用意? 五.加餐:sync_binlog = 1 问题 六.如何判断binlog和redolog是否达成了一致 七. ...
- 分布式事务(一)两阶段提交及JTA
原创文章,同步发自作者个人博客 http://www.jasongj.com/big_data/two_phase_commit/ 分布式事务 分布式事务简介 分布式事务是指会涉及到操作多个数据库(或 ...
随机推荐
- 洛谷P1040 加分二叉树(区间dp)
P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...
- selenium3 + python - cookie定位
from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitimport time d ...
- 知识总结1:debug命令汇总(一)
-r 得到当前寄存器状态或修改寄存器状态 -d 跳到默认(CS:IP指定的地址)区间 -d 段地址:偏移地址 跳到(段地址*+偏移地址)区间 -d 段地址:起始偏移地址 终止偏移地址 跳到(段地址*+ ...
- CentOS6 在线安装PostgreSQL10
本文主要通过实际案例介绍如何在CentOS6环境中在线安装PostgreSQL10,安装环境需具备能够使用yum在线安装功能.具体安装步骤如下, 1 下载对应版本的PGDG文件 从https://yu ...
- Redis 字符串结构和常用命令
字符串是 Redis 最基本的数据结构,它将以一个键 和一个值 储存在 Redis 内部. 字符串的一些基本命令 命令 说明 备注 set key value 设置键值对 最常用的写入命令 get k ...
- 有关css的选择器优先级以及父子选择器
css,又称样式重叠表,如今的网页的样式基本是div+css写出来的,功能十分强大,要想在html文件中引入css文件需要在<head></head>标签内输入一行:<l ...
- java编程基础篇-------> 从键盘输入一位整数,代表月份,编程判断指定月份属于一年中的哪个季度。如果是 12 月、1 月、2 月,就属于冬季。
从键盘输入一位整数,代表月份,编程判断指定月份属于一年中的哪个季度.如果是 12月.1 月.2 月,就属于冬季:如果是 3 月.4 月.5 月,就属于春季:如果是 6 月.7 月.8 月,就属于夏季: ...
- 使用OpenCV画折线图
使用OpenCV画直方图是一件轻松的事情,画折线图就没有那么Easy了,还是使用一个库吧: GraphUtils 源代码添加入工程 原文链接:http://www.360doc.com/content ...
- OpenCV:使用 随机森林与GBDT
随机森林顾名思义,是用随机的方式建立一个森林.简单来说,随机森林就是由多棵CART(Classification And Regression Tree)构成的.对于每棵树,它们使用的训练集是从总的训 ...
- appium处理app与web页面的转换
测微信页面的时候使用谷歌app,进入微信页面的链接 def setUp(self): print("set up env for android testing...") se ...