zookeeper原理源码分析系列(一)架构,启动

背景

分布式系统中,zooKeeper是**++协调++** 组件,承担着维护配置信息、命名服务、分布式锁和集群管理等关键职责。此前深入分析了jraft,有选主,分布式存储特性,可嵌入应用,减少部署资源,但欠缺了zookeeper的"协调"特性,会话,watcher,临时节点。分析zookeeper,了解会话,watcher源码原理,补全分布式系统的技术特性,为后续增强jraft为嵌入分布式协调提供技术储备。

关键词

electionEpoch:每执行一次leader选举,electionEpoch就会自增,用来标记leader选举的轮次

peerEpoch:每次leader选举完成之后,都会选举出一个新的peerEpoch,用来标记事务请求所属的轮次

zxid:事务请求的唯一标记,由leader服务器负责进行分配。由2部分构成,高32位是上述的peerEpoch,低32位是请求的计数,从0开始。所以由zxid我们就可以知道该请求是哪个轮次的,并且是该轮次的第几个请求。

lastProcessedZxid:最后一次commit的事务请求的zxid

技术架构

zookeeper的技术架构图

  • zookeeper集群 由多个zookeeper 服务器节点组成,其中一个leader节点,若干follower节点,还有observer,只能读,而且observer不参与选举
  • 客户端 (client) 外部的应用程序或服务,通过 TCP 长连接与 ZooKeeper 集群通信,数据读写和变更监听。
  • Leader: 集群中的主节点,负责处理所有的写请求,并协调 Follower 节点的数据同步。
  • Follower: 集群中的从节点,负责处理读请求,接收并应用 Leader 发送的更新提案,以保持数据一致性。
  • znode: zooKeeper节点内存中维护的数据树结构,zooKeeper存储数据的基本单位。
  • 日志文件: zooKeeper节点将数据变更操作持久化到本地磁盘的日志文件中,用于故障恢复。
  • 快照文件: zooKeeper节点在日志文件达到500条日志(可配置),打包成快照文件,
  • 两阶段提交: zab处理client的请求,先封装为Proposal,Leader广播Proposal,各个Follower返回ACK响应,Leader收到过半Follower的ACK响应后再广播Commit消息,Follower进行提交。与之前分析的dledger日志复制类似, 主节点复制到副节点过半,新日志提交点提交给状态机,应用写入。

逻辑架构

上图左边是zookeeper的源码包, 右边是场景

源码包

admin 嵌入的http服务,有JettyAdminServer实现,处理client的请求

通讯组件 rpc服务,处理rpc client的请求,服务端之间的网络通信

server/ 请求处理 负责请求处理

会话和watcher 会话,临时节点,watcher

quorum 分布式组件包

znode 和存储

场景

启动分析zookeeper启动,组件初始化

请求处理/Serverzookeeper通讯组件有nio,netty实现,系列不深入分析nio,netty,重点放在处理请求,延申到会话

ZAB 一致性的核心协议,包括选主,同步,广播,集群管理

会话/watcher

数据模型/存储

启动

本节分析zookeeper启动,zookeeper启动有两种模式,单机和集群,这里分析集群启动

上图zookeeper启动参与的类图

首先进入QuorumPeerMain的main方法

QuorumPeerMain的initializeAndRun,读入配置,其中config.isDistributed()是否分布式模式,就是说runFromConfig是分布式启动模式

runFromConfig方法,主要是构建和初始QuorumPeer,该类实现ZAB协议的主体,个人觉得QuorumPeer的初始化就是从config读取配置,还不如config直接扔给QuorumPeer

最后启动QuorumPeer,初始化组件

检查本节点是否在Quorum名单

获取QuorumVerifier,这个类关系到分布式的一个关键功能,集群节点管理,将在系列的ZAB中分析

加载数据库

做两个事情,

一,ZKDatabase载入本地的快照,重建内存znode,将在系列的znode模型,存储,日志和快照中分析

二,在本地文件读出currentEpoch和acceptedEpoch,将在系列的ZAB中分析

启动web服务和rpc服务

web服务和rpc服务可以理解为通讯适配,最终请求处理server完成

准备选主

方法名start,实际是从配置中获取选主算法,目前FastLeaderElection,其他注释为废弃

最后启动QuorumPeer,QuorumPeer是线程实现,其run方法正是ZAB的实现,将在系列的ZAB中分析

NEXT

系列(一)-架构,启动 本文

系列(二)-ZAB 选主,发现和同步,广播(两阶段提交),集群管理

系列(三)-通讯组件和请求处理

系列(四)-会话,watcher

系列(五)-znode模型,存储和快照

> curator

相关推荐
阿乐艾官1 天前
【Zookeeper 】
分布式·zookeeper·云原生
yumgpkpm2 天前
OpenClaw(养龙虾) +关于Hadoop hive的Skills(CLoudera CDH、CDP)
大数据·数据仓库·hive·hadoop·分布式·zookeeper·kafka
若水不如远方4 天前
分布式一致性协议(五):殊途同归 —— ZAB 协议与 ZooKeeper 架构
分布式·后端·zookeeper
乐hh5 天前
Hadoop 3.3.5 + Flink 1.15.3 集群完整部署手册(3节点标准版)
java·大数据·hadoop·hdfs·zookeeper·flink·yarn
代码探秘者7 天前
【Redis】告别锁失效:RedLock 与 ZooKeeper 分布式锁原理与实战对比
java·数据结构·redis·后端·python·zookeeper·面试
程序员敲代码吗8 天前
深入解析ZooKeeper在分布式系统中的角色与挑战
linux·分布式·zookeeper
初次攀爬者16 天前
Kafka + ZooKeeper架构基础介绍
后端·zookeeper·kafka
初次攀爬者20 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
yumgpkpm21 天前
AI视频生成:Wan 2.2(阿里通义万相)在华为昇腾下的部署?
人工智能·hadoop·elasticsearch·zookeeper·flink·kafka·cloudera