前言
随着pulsar和pravega 日渐流行,Bookkeeper再次出现在大众视野。Bookkeeper是一个支持跨节点对日志流进行持久化存储的服务。其实,Bookkeeper产生于Hadoop生态HDFS中NameNode高可用背景下,用于记录存储NameNode所有Edit logs。Bookkeeper优势:高效率写、多副本高容错、高吞吐。应用场景描述如下:
环境准备
Unix environmentJava Development Kit 1.8 or laterMaven 3.0 or later
源码编译
wget https://github.com/apache/bookkeeper/archive/refs/tags/release-4.14.3.tar.gztar -xvf release-4.14.3.tar.gzcd bookkeeper-release-4.14.3/mvn clean package –DskipTests

编译出来的安装包位置:
bookkeeper-dist/all/target/bookkeeper-all-4.14.3-bin.tar.gz

部署操作
可以使用DC/OS(the DataCenter Operating System)调度器,DC/OS是一个基于Mesos实现的用于部署和管理应用程序的分布式操作系统。

当然,也可以手动部署。考虑产品技术栈,本文采用手动部署方式进行演示。
Bookkeeper包括两部分:Zookeeper、bookies。至于Zookeeper本文不做介绍。部署启动Zookeeper以后,配置conf/bk_server.conf中zkServers为已启动的Zookeeper地址:
zkServers=felixzh:2181
集群元数据设置
配置zookeeper地址之后,在bookkeeper集群任意节点执行如下命令(仅需要执行一次):
bin/bookkeeper shell metaformat

相应的会在zookeeper生成/ledgers节点,如图(其他节点是Kafka创建的):

/ledgers节点树结构如下:
启动bookies节点
将上述配置了zookeeper地址的安装包分发到不同主机,使用如下命令依次启动bookies。
bin/bookkeeper bookie

如果需要后台启动,使用如下命令:
bin/bookkeeper-daemon.sh start bookie
每当启动一个bookie,会在zookeeper中/ledgers/available节点下注册临时节点,这一点跟Kafka注册broker.id道理相同。如下图所示:

bookies数越多吞吐量越高。官方宣称bookies数量没有上限限制。
Bookkeeper API
Bookkeeper包括三种API供应用程序使用:
The ledger API is a lower-level API that enables you to interact with ledgers directlyThe Ledger Advanced API is an advanced extension to Ledger API to provide more flexibilities to applications.The DistributedLog API is a higher-level API that provides convenient abstractions.
完整样例代码见github:
https://github.com/felixzh2020/felixzh-learning-java/blob/master/BookkeeperCase/src/main/java/LedgerAPI.java


Recovery机制
当一个bookie节点宕机,该节点上所有ledgers将变为under-replicated。为了补齐这些ledgers缺少的副本数据,需要进行recover操作,分为两种类型:手动恢复(manual recovery)、自动恢复(auto recovery)。
手动恢复支持指定bookie级别和指定ledger级别。
bin/bookkeeper shell recover \192.168.1.10:3181 # IP and port for the failed bookiebin/bookkeeper shell recover \192.168.1.10:3181 \ # IP and port for the failed bookie--ledger ledgerID # ledgerID which you want to recover
自动恢复顾名思义自动检测到缺少的副本数据,自行进行副本数据补齐。支持三种运行模式:
On dedicated nodes in your BookKeeper clusterOn the same machines on which your bookies are runningOn a combination of autorecovery nodes and bookie nodes
启动autorecovery命令如下:
bin/bookkeeper autorecoverybin/bookkeeper shell autorecovery –disablebin/bookkeeper shell autorecovery –enable
完整recovery内部机制如下:
The client (the process running ) reads the metadata of active ledgers from ZooKeeper.The ledgers that contain fragments from the failed bookie in their ensemble are selected.A recovery process is initiated for each ledger in this list and the rereplication process is run for each ledger.Once all the ledgers are marked as fully replicated, bookie recovery is finished.




