Kudu Consensus Design

kudu一致性设计

该文档已经过期了,请参考
Raft: In Search of an Understandable Consensus Algorithm. D. Ongaro and J. Ousterhout. 2014 USENIX Annual Technical Conference (USENIX ATC 14). 2014.
https://www.usenix.org/system/files/conference/atc14/atc14-paper-ongaro.pdf
http://thesecretlivesofdata.com/raft/
根据自己对kudu的理解,翻译了部分kudu的设计文档,仅供自己加深理解,如果有翻译不对的地方或者理解有误的地方,欢迎指正。

wal

wal提供严格的顺序写和持续性保证

1.写入数据如果是外部同步的,提交请求的顺序会与最终写入到磁盘的顺序一致
2.如果设置了log_force_fsync_all=enabled(默认disabled),每个写入请求保证数据写入磁盘后才返回成功。
为了提高多线程的大规模数据写入性能,同时保持稳定的延迟,log采用group commit。

基本的wal使用

一次log操作(insert或者update),首先请求需要回去lock,一系列操作后得到写入数据的指针(&entry_batch)。然后请求会释放lock,同时调用AsyncAppend方法,该方法传入目标指针和append数据的回调函数,在lock之外执行序列化和复制。
参见样例local_consensus.cc 和 mt-log-test.cc。

group commit实现细节

目前是通过一个阻塞队列entry_queue_(log.h)和一个独立的线程AppendThread(log.cc)。队列通过lock同步的,且只有一个线程去消费它,消费的顺序是先进先出。队列的长度依赖于entries的数量,但最终会转化成entries的bytes形式的长度。(entries有两种类型一种是replicates一种是commits)。

为entry分配空间

目前Reserve()每次都会为新进来的entry在堆栈中分配空间,并通过一个枚举状态标记为”reserved”,然后把entry扔进上边提到的队列当中。为了不必每次都要分配空间,未来可能会使用环形缓冲区或者其他数据结构替代队列这种方式。

拷贝entry内容到分配的空间

AsyncAppend()序列化entry内容到entry自身内部的一个缓冲区(创建entry对象时已经非配了该空间,参见log.h LogEntryBatch类 Serialize()),这种方式避免了共享缓冲区冲突。

同步entry内容至磁盘

一旦队列有entry进入,且当entry被标记为ready时(拷贝entry内容到buffer完成),appender线程就会消费该entry,将这个entry保存到当前的log segment,而不是直接写入底层文件。
注意:此处后续会使用AppendVector()即一个vector来消费所有可消费的entries。
一旦所有entry被成功保存了,appender线程会同步segment到磁盘。

segment文件和它的异步分配

Log使用PosixWritableFile()来作为基础的存储。如果预分配开启(log_preallocate_segments=true默认),任何时候一个新的segment生成了,PosixWritableFile都会分配一定大小(log_segment_size_mb)的underlying file。当segment的offset小于预分配file的lengh时,会使用fdatasyc()方法而不用fsync()方法落地数据。
当当前segment大小超过预分配文件的大小,一个独立的线程会启动一个任务为这个segement预分配一个新的underlyingfile,在此同时,此segment数据依然继续写入原先的underlyingfile,直到新的file分配完成,此segment会切换至新的file,且后续新的segment将写入此file。
当segment写完后,没有达到预分配的大小时,underlyingfile会被truncate至最后被写入的offset。

Configs

config是个概念,相对于tablet来说,是一个容错、一致性单位。如果在一个config里有2f+1个副本可用,那么f就是可以容错副本数,f个副本出错时,config会保持服务,而且可以保证客户端感知到的数据是一致的。

原文

https://github.com/cloudera/kudu/blob/master/docs/design-docs/consensus.md

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值