引子
GFS的三副本要求数据在三个副本都写成功,才会更新元数据,标志数据写入成功,为何不使用多数派机制呢?
这是因为,写多少乍一想非常简单,但是要设计一个正确的、可容错的、严格一致性的多数派写入方案还是非常复杂的,本文给出一个可选的写入方案。
基本背景和名词解释:
1.基本架构和GFS一致,数据流被切分为多个record,写入数据分片,数据写三副本,并存在元数据服务器,数据分片称之为Partition,主称之为primary,备称之为secondary,主写满64MB后会冻结当前Partition,再新创建一个Partition,备发现主lease超时后,即便当前Partition还未写满64MB,也会主动发起冻结。
2.要求是,冻结后的多个副本是一致的,即每个副本record的数量和内容都是一致的
实现方案:
冻结可能在两种情况下触发:
-
primary写满(比如64MB)之后,主动发起冻结
-
secondary发现primary lease过期,并且元数据也没有处于冻结状态,也会发起冻结,并补齐多数派上的数据
-
primary写满(比如64MB)之后,主动发起冻结
secondary发现primary lease过期,并且元数据也没有处于冻结状态,也会发起冻结,并补齐多数派上的数据
为了在这一分布式事件中保持数据的一致性和完备性,并说明其正确性,还需引入paxos算法,下面对这一过程和paxos的对应关系和代码简要设计说明:
-
paxos实例
在写入数据到三副本以及冻结的过程中,每个record就是一个实例,每个实例之间是没有关系的,实例的集合是recondid属于[0, 无穷大)