zookeeper主要用来干什么(都知道zookeeper是干什么的)
zookeeper主要用来干什么(都知道zookeeper是干什么的)Entry:entry 本质上就是一条数据,它会有一个 id 做标识;Ledger:Ledger 是对一个 log 文件的抽象,它本质上是由一系列 Entry (类似于 Kafka 每条 msg)组成的,client 在向 BookKeeper 写数据时也是往 Ledger 中写的;BookKeeper 相关的基本概念如下:Cluster: 所有的 Bookie 组成一个集群(连接到同一个 zk 地址的 Bookie 集合);Bookie:BookKeeper 的存储节点,也即 Server 节点;
BookKeeper是一个可靠的日志流记录系统,用于将系统产生的日志(也可以是其他数据)记录在BookKeeper集群上,由BookKeeper这个第三方Storage保证数据存储的可靠和一致性。典型场景是系统写write-ahead log,即先把log写到BookKeeper上,再对log做处理,比如将log写到内存的数据结构中。BookKeeper同时适用于任何单点写入并要求保证高性能和数据不丢失(Strong Durabilty Guarantees)的场景。
场景BookKeeper诞生于Hadoop2.0的namenode HA。在Hadoop中,出于故障恢复的考虑,Namenode在对它的记录做修改前都会先将本条修改的日志写到磁盘上。但是这里有一个潜在问题,当Namenode发生故障时,很可能连本地磁盘也不能访问,这时之前的记录的日志也就没用了。基于上述考虑,可以将Namenode的日志信息保存在一个可靠的外部Storage中。最初业界通过NFS这样的Share Storage来实现日志同步。之所以选择NFS,一方面因为可以很方便地实现数据共享,另外一方面是因为NFS相对稳定成熟。虽然如此,NFS也有缺点不能满足HDFS的在线存储业务:网络单点及其存储节点单点。为了满足共享日志的高可用性,社区引入了BookKeeper。除此之外还有默认的HA方案:QJM。
设计BookKeeper带有多个读写日志的server,称为 bookies。每一个bookie是一个BookKeeper的存储服务,存储了写到BookKeeper上的write-ahead日志,及其数据内容。写入的log流(称它为流是因为BookKeeper记录的是byte[])称为 ledgers,一个ledger是一个日志文件,每个日志单元叫 ledger entry,也就是bookies是存ledgers的。ledger只支持append操作,而且同时只能有一个单线程来写。ZK充当BookKeeper的元数据存储服务,在zk中会存储ledger相关的元数据,包括当前可用的bookies,ledger分布的位置等。
BookKeeper通过读写多个存储节点达到高可用性,同时为了恢复由于异常造成的多节点数据不一致性,引入了数据一致性算法。BookKeeper的可用性还体现在只要有足够多的bookies可用,整个服务就可用。实际上,一份entry的写入需要确保N份日志冗余在N个bookie上写成功,而我们需要>N个bookie提供服务。在启动BookKeeper的时候,需要指定一个ensemble值,即bookie可用的最小节点数量,还需要指定一个quorums值,即日志写入BookKeeper服务端的冗余份数。BookKeeper的可扩展性体现在可以增加bookie数目,增加bookies可以提升读写吞吐量。
BookKeeper 相关的基本概念如下:
Cluster: 所有的 Bookie 组成一个集群(连接到同一个 zk 地址的 Bookie 集合);
Bookie:BookKeeper 的存储节点,也即 Server 节点;
Ledger:Ledger 是对一个 log 文件的抽象,它本质上是由一系列 Entry (类似于 Kafka 每条 msg)组成的,client 在向 BookKeeper 写数据时也是往 Ledger 中写的;
Entry:entry 本质上就是一条数据,它会有一个 id 做标识;
Journal: Write ahead log,数据是先写到 Journal 中,这个也是 BookKeeper 读写分离实现机制的一部分,后续会详细分析;
Ensemble: Set of Bookies across which a ledger is striped,一个 Ledger 所涉及的 Bookie 集合,初始化 Ledger 时,需要指定这个 Ledger 可以在几台 Bookie 上存储;
Write Quorum Size: Number of replicas,要写入的副本数;
Ack Quorum Size: Number of responses needed before client’s write is satisfied,当这么多副本写入成功后才会向 client 返回成功,比如副本输出设置了 3,这个设置了2,client 会同时向三副本写入数据,当收到两个成功响应后,会认为数据已经写入成功;
LAC: Last Add Confirmed,Ledger 已经确认的最近一条数据的 entry id。
真实案例目前bookKeeper作为底层引擎已经被以下工程使用