1 个不稳定版本
0.1.0 | 2022年7月22日 |
---|
#7 在 #副本
38KB
851 行
小小的LogLog!
小小的LogLog(或简称LogLog)是一个基于Rust的分布式、副本、有序、强一致性(最终)容错二进制日志。
每当我想起分布式系统中的通信模式时,我就会意识到我真的很需要
- 副本日志(这样数据就不会消失)
- 强有序且一致(没有神秘的非确定性行为)
- 有良好的性能
- 可以合理地向上和向下扩展(这样我可以用每天0.50美元的k8s集群开始,而稍后即使它开始看到一些实际动作,我也不必重写一切)
这就是为什么每个分布式存储都在底层使用副本日志的原因。那么为什么可供我直接使用的分布式日志这么少呢?
与我想要的最为接近的是Log Cabin,但我希望它是内容无关的,并且我会尝试让它更快。此外,我不会使用C++。还有另一个类似的东西,Apache BookKeeper,但它只是一个资源密集型且操作繁重的Java项目,我不想与之打交道。
所以这里是计划
- 尽可能简单地在Rust中构建一个可行的分布式日志。
- 从单节点版本开始,然后添加副本和Raft以实现高可用性。
- 设计数据模型以实现理论上良好的性能。
- 从现有项目中借鉴所有我意识到的优秀想法。
- 尽可能通过将尽可能多的任务卸载到客户端来实现尽可能大的扩展,而无需进行分片。
- 分布式部分主要关于副本(这样我们就不会丢失数据)。分片通常不能保证分片之间的有序性,所以它不是那么有趣(至少现在不是)
- 如果你需要分片,你可能已经超过了LilLilLogLog - 在其之上构建,或者只是分割你的日志,或者(分叉并)实现分片。
- 使用分段的(分成单独的文件)日志中的字节偏移作为ID(就像Kafka一样)。
- 限制事件大小约为3B值。对延迟施加一些合理的限制。
- 所有写入都从领导者开始,但客户端应该自行上传到其他副本的副本,以帮助减轻领导者的负载。
- 在客户端“追加”请求上,通过一次读取读取固定头(包括内容的长度),然后使用长度将内容尽快复制到文件的
fd
。理想情况下这将是无拷贝的,但似乎tcpsocket->file不能是无拷贝的。由于我们可能需要将其加载到用户空间缓冲区,我们不妨保留最近的那些以快速响应。 - 即使查看数据也不要费心了。如果客户需要数据完整性,他们可以添加校验和,如果他们发现数据损坏,可以尝试从其他副本中读取。如果客户希望在单个追加操作中包含多个项目,他们也可以自行处理。
- 读取器将只获取整个批次的事件。他们可以使用任何副本,副本不会返回他们没有或尚未提交的内容。
- 看起来
tokio-uring
具有足够的功能来满足这些需求,所以不妨从这里开始。
我确实有点不知所措,但我相信互联网会可靠地告诉我哪些想法是愚蠢的,最坏的情况是我会学到一些东西,但什么也没做。🤷
阅读 设计文档
依赖关系
~11–22MB
~291K SLoC