Tebis: Index Shipping for Efficient Replication in LSM Key-Value(9)
当客户端到达RDMA缓冲区的末端时,客户端通知服务器旋转线程重置缓冲区起始处的会合点。有两种可能的情况:(a)当接收到的最后一条消息到达缓冲区的末端时,旋转的线程自动设置集合点,而不与客户端进行任何通信。(b)当循环缓冲区的剩余空间不足以容纳当前消息时,客户端向服务器发送一个大小等于循环缓冲区剩余空间的NOOP请求消息。纺线检测到它并将它分配给工人。然后worker发送一个NOOP响应。当客户端检测到NOOP应答时,它将像情况a一样进行处理。
Tebis使用可配置的worker数量。每个worker都有一个私有的任务队列,旋转的线程会在其中放置新任务(图5)。如果旋转的线程在一段时间内(当前为100 μs)没有分配新任务,worker会轮询他们的队列以获取新请求,并进入睡眠状态。为了限制唤醒操作的数量,只要线程队列中的待决任务少于阈值(当前设置为64),线程就会将新任务分配给同一个worker。然后,旋转的线程选择下一个任务少于阈值的工作线程。如果不存在,则唤醒睡眠中的工作线程。
图5 Message detection and task processing pipeline in Tebis. For simplicity, we only draw one circular buffer and a single worker.
4 结论
本文介绍了Tebis。我觉得这个idea比较好的点在于这种多备份的系统中,不同的backup之间的数据一致性问题导致的读写放大如果解决。本文给出的解决方案是在主备份中进行合并后将数据覆盖到副备份中。还有一种就是主副备份是独立的分开进行合并,那样读的数据量就会增加,而主富备份的LSM-tree长得应该都是一样的,所以直接覆盖即可。