Facebook 打造的分布式日志存储系统 LogDevice 近日正式登陆 Github 开源,采用最新的三句版 BSD 许可协议。

先附上开源项目传送门

https://github.com/facebookincubator/LogDevice

LogDevice 是一个分布式日志系统。文件系统以文件的形式来存储和管理数据,而日志系统则以日志的形式来存储和管理数据。日志可以被看成是一种面向记录、只可追加和可裁减的文件:

  • 面向记录意味着数据被当成不可再分割的记录(而不是以单个字节的形式)写入日志。记录是最小的寻址单位:读取数据的应用程序始终从特定的记录开始读取日志,或者从要追加到日志的下一条记录开始读取日志。应用程序每次读取一条或多条记录。日志的记录通过单调递增的日志序列号(LSN)来识别。记录编号不保证是连续的,可能会存在间隙。写入数据的应用程序事先不会知道成功写入数据后会分配到什么样的 LSN。

  • 日志只可追加,不支持修改现有记录。

  • 日志预计会存在相对较长的时间:可能是几天、几个月甚至几年。日志主要的空间回收机制是裁减(trim):根据基于时间或空间的保留策略来删除最旧记录,或者根据裁减请求来删除日志。

LogDevice 旨在为多种大规模日志提供高可靠性和高处理性能。它还具备高度可调性,可以针对每种使用场景进行优化,以便在持久性 / 效率和一致性 / 可用性方面做出正确的权衡取舍。 以下是 LogDevice 支持的一些工作负载:

  • 预写记录的持久性

  • 在分布式数据库中记录事务

  • 事件记录

  • 流式处理

  • 机器学习训练管道

  • 复制状态机

  • 延期工作项目日志

LogDevice 目前已经在 Facebook 内部广泛使用,包括以下应用场景:

  • 流处理管道

  • 在大型分布式数据库中分发索引更新

  • 机器学习管道

  • 复制管道

  • 持久可靠的任务队列

在过去几年里,Facebook 为管理 LogDevice 集群打造了很多内部工具,开发人员正在尝试将这些内部的自动化工具也集成到 LogDevice 开源版本中。这次发布的首个开源版本包含一套简单的工具集,构成了使 LogDevice 可以正常工作的基础架构的核心部分。在大规模生产环境中,还需要使用一些额外的工具来完成如监控、集群拓扑管理等工作。

LogDevice 附带一个名为 LDShell(ldshell)的命令行管理工具,LDShell 也是 Facebook 内部使用的主要管理工具,后续开发团队将为其添加更多命令和自动化功能。

关于很多人所好奇的 LogDevice 与 Apache Kafka 之间的区别,Hackernews 网友 manigandham 点评如下:

Kafka 同时处理计算(分区 / 主题管理、排序、分配等)和存储。这种耦合会带来伸缩和运维方面的挑战,而 LogDevice 通过将计算层和存储层分离来消除这些问题。存储节点可以像对象存储一样简单(但会针对追加文件进行优化),并使用多个非确定性位置来随机放置给定的数据。它们通过网格协作的方式进行快速的数据读取、写入和恢复。

与此同时,计算层则变得非常轻巧,几乎是无状态的,因此易于扩展。在 LogDevice 中,Sequencer 是潜在的瓶颈,但生成一系列递增数字是所能做的最快的事情,因此它将超过任何摄取到单个日志的实际数据,同时保持日志中所有条目的顺序。数字(LSN)遵循 Hi / Lo 序列模式,因此如果 Sequencer 发生故障,另一个序列号将以更高的“High”数字取代它,从而保证其所有 LSN 都将大于之前的序号。LogDevice 还提供了一个内置缓冲区,以便在 Sequencer 发生故障时仍能接受消息并在恢复后为它们分配永久 LSN。

Apache Pulsar 与 LogDevice 类似,但在某些方面更进一步,如 broker 管理连接、路由、当数据被发送到单独的 Apache Bookkeeper 节点层(将数据存储在优化的追加日志文件中)时进行确认。

如果你还想深入了解 LogDevice 的技术实现和特性,可以参考去年 InfoQ 发表的这篇文章(中文):

http://www.infoq.com/cn/news/2017/10/LogDevice-Facebook

或者LogDevice官网上的详细介绍(英文):

https://logdevice.io/docs/Concepts.html