Paxos
可靠分布式系paxos的直
2015-07-02 @drdrxp
背景
多个点一起完成一件事情.
分布式中唯一的一个问题某事达成一致.
Paxos: 分布式系的核心算法.
1. 问题
2. 复制策略
3. Paxos 算法
4. Paxos
问题
的需求:
持久性要达到:99.99999999%
可以用的基础设:
: 4% 坏率
器宕机时间: 0.1% 或更
IDC间丢包率: 5% ~ 30%
解决方案(可能)
多副本
x<n个副本坏不会数据
多副本的可靠性:
1 副本: ~ 0.63%
2 副本: ~ 0.00395%
3 副本: < 0.000001%
n 副本: = 1 - x^n /* x = 副本坏率 */
解决方案.
如何复制’?
除了副本数之外,:
可用性
原子性
一致性
...
的复制算法
主从异步复制
主从同步复制
主从半同步复制
多数派写(
Mysqlbinlog复制.
1. 主接到写.
2. 主写入本磁.
3. ‘OK’.
4. 主复制数据到从.
如果磁在复制前坏:
数据.
主从异步复制
Time
MasterClient Slave.1 Slave.2
Disk Failure
主从同步复制
1. 主接到写.
2. 主复制日志到从.
3. 库这时可能阻塞...
4. 端一直在等’OK’,直到
所有从返回.
一个失联节点造成整个系
不可用.
: 没有数据.
: 可用性降低.
Time
MasterClient Slave.1 Slave.2
主从半同步复制
1. 主接到写.
2. 主复制日志到从.
3. 库这时可能阻塞...
4. 如果1<=x<=n个从返回‘OK’
返回客‘OK’.
: 高可靠性.
: 高可用性.
: 可能任何从都不完整
需要 多数派写()
Time
MasterClient Slave.1 Slave.2
多数派写
Dynamo / Cassandra
端写入W >=N/2+1.
不需要主.
多数派:
W + R > N; R >= N/2+1
容忍最多(N-1)/2.
Time
Node.1Client Node.2 Node.3
多数派写. 后写入优胜
最后1次写入覆盖先前写
.
所有写入操作需要有1个全
序:时间
Time
Node.1Client Node.2 Node.3
: 高可靠性.
: 高可用性.
: 数据完整性有保.
多数派写..
多数派写... W + R > N
一致性:
一致性
:
非原子更新
脏读
更新问题
http://en.wikipedia.org/wiki/Concurrency_control
一个假想存
一个有3个存储节点的存集群.
使用多数派写的策略.
只存1“i”.
“i” 的每次更新对应有多个版本: i1, i2, i3…
个存支持3个命令:
get /* 最新的 “i” */
set <n> /* 置下个版本的i值为 <n> */
inc <n> /* “i” <n>,也生成1个新版本 */
将用个存来演示多数派写策略的不足,
以及如何用paxos解决问题.
一个假想存.实现
命令实现
"set" → 直接对应多数派写.
"inc" → (简单的事型操作):
1. 多数派取最新的 “i”: i1
2. Let i2 = i1 + n
3. set i2
X
set i2=3
X
get i
2
1
2
1
0
0
3
2
2
1
3
2
X
get i1=2
i2 = i1 + 1
3
2
2
1
3
2
set i2=3
OK
set i2=4
一个假想存..发问题
X
X
get i
2
1
2
1
0
0
3
2
2
1
3
2
5
3
2
1
5
3
X
get i1=2
i2 = i1 + 1
期待最X可以i3=5,
需要Y能知道X写入了i2。如何实现这个机制?
Y
get i1=2
Y
i2 = i1 + 2
3
2
2
1
3
2
时为了保正确,Y重新运行多数派 ,然后再行一次多数派写
1Y
X写入的
失。
一个假想存...
XY2“inc”操作后,了得到正确的i3
整个系i的某个版本(i2),只能有1次成功写入.
推广:
在存中,一个(1量的1个版本)在被认为确定
(端接到OK)之后,就不允被修改().
如何定被确定的”?
如何避免修改被确定的?
如何确定一个
X
Y
Any value set?
X
No
XX -
---
Any value set?
---
Y
Yes, Y gives up
X
XX -
XX -
方案: 每次写入一个前,先运行一次多数派,来确
(可能)已被写.