DistributedLog介绍及与Kafka比较

Distributed是Twitter 2016年5月份开源的一个分布式日志系统。在Twitter内部已经使用2年多。本文首先介绍DistributedLog的架构设计以及应用场景,然后与分布式消息Kafa对比分析。目前只有Twitter内部使用,下面场景都是其内部使用场景。1、Manhattan 数据库2、EventBus (Twitter自服务的 pubsub system,用于取代 Kafka)3、跨数据中心的数据库复制4、Twitter 搜索的 ingestion pipeline5、持
摘要由CSDN通过智能技术生成

一、背景介绍

DistributedTwitter 20165月份开源的一个分布式日志系统。在Twitter内部已经使用2年多。

主页:http://distributedlog.io/

代码:https://github.com/twitter/distributedlog

介绍:

1、Building DistributedLog: Twitter’s high-performance replicated log service

  https://blog.twitter.com/2015/building-distributedlog-twitter-s-high-performance-replicated-log-service

2、【年度案例】Twitter高性能分布式日志系统架构解析

 

二、架构介绍

2.1 数据存储

 

数据模型


Log Segment:应用程序看到的Log 流是连续的,但物理存储是一个个的Log Segment

1、  同一个Log Segment上的Replica Configuration是一样的

2、  Log Segment可以设置按时间或者按大小,创建新的。

3、  Log Segment 分布式的存储在 Log Segment Store中。

4、  系统中的Log Segments最终会分散在各个节点上,数据读取就不会产生热点节点。

5、  Log Segment也是数据保留单元。即可以按照超时时间配置TTL,也可手动truncate

 

Log Sequence Number

 日志记录(Log Record)被顺序的写入Log Stream中,并且被分配一个DLSNDistributeLog Sequence Number)。Writer自动分配的。

DLSN = LSSN + EID + SID

LSSNLog Segment Sequence Number    -- 属于哪个Log Segment 

EIDEntry ID                         -- 在这个Log Segment中的ID

SIDSlot ID                          --  Entry 中的ID

 

日志记录可以根据DLSN排序。

 

除了DLSN,应用程序还可以分配一个 Transaction ID(递增的64位正整数)。比如一个常见的场景是,应用把记录生成时的timestamp作为记录的Transaction ID。在继续数据分析时,应用可以根据这个Transaction Id倒回到指定的时刻的日志。

 

命名空间(Name Space)

   属于相同的应用下的日志流(Log Streams)被归类到同一个命名空间(namespace)下。

应用根据命名空间定位日志流。应用能够在命名空间下创建和删除日志流,或者指定日志流ID,切除(truncate)日志流。

 

2.2读写过程


持久化存储

   DL的存储层(Storage Layer),提供持久化、可用性和一致性等核心功能。存储层的主要组件有日志段存储(Log Segment Store)、冷数据存储(Cold Storage)、元数据存储(Metadata Store)。

 

日志段存储(Log Segment Store

  使用BookKeeper做日志段的存储。BookKeeper提供从写入到读取的E2E的低时延、多副本的存储能力,并且通过fencing机制,在多份写时,能够提供强一致性。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DL是一个高性能的日志复制服务,提供了持久化、复制以及强一致性的功能,这对于构建可靠的分布式系统都是至关重要的,如复制状态机(replicated-state-machines)、通用的发布/订阅系统、分布式数据库以及分布式队列。DistributedLog会分类维护记录的序列(sequences of records),并将其称为Log(又叫做Log Stream),将记录写入到DL Log的进程称之为Writer,从Log中读取并处理记录的进程称之为Reader。因此,它整体的软件栈如下所示:具体来讲,它包含如下几个组成部分:LogLog是有序的、不可变的日志记录(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均可以)。WriterWriter会将数据写入到它们所选择的Log中。所有的记录都会按照顺序添加到Log之中。序列号是由Writer所负责的,这就意味着对于某个Log,在给定的时间点上,只能有一个激活的Writer。当出现网络分区(network partition),导致两个Writer试图往同一个Log进行写入的时候,DL会保证其正确性,这是通过Log分段存储的屏障(fencing)来实现的。Writer由名为Write Proxy的服务层来提供和管理,Write Proxy用来接受大量客户端的fan-in写入。ReaderReader会从它们所选择的Log中读取记录,这会在一个给定的位置开始。这个给定的位置可以是DLSN,也可以是TransactionID。Reader将会严格按照Log的顺序读取记录。在同一个Log中,不同的Reader可以在不同的起始位置读取记录。与其他的订阅/发布系统不同,DistributedLog并不会记录/管理Reader的位置,它将跟踪的任务留给了应用程序本身,因为不同的应用在跟踪和协调位置上可能会有不同的需求,很难用一种方式就将这些需求全部解决。在应用程序层面,借助各种存储(如ZooKeeper、FileSystem或Key/Value存储)能够很容易地跟踪Reader的位置。Log记录可以缓存在名为Read Proxy的服务层中,从而应对大量Reader的读取。Fan-in与Fan-outDistributedLog的核心支持单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。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值