DistributedLog 教程

DistributedLog 教程

distributedlog项目地址:https://gitcode.com/gh_mirrors/dis/distributedlog

项目介绍

DistributedLog 是一个高性能的复制日志服务,提供持久性、复制和强一致性,这些是构建可靠分布式系统的基础。该项目最初作为独立的Apache项目存在,后来于2017年合并到Apache BookKeeper中。它维护了称为日志(或日流)的记录序列,写入记录到日志的进程是写者,而读取并处理记录的进程是读者。分布式日志适用于实现复制状态机、通用发布订阅系统、分布式数据库、分布式队列等多种场景。

项目快速启动

环境准备

确保你的环境中已经安装了以下工具:

  • Docker
  • Java Development Kit (JDK)
  • Maven

Docker部署

为了快速启动DistributedLog,你可以使用Docker容器:

  1. 拉取最新的Docker镜像:
docker pull apache/bookkeeper
  1. 启动Docker容器:
docker run -d --name dl_cluster -p 8080:8080 -p 2181:2181 -p 3181:3181 apache/bookkeeper bookkeeper-server

初始化日志流

现在可以使用DistributedLog的命令行工具创建日志流:

curl -X POST http://localhost:8080/v1/logs/test-stream -d ''

写入数据

创建一个简单的Java程序写入数据到日志流:

import org.apache.distributedlog.api.DistributedLogManager;
import org.apache.distributedlog.api.LogWriter;
import org.apache.distributedlog.api.ZKConfigurationBuilder;

public class DLSampleWriter {
    public static void main(String[] args) throws Exception {
        ZKConfigurationBuilder builder = new ZKConfigurationBuilder();
        builder.setZkConnectionString("localhost:2181");
        DistributedLogManager dlm = DistributedLogManager.builder()
                .conf(builder.build())
                .streamName("test-stream")
                .build();

        try (LogWriter writer = dlm.openWriter()) {
            writer.write("Hello, DistributedLog!");
        }
        dlm.close();
    }
}

编译并运行上述Java程序,你将在“test-stream”中看到一条记录。

应用案例和最佳实践

  1. 实时消息传递:利用DistributedLog的低延迟特性,构建可靠的实时消息传递平台。
  2. 数据流处理:构建事件驱动的数据流处理系统,对日志中的事件进行分析和响应。
  3. 数据备份与恢复:作为基础存储组件,用于定期备份数据并支持快速恢复。
  4. 跨区域复制:通过DistributedLog的全局复制功能,实现实时的数据跨地区同步。

最佳实践包括:

  • 对日志流进行适当分区,以平衡负载并提高读写性能。
  • 使用配置参数调整一致性、耐用性和顺序保证的权衡。
  • 定期监控和调优硬件及集群性能。

典型生态项目

  • Apache BookKeeper: DistributedLog已整合进BookKeeper,作为其核心组件提供日志存储服务。
  • Apache Pulsar: 一个高级的消息代理,使用DistributedLog作为其底层日志存储。
  • LinkedIn Pinot: 实时OLAP数据管道,依赖DistributedLog作为数据源。
  • Twitter Heron: 分布式流计算框架,用DistributedLog来保证拓扑状态的一致性。

了解更多信息,可以参考DistributedLog的官方文档和示例应用程序。在实践中遇到问题时,记得查看社区资源,如邮件列表、论坛或者GitHub上的issue追踪系统。

distributedlog项目地址:https://gitcode.com/gh_mirrors/dis/distributedlog

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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
发出的红包

打赏作者

富珂祯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值