Arnold's Blog Arnold's Blog
🏠首页
  • Java
  • Python
💻前端
🕸️周边技术
🗒️札记
  • Tips
  • 读书
  • 友情链接
🧑‍💻关于
🔖收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Arnold Shu

知人者智,自知者明。胜人者有力,自胜者强。
🏠首页
  • Java
  • Python
💻前端
🕸️周边技术
🗒️札记
  • Tips
  • 读书
  • 友情链接
🧑‍💻关于
🔖收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Maven

  • Git

  • Docker

  • Distributed

    • 分布式定理之CAP
    • 常用分布式事务协议
    • 分布式“一致性”算法之Paxos
    • 分布式“一致性”算法之Raft
    • 分布式协调服务之ZooKeeper
      • Zookeeper
      • zookeeper的数据结构
        • zookeeper应用场景
      • 本地模式安装zookeeper
      • 启动zookeeper
      • zookeeper选举master内部原理简析
      • 节点类型
      • zookeeper集群搭建
      • zookeeper shell
      • zookeeper监听器原理
      • 常见的监听
      • 面试主要考察点
      • 上手代码地址:https://gitee.com/ArnoldSu/zookeeper
  • Linux

  • technology
  • Distributed
Arnold Shu
2023-12-28
目录

分布式协调服务之ZooKeeper

# Zookeeper

Apache ZooKeeper是Apache软件基金会 (opens new window)的一个软件项目,它为大型分布式计算 (opens new window)提供开源 (opens new window)的分布式配置服务、同步服务和命名注册。ZooKeeper曾经是Hadoop (opens new window)的一个子项目,但现在是一个独立的顶级项目。

zookeeper:定义是一个开源的分布式,为分布式应用提供协调服务的Apache的项目。 zookeeper是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理大家的关心的数据,然后接受观察者注册,一旦数据的状态发生变化,zookeeper将负责通知已经在zookeeper上注册的那些观察者做出相应的反应 zookeeper= 文件系统+通知机制

特点

  • 一个leader ,多个follower组成的集群
  • 集群中只要半数以上的节点存活,zookeeper集群就能正常服务
  • 全局数据一致,每个server保存一份相同的数据副本,client无论链接那个server,数据都是一致的
  • 更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行
  • 数据更新原子性,要么成功要么失败
  • 实时性,一定时间范围内,client能读到最新数据

# zookeeper的数据结构

数据模型的结构与Unix文件系统很相似,整体上可以看作是一个树,每个节点称作一个ZNode,每个ZNode默认能够存储1mb的数据,每个ZNode都可以通过其路径唯一标识

# zookeeper应用场景

  • 统一命名服务 分布式环境下,经常需要对应用/服务进行统一命名,便于识别(例如:ip不容易识别,域名容易记住)
  • 统一配置管理 分布式环境下配置文件同步非常常见(集群中所有节点的配置信息是一致的.例如Kafka集群,配置文件修改后,希望能够快速同步到各个节点,配置管理可交由zookeeper,可将配置信息写入zookeeper上的一个Znode,各个客户端服务器监听这个Znode,一旦Znode中的数据被修改,Zookeeper将通知各个客户端服务器)
  • 统一集群管理 分布式环境下,实时掌握各个节点的状态(可根据节点实时状态做出一些调整,实时监控节点状态变化,可将节点信息写入Znode,监听这个Znode可获取它的实时状态变化)
  • 服务器节点动态上下线 实时洞察服务器的上下线
  • 软负载均衡等 记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求

下载地址:http://archive.apache.org/dist/zookeeper/ (opens new window)

# 本地模式安装zookeeper

  • 安装jdk
  • 下载zookeeper包到linux你指定的目录,并解压
  • 配置修改 解压文件的conf文件夹下zoo_sample.cfg 文件修改为zoo.cfg 修改zoo.cfg 修改dataDir路径(存储数据路径)

zoo.cfg 配置参数

# The number of milliseconds of each tick 心跳包时间间隔
tickTime=2000 
# The number of ticks that the initial 初始化最大时延tickTime*initLimit,leader与follower超过这个时间就断掉,通讯机制
# synchronization phase can take
initLimit=10 
# The number of ticks that can pass between
# sending a request and getting an acknowledgement 启动完成之后的最大时延tickTime*syncLimit,leader与follower超过这个时间就断掉,通讯机制
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 存储数据的地方
# example sakes.
dataDir=/home/zookeeper/zkdata
# the port at which the clients will connect 客户端端口号
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients 客户端最大连接数 
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

​

# 启动zookeeper

bin目录下

zkCleanup.sh
zkCli.cmd 客户端
zkCli.sh 客户端
	回车无参启动 
	quit 退出客户端

	
zkEnv.cmd
zkEnv.sh
zkServer.cmd 服务端
zkServer.sh 服务端
	start 启动
	status 状态
	stop 关闭
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# zookeeper选举master内部原理简析

半数机制:集群中只要半数以上机器存活,集群可用,集群适合奇数台服务器 server启动没有历史数据的情况下,先自投,选举状态一直是looking,集群相互交换选举信息,所以后加的server票数更多,超过半数以上的投票作为leader ,其他为follower

# 节点类型

  • 持久(Persistent)节点 客户端和服务端断开后节点不删除
  • 临时(Ephemeral)节点 客户端和服务端断开后节点自删除

# zookeeper集群搭建

  • 首先单机zookeeper装好
  • 集群环境善于利用xsync脚本同步文件数据
  • 在相应的指定目录线面创建节点信息,zkdata在节点下 创建一个myid文件其中的就是对应相应的server唯一标识,创建后同步到进群信息中并修改成相应的机器的唯一标识
  • 修改zoo.cfg文件dataDir文件路径到指定目录,添加集群配置 server.A=B:C:D A对应一个服务器的你在myid里面配置的唯一标识 B是一个ip或者主机名 C是本服务器与集群中的leader服务器交换信息的端口 D 是集群中的leader挂掉之后,从新选举通信的端口 特别注意,集群检验需要把所有集群机器启动

# zookeeper shell

客户端命令
help 显示所有操作命令

ls  显示当前znode所包含的数据内容  eg:ls /

ls2 / 显示当前节点节点的详细数据 eg: ls2 /

create 
创建节点(如果不写入数据,则无法创建相应节点) eg:create /master "master"
创建短暂节点 eg:create -e /master1 "master1"
创建带序号的节点 eg:create -s /master3 "master3"


get 获得节点的值 eg:get /master 

显示结构体的字段属性 
23134234
cZxid = 0x100000002			创建节点的事务zxid 
ctime = Wed Feb 26 23:39:12 CST 2020			znode创建的毫秒数
mZxid = 0x10000000e			znode最后更新事务的zxid
mtime = Thu Feb 27 00:25:55 CST 2020 最后修改的毫秒数 
pZxid = 0x100000002			最后更新子节点的zxid
cversion = 0			znode子节点的变化号,znode子节点的修改次数
dataVersion = 2			znode数据变化号
aclVersion = 0			znode访问控制列表的变化号
ephemeralOwner = 0x0			如果是临时节点,这是znode拥有者得session_id,如果不是则是0
dataLength = 8				znode数据长度 
numChildren = 0				znode子节点的数量


set 修改节点的值 eg:set /master1 "master111111"

watch 监听节点值变化 eg:get /master watch  一次有效

delete 
删除节点 eg:delete /master
递归删除节点 eg:rmr /master 

stat 查看节点状态 stat /master 

quit 退出客户端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

# zookeeper监听器原理

  • 创建一个main线程
  • 其中在main线程中创建一个zookeeper的客户端,同时这个客户端拥有两个线程,一个负责网络通信(connection)一个负责监听(listener)
  • 通过connection将注册的监听事件发送给zookeeper
  • 在zookeeper的注册监听器列表将注册的监听事件添加到列表中
  • zookeeper监听到数据或者路径变化,就会将这个消息告诉给listener线程
  • listener就会调用相应的process()方法处理

# 常见的监听

监听节点的数据变化 get path [watch]

监听子节点的增减变化 ls path [watch]

# 面试主要考察点

zookeeper的选举机制,半数投票机制 zookeeper的监听原理 zookeeper的部署方式(单机,集群,伪集群),集群中的角色(leader,follower),集群至少三台服务器 zookeeper的常用命令

# 上手代码地址:https://gitee.com/ArnoldSu/zookeeper (opens new window)

​ ​ ​ ​ ​

参考链接

Wikipedia Apache ZooKeeper (opens new window)

​

#ZAB#Zookeeper
分布式“一致性”算法之Raft
Linux 的常用命令

← 分布式“一致性”算法之Raft Linux 的常用命令→

最近更新
01
《领域驱动设计:软件核心复杂性应对之道》书摘
12-26
02
Linux 的常用命令
10-22
03
程序设计中SPI和API
10-22
更多文章>
Theme by Vdoing | Copyright © 2017-2024 Arnold Shu | CC BY-SA 4.0 License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式