《系统日报》持续关注分布式系统、AI System,数据库、存储等相关领域文章。每天以摘要的形式精选不超过三篇系统文章分享给大家。 如果你有好文章推荐,或者有其他任何想法,欢迎在 Articles Weekly Repo[1]提 issue。
分布式数据系统和实时系统架构基石——日志
日志的枢纽作用
来源:https://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying[2]
摘要:很难相信这是一篇 2013 年的文章,其观点相当超前,虽然我仅有一些浅薄的分布式系统经验,但我非常赞同这一点,虽然远没有作者理解的透彻。作者 Jay Kreps[3] 当时在领英有丰富的系统经验,现在是 Confluent(做 Kafka 商业化的那个公司,难怪呀难怪)的CEO。
这里的日志,不是指的应用输出的给人读的文本日志,而是特指面向机器或程序的、一组时间有序的记录序列,其在不同地方有不同叫法,比如 WAL,Commit Logs 或者 Transaction Logs。作者思路纵横捭阖,从数据库系统说到分布式系统,从 SMR(State Machine Replication)说到主从备份,从共识协议(竟然提到了 raft,raft 最为人熟知的那篇论文是在 2014 年发表的,当时就有相关工作[4]披露)说到源代码版本控制。各种系统信手拈来,道出了如何以日志视角完成各种系统大一统的,读罢令人酣畅淋漓。
ps:原文是英文版本,如果读起来费劲,可以期待下我之后的翻译版本。
可学习的索引结构
可学习的索引结构
来源: https://www.infoq.cn/article/the-case-for-learned-index-structures[5]
摘要: 该博客总结了 Jeff Dean 在 SystemML 上介绍的几种学习索引结构的方法,相比于传统的索引方法,学习索引的方法参考了数据的分布,在索引性能上都有很大提升。
- B-Tree 利用模型对 Key 进行具体存储位置的预测,但是单模型的预测范围的误差很大,采用层级模式训练的多 stage 的模型改良预测结果,最后一个 stage 的模型会输出 Key 具体的位置,从而使得每个最终 stage 模型只需要学习数据的一个子集,降低了预测误差范围。在实验中多个数据集下学习索引在存储利用率和速度上都优于B树索引。但是更复杂的模型依赖于GPU/TPU等硬件的提升,在CPU场景下无法体现出搜索的优势。
- HashMap 利用模型对 Key 进行哈希,降低哈希冲突从而节约空间,但会在一定程度上使得插入时间增加。当数据分布不一致时需要重新训练模型,在Map,Web Log,Log Normal 三个数据集上都提升了空间利用率。
- Bloom filter 利用二分类模型对 Key 是否存在进行预测,在具有相同的 FPR 情况下,模型的内存开销减少了47%。进一步提升 FNR 的情况下内存降低了28%。模型的内存和 FNR 的将会取得平衡。
学习索引利用索引数据分布去优化传统索引结构是未来的一个持续的研究方向,在硬件不断迭代的现在,无论是计算硬件还是存储硬件的发展都会使得这个方向大放异彩。
题图
参考资料
[1]任何想法都欢迎来提 issue: https://github.com/DistSysCorp/ArticleListWeekly/issues
[2]The Log: What every software engineer should know about real-time data's unifying abstraction: https://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying
[3]Jay Kreps Confluent CEO: https://www.linkedin.cn/injobs/in/jaykreps/
[4]raft 早期分享: https://www.youtube.com/watch?v=YbZ3zDzDnrw
[5]Jeff Dean 在 SystemML 会议上的论文解读:学习索引结构的一些案例: https://www.infoq.cn/article/the-case-for-learned-index-structures