Twitter开源分布式高性能日志复制服务

2016 年 5 月 18 日

日前,Twitter 在 Github 上基于 Apache 2 许可证协议开源了其日志服务DistributedLog(DL)。DL 是一个高性能的日志复制服务,提供了持久化、复制以及强一致性的功能,这对于构建可靠的分布式系统都是至关重要的,如复制状态机(replicated-state-machines)、通用的发布/ 订阅系统、分布式数据库以及分布式队列。

DistributedLog 会分类维护记录的序列(sequences of records),并将其称为 Log(又叫做 Log Stream),将记录写入到 DL Log 的进程称之为 Writer,从 Log 中读取并处理记录的进程称之为 Reader。因此,它整体的软件栈如下所示:

具体来讲,它包含如下几个组成部分:

Log

Log 是有序的、不可变的日志记录(log record),它的数据结构如下所示:

日志记录

每条日志记录都是一个字节序列。日志记录会按照序列写入到日志流中,并且会分配一个名为 DLSN(分布式序列号,DistributedLog Sequence Number)的唯一序列号。除了 DLSN 以外,应用程序还可以在构建日志记录的时候设置自己的序列号,应用程序所定义的序列号称为 TransactionID(txid)。不管是 DLSN 还是 TransactionID 都能用来定位 Reader,使其从特定的日志记录开始读取。

Log 分段(Log Segments)

Log 会被分解为 Log 分段,每个分段中包含了其记录的子集。Log 分段是分布式的,应该放到 Log 分段存储中(如 BookKeeper)。DistributedLog 会基于配置好的策略来轮询每个 Log 分段,要么是可配置的时间段(如每两个小时),要么是可配置的最大规模(如每 128MB)。所以 Log 的数据将会分为同等大小的 Log 分段,并且均匀分布到 Log 分段存储节点上。这样,Log 的存储就不会局限于单台服务器的限制,同时,能够在集群中分散读取的流量。

Log 的数据可以永远保存,直到应用程序显式地将其截断,也可以在一个可配置的时间段内保存。对于构建复制状态机来说,显式截断会非常有用,如分布式数据库。在数据何时能够截断这一点上,它们往往有着严格的控制。基于时间保留 Log 对于实时分析的场景更为有用,它们只关心一定时间内的数据。

命名空间

属于同一组织的 Log 流通常会归类在同一个命名空间(namespace)下,并据此进行管理。DL 的命名空间基本上就是用来定位 Log 流在何处的。应用程序可以在某个命名空间下创建和删除流,也能将某个流截断到给定的序列号上(DLSN 或 TransactionID 均可以)。

Writer

Writer 会将数据写入到它们所选择的 Log 中。所有的记录都会按照顺序添加到 Log 之中。序列号是由 Writer 所负责的,这就意味着对于某个 Log,在给定的时间点上,只能有一个激活的 Writer。当出现网络分区(network partition),导致两个 Writer 试图往同一个 Log 进行写入的时候,DL 会保证其正确性,这是通过 Log 分段存储的屏障(fencing)来实现的。

Writer 由名为 Write Proxy 的服务层来提供和管理,Write Proxy 用来接受大量客户端的 fan-in 写入。

Reader

Reader 会从它们所选择的 Log 中读取记录,这会在一个给定的位置开始。这个给定的位置可以是 DLSN,也可以是 TransactionID。Reader 将会严格按照 Log 的顺序读取记录。在同一个 Log 中,不同的 Reader 可以在不同的起始位置读取记录。

与其他的订阅 / 发布系统不同,DistributedLog 并不会记录 / 管理 Reader 的位置,它将跟踪的任务留给了应用程序本身,因为不同的应用在跟踪和协调位置上可能会有不同的需求,很难用一种方式就将这些需求全部解决。在应用程序层面,借助各种存储(如 ZooKeeper、FileSystem 或 Key/Value 存储)能够很容易地跟踪 Reader 的位置。

Log 记录可以缓存在名为 Read Proxy 的服务层中,从而应对大量 Reader 的读取。

Fan-in 与 Fan-out

DistributedLog 的核心支持单 Writer、多 Reader 的语义。服务层构建在 DistributedLog Core 之上,支持大量的 Writer 和 Reader。服务层包含 Write Proxy 和 Read Proxy,Write Proxy 管理 Log 的 Writer,并且在机器宕机时,能够对它们进行故障恢复。它能够从众多来源聚集 Writer,允许不必关心 Log 的所有权(又称为 Fan-in)。Read Proxy 通过将记录放到缓存中,优化了 Reader 的读取路径,以应对成百上千的 Reader 读取同一个 Log 流的状况。

作为一个日志服务,DistributedLog 的优势可以总结为:

  • 高性能:面对大量的并发日志时,在可持久化的 Writer 上 DL 能够提供毫秒级的延迟,同时还能应对上千客户端每秒大量的读取和写入操作。

  • 持久化和一致性:消息会持久化到磁盘上,并且以副本的形式存储多份,从而避免丢失。通过严格的顺序,保证 Writer 和 Reader 之间的一致性。

  • 各种工作负载:DL 支持各种负载,包括延迟敏感的在线事务处理(OLTP)应用(如分布式数据库的 WAL 和基于内存的复制状态机)、实时的流提取和计算以及分析处理。

  • 多租户:针对实际的工作负载,DL 的设计是 I/O 隔离的,从而支持多租户的大规模日志。

  • 分层架构:DL 有一个现代化的分层设计,它将有状态的存储层与无状态的服务提供层进行了分离,能够使存储的扩展独立于 CPU 和内存,因此支持大规模的写入 fan-in 和读取 fan-out。

关于 DistributedLog 的概要架构详细设计以及使用过程,可以参考其 Github 上的文档


感谢魏星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016 年 5 月 18 日 19:006326

评论

发布
暂无评论
发现更多内容

产业新基建,撬动数字经济发展新机遇

京东智联云开发者

人工智能 新基建 京东

蘑菇街Java大牛熬夜半个月纯手打肛出的一份《多线程源码学习笔记》文档资料,赶紧收藏学习!

Java成神之路

Java 程序员 架构 面试 编程语言

MindSpore手写数字识别初体验,深度学习也没那么神秘嘛

华为云开发者社区

人工智能 学习 手写识别

华为云MVP高浩:打破AI开发瓶颈,解决数据、算法、算力三大难题

华为云开发者社区

人工智能 数据 华为云

一份知识点全面又能不断更新与时俱进的《Java面试宝典》,有人已成功靠它拿到阿里、京东、字节跳动等大厂offer,

Java成神之路

Java 程序员 架构 面试 编程语言

业务中台建设 - 自底向上演进

孝鹏

架构 中台 业务线 数字化转型 沟通

二本毕业两年Javacrud经验,面试阿里侥幸通过定级P6,分享这波面经,希望能够激励到同样被学历所困扰的技术人,能够对职业生涯和技术规划有一个参考价值

Java成神之路

Java 架构 面试 编程语言 java程序员

使用resilio实现多集群的k8s pod数据双向非实时同步

东风微鸣

Kubernetes 探索与实践 openshift

Spring+MySQL+数据结构+集合+注解+NIO+多线程进阶学习思维脑图总结!

Java成神之路

Java 程序员 架构 面试 编程语言

从应用迁移到平台微认证:鲲鹏技术解读

华为云开发者社区

鲲鹏 代码迁移 arm

打工人、打工魂、高效MES助力打工者都是人上人

Learun

敏捷开发

LeetCode题解:121. 买卖股票的最佳时机,暴力法,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

Spring Boot 2.4.0正式发布,全新的配置文件加载机制(不向下兼容)

YourBatman

云原生 Spring Boot 新特性

每周花6小时跟清华大牛学Java:JVM、高并发多线程、算法、微服务等。技术能力蹭蹭往上涨!

Java成神之路

Java 程序员 架构 面试 编程语言

最近我发现瑞幸在这样做私域运营

Linkflow

营销数字化 客户数据平台 CDP 私域运营

还在头疼C艹中的智能指针吗?

linux亦有归途

指针 C/C++

什么是低代码(Low-Code)?

阿里巴巴云原生

程序员 云原生 代码

架构师第一期作业(第 11 周)

Cheer

作业

【3年Java经验面经】阿里三面被挂!幸获内推历经5轮终于拿到口碑offer!

Java成神之路

Java 程序员 架构 面试 编程语言

对于CRM之于现代化企业的影响以及作用的分析

Marilyn

敏捷开发 快速开发 企业开发 CRM 企业应用

深入了解物理内存管理-伙伴(Buddy)算法

ShenDu_Linux

Linux 算法 内存管理 内核

使用 Jira Service Management 管理资产,您需要知道的5件事

Atlassian速递

数字化转型 Atlassian Jira ITSM ITIL

Java基础+JVM+分布式+算法+锁+MQ+微服务+数据库等499道Java面试题整理(含答案)。

Java成神之路

Java 程序员 架构 面试 编程语言

时空碰撞系列·终

誓约·追光者

数据分析 Sparksql

架构师训练营第 1 期 第 10 周作业

李循律(祥龙)

首家支持阿里云函数计算 APM技术为Serverless环境赋能

BonreeAPM

阿里云 Serverless 运维 APM 函数

“摸爬滚打”多年,从月薪3K到30Kjava大神,我是怎么蜕变的?

比伯

Java 编程 架构 面试 计算机

一点就透的二分查找算法

比伯

Java 编程 程序员 面试 计算机

微服务已然成为Java开发的面试门槛,你连SpringCloud都不会还想跳槽涨薪?

Java成神之路

Java 程序员 架构 面试 编程语言

阿里P8大牛总结整理的精选技术好文:Redis+Nginx+设计模式+Spring全家桶+SQL+Dubbo

Java成神之路

Java 程序员 架构 面试 编程语言

牛批!阿里P8大牛写了一份Spring Boot2教程已整理成文档免费分享。谁学谁真香系列!

Java成神之路

Java 程序员 架构 面试 编程语言

Twitter开源分布式高性能日志复制服务-InfoQ