说明:本文为论文 《Object Storage on CRAQ: High-throughput chain replication for read-mostly workloads》 的个人理解,难免有理解不到位之处,欢迎交流与指正 。
论文地址:CRAQ Paper
Chain Replication with Apportioned Queries (CRAQ) 是一种对链式复制的改进,它通过在所有对象副本上分配负载,在保持强一致性的同时极大地提高了读吞吐量。
本文主要对链式复制、CRAQ 原理以及 CRAQ 的一致性模型做出总结。
在 基于对象 的存储中,数据作为整个单元呈现给应用程序。
对象存储支持两种基本原语:
read
或 query
操作返回存储在对象名称下的数据块write
或 update
操作更改单个对象的状态对象存储更适合于平面名称空间,例如键值数据库,而不是层次目录结构。对象存储简化了支持整个对象修改的过程,通常,它们只需要考虑对特定对象的修改顺序,而不是整个存储系统。为每个对象提供一致性保证成本要低得多。
本文涉及到的两种一致性模型为:
链式复制 (Chain Replication、CR) 是一种跨多个节点复制数据的方法:
链式复制实现了 强一致性:由于所有的读操作都是在尾部进行的,而所有写操作都在尾部提交,所以链尾可以简单地对所有操作应用一个总的顺序。
链式复制的简单拓扑使得写操作比提供强一致性的其他协议消耗更小。如在 Raft 中,leader 需要将每次写操作都发送给所有的 follower ,但是 CRAQ 中,head 只需要将每一次写操作发送一次;并且 Raft 中 leader 需要处理读写操作,而 CRAQ 中的 head 只需要处理写操作。
链式复制的 故障恢复:
局限性:对一个对象的所有读取必须都要转到同一个节点,尾节点的负载很大。
CRAQ 是链式复制的一种改进,它允许链中的任何节点执行读操作:
CRAQ 每个节点可以存储一个对象的多个版本,每个版本都包含一个单调递增的版本号和一个附加属性( 标识 clean
还是 dirty
)
当节点接收到对象的新版本时(通过沿向下传播的写操作),该节点将此最新版本附加到该对象的列表中
dirty
,并向后续节点传递写操作clean
,此时写操作是 已提交
的。然后,尾节点在链中往回发送 ACK
来通知其他节点提交当对象版本的 ACK
到达节点时,该节点会将对象版本标记为 clean
。然后,该节点可以删除该对象的所有先前版本
当节点收到对象的读请求时:
CRAQ 相对于 CR 的吞吐量改进发生在两种不同情况下:
dirty
数据,因此对尾节点的查询请求比较多。但是对尾节点查询的工作负载远低于所有读请求都由尾节点来执行的工作负载,因此 CRAQ 吞吐量高于 CR。对于读操作, CRAQ 支持三种一致性模型:
若两个相邻节点之间的网络连接断开,后面的节点会想去成为头节点,这样就会产生两个头节点。
CRAQ 本身并不会解决这样的问题,所以需要外部的分布式协调服务来解决这一问题,如使用 Zookeeper 。由 Zookeeper 来决定链的组成,决定哪个节点是头、尾,并监控哪个节点出了故障。当发生网络故障时,由 Zookeeper 来决定链的新组成,而不是基于各节点对于网络情况的自身感知。
《Object Storage on CRAQ: High-throughput chain replication for read-mostly workloads》论文总结
原文:https://www.cnblogs.com/brianleelxt/p/13275647.html