Chain Replication Paper Review

March 19, 2016
Distributed System

[TOC]

本文是读完 Van Renesse R, Schneider F B. Chain Replication for Supporting High Throughput and Availability[C]//OSDI. 2004. 的总结。

Summary

Chain replication is a new approach to coordinating clusters of fail-stop storage servers.

Chain replication 采用 ROWAA (read one, write all available) 方法, 具有良好的 Scalability.

该方法目的是, 不以牺牲强一致性为代价来实现高吞吐和高可用, 从而提供分布式存储服务.

A Storage Service Interface

Clients 发送 query 或 update 操作 request

The storage service 为每个 request 生成 reply 发送会 client 告知其已经接收或已经处理完成, 从而 client 可以得知某 request 是否接收成功以及是否处理完成.

Client request type:

Client’s view of an object: ​
​ State is: ​ Hist[objId]: history of all updates to objId ​ Pending[objId]: set of pending requests for objId ​ Transitions are: ​ T1: Client request r arrives: ​ Pending[objId] += {r} ​ // 一个 client request 接收失败 = server 忽略了该 client request ​ T2: Client request r ∈ Pending[objId] ignored: ​ Pending[objId] -= {r} ​ T3: Client request r ∈ Pending[objId] processed: ​ Pending[objId] -= {r} ​ if r = query(objId, opts) then ​ reply according options opts based on Hist[objId] ​ else if r = update(objId, newVal, opts) then ​ Hist[objId] := Hist[objId] · r ​ reply according options opts based on Hist[objId]

Chain Replication Protocol

1. Assumptions: 所有服务器均假设为 fail-stop

2. Protocol Details

在 chain replication 中, 所有 servers 根据 objID 线性排列从而组成一个链表. the chain

3. Coping with Server Failures

论文中构建一个 master server, 其主要功能如下 (为区分本文将其余负责数据存储的 server 称为 data server):

论文中假设 master server 永不崩溃。而实际上该论文的 prototype 利用 Paxos 协调 master server 的各个 replicas 从而 behave in aggregate like a single process that does not fail, 以此避免单点故障.

下面仅讨论 data server 故障, 即如何在链表中的节点出现故障时保证存储服务的强一致性.主要分为以下头节点, 尾节点和中间节点三种情况.

论文中阐述了两个性质:

Head 节点故障停止: 将 Head 节点从链表中移除, 其 successor 节点称为新的 Head 节点. 旧 Head 节点已经传递的 update 操作继续传递, 而丢失的 update 操作可视为 server 忽略了该 update (如前所述等同于server 接收该 client request 失败), 因此对应的 client request 将无法接收到 reply, 此时 client 会 resend request. 不影响存储服务的强一致性.

Tail 节点故障停止: 将 Tail 节点从链表中移除, 其前继 Tail- 节点称为新的 Tail 节点. 由于 fomula, 从用户的角度看即数据变新变多了, 因此并不影响存储服务的读一致性.

中间节点故障停止: 将故障节点 S 从链表中移除, 然后 master server 首先通知故障节点的后继 S+ 节点新的链表配置, 然后通知前继 S- 节点连接后继 S+ 节点并要求其处理 中的 update request, 后序 update 操作继续传递下去, 因此也不影响存储服务的强一致性.

扩展链表: 当越来越多故障节点被移除, 链表将会缩短, 同时容错性下降.因此当链表变短时应当向链表中添加新的 servers. 理论上可以在链表的任何位置添加新 server, 但最简单的方法是在结尾添加 T+ 节点. 首先 T+ 通过复制 完成初始化, 然后 T+ 节点一边处理由 T 节点 forward 过来的 query request 一边处理 , 最后 T+ 正式作为新的 tail 节点.

Comparision to Primary/Backup Protocols

Chain replication 是 primary/backup 方法的一种改进, 实际上是一种副本管理的状态机方法.

在 primary/backup 方法中, 有一个 primary server, 负责序列化 client requests (从而保证强一致性), 然后将序列化的 client requests 或 resulting updates 分散发送到各个 backup servers, 等待接收非故障 backups 的确认信息, 最后发送 reply 给 client. 当 primary server 故障停止, 其中一个 backup server 将提升为 primary server.

相比 primary/backup 方法, Chain replication 的不同如下:

当出现 server 故障停止时, Chain replication 和 primary/backup 方法的主要时延都是检测 server failure, 其次是 recovery.

Simulation Experiments

论文在四种情况下进行实验:

Additional: Application

CRAQ 论文中介绍了基于 chain replication 的 CRAQ 系统, 该系统扩展了 chain replication protocol, 使链表上的所有节点均可处理 query 操作, 提高系统的吞吐, 同时仍然提供强一致性保证.

微软云计算平台 Windows AzureFDS 都使用 chain replication protocol 提供强一致性保证.


Reference

https://www.youtube.com/watch?v=nEbD-qutsKo

http://blog.csdn.net/yfkiss/article/details/13772669

http://blog.xiaoheshang.info/?p=883

分布式事务

March 21, 2017
Distributed System

MIT 6.824: Lab 4 Sharded KeyValue Service Implementation

September 9, 2016
Distributed System MIT 6.824

MIT 6.824: lab3 Fault-Tolerant Key/Value Service Implementation

August 6, 2016
Distributed System MIT 6.824
comments powered by Disqus