zookeeper底子知识分享(一)

[复制链接]
发表于 2024-11-12 20:51:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
写在前面

今天来学习Zookeeper部门的知识,之后会学习hbase的知识。
Zookeeper简介

Zookeeper是一个高效的分布式协调服务,可以提供以下功能:

  • 设置信息管理
  • 定名
  • 分布式同步
  • 集群管理
  • 数据库切换等服务
它不适适用来存储大量信息,而是用于存储一些设置信息、发布与订阅等少量数据。以下是Zookeeper的范例应用场景:

  • Hadoop
  • Storm
  • 消息中央件
  • RPC服务框架
  • 分布式数据库同步系统
Zookeeper集群

Zookeeper集群中节点的个数一般为奇数(>=3)。假如集群中的Master节点挂掉,且剩余节点数凌驾半数时,集群可以通过选举推举新的主节点继续对外提供服务。
客户端发起变乱请求时,变乱的结果在整个Zookeeper集群中全部机器上的应用是同等的。不会出现集群中部门机器应用了该变乱,而其他机器未应用该变乱的情况。Zookeeper确保集群中全部机器的数据模型同等。
Zookeeper能够保证客户端请求的次序,每个请求都会分配一个全局唯一的递增编号,用来反映变乱操作的先后次序。
Zookeeper将全量数据生存在内存中,并直接服务于全部的非变乱请求。因此,在以读操作为主的场景中,Zookeeper性能非常突出。
Zookeeper的数据布局与节点脚色

Zookeeper使用的主要数据布局是树形布局,根节点为/。Zookeeper集群中的节点有以下几种身份:

  • Leader:负责客户端写请求(writer类型的请求)。
  • Follower:负责客户端读请求(reader类型的请求),并参与Leader选举。
  • Observer:是特殊的Follower节点,可以接收客户端的读请求,但不会参与选举。Observer可以用来扩展系统的读能力,提升读取性能。
Zookeeper的设计理念

Zookeeper是一个基于观察者模式设计的分布式服务管理框架。它负责存储和管理相关数据,并接收观察者的注册。一旦这些数据的状态发生变化,Zookeeper会关照已注册的观察者,以便观察者实行相关操作。
Zookeeper的协议与同等性保障

Zookeeper使用ZAB原子广播协议,节点之间的数据同等性算法接纳Paxos算法,能够保障分布式环境中数据的同等性。
ZAB(Zookeeper原子广播协议)

详细介绍ZAB协议
Paxos算法

Paxos算法解决的问题是,如安在分布式系统中就某个值(决议)告竣同等。范例的应用场景包括:分布式数据库系统中,假如各节点的初始状态同等,且实行相同的操作序列,则它们终极会得到同等的状态。
为了确保每个节点实行相同的命令序列,需要通过同等性算法来保证每个节点看到的指令同等。Paxos算法就是为了解决分布式系统中的同等性问题,它是基于消息传递模型的同等性算法。
Paxos算法不但可以用于分布式系统中的同等性保证,也适用于多个进程/线程需要告竣同等的场景,包括:

  • 一台机器中多个进程/线程的数据同等性
  • 分布式文件系统或数据库中的并发读写
  • 分布式存储中多个副本响应读写请求的同等性
Zookeeper全解析——Paxos作为灵魂

Zookeeper(ZK)Server最底子的东西是什么呢?我想应该是Paxos。因此,本文将介绍Paxos及其在ZK Server中的实现。
什么是Paxos?

Paxos是一种基于消息传递的同等性算法,由Leslie Lamport于1990年提出,近年来被广泛应用于分布式盘算中。Google的Chubby、Apache的Zookeeper都基于Paxos的理论进行实现。Paxos被认为是如今为止唯一成熟的分布式同等性算法,其他算法每每是对Paxos的改进或简化。
需要指出的是,Paxos有一个前提:没有拜占庭将军问题。意思是,Paxos只有在一个可信的盘算环境中才华建立,这个环境不应受到入侵或破坏。
Paxos算法的描述

Paxos描述了这样一个场景:有一个叫做Paxos小岛(Island)的地方,岛上住着一批住民,他们的变乱由一些特殊的人来决定,这些人被称为议员(Senator)。议员的数量是固定的,不可更改。
岛上的每次变乱变动都需要通过发起(Proposal),每个发起都有一个编号(PID),这个编号是递增的,不能倒退。每个发起必须得到凌驾半数议员的同意才华生效。假如某个议员收到的发起编号小于等于他当前的编号,他会拒绝该发起,并告知对方“你的发起已经有人提过了”。
这个编号是每个议员在本身的记事本上记录的数字,随着时间的推移,议员会更新这个编号,确保发起按照准确的次序进行。整个议会的目标是:保证全部议员对于发起告竣同等的看法。
举个例子

假设岛上有三个议员:S1、S2、S3。

  • S1发起将电费设定为1元/度,这时他将发起编号定为1。
  • 其他议员收到S1的发起后,查找本身的记事本,发现当前编号为0,以是接受这个发起,并记录编号为1。
  • 假如S1收到了凌驾半数(即2个议员)的同意,他就会宣布“1号发起生效!”
冲突解决

假设S1和S2同时发起了发起:

  • S1发起设定电费为1元/度(发起编号为1)。
  • S2发起设定电费为2元/度(发起编号也是1)。
S3先收到S1的发起并同意,接着收到S2的发起,但发现S2的发起编号小于等于本身当前的编号,因此拒绝了S2的发起,S1的发起生效。
Paxos在Zookeeper中的应用

如今让我们将Paxos的概念与Zookeeper(ZK Server)中的实现对应起来:

  • 小岛(Island)—— Zookeeper集群(ZK Server Cluster)
  • 议员(Senator)—— Zookeeper Server节点
  • 发起(Proposal)—— ZNode的变动操作(如Create、Delete、SetData等)
  • 发起编号(PID)—— Zxid(ZooKeeper变乱ID)
  • 正式法令 —— 全部ZNode及其数据
只管概念对得上,但是Zookeeper中有一个特殊脚色——Leader。这个脚色在Paxos中并不明显,但实际上它是解决“活锁”问题的关键。Paxos的作者Leslie Lamport在《The Part-Time Parliament》中提到,只有一个总统(President)可以发出发起,以避免多个议员同时发起导致的冲突。
总统——ZK Server中的Leader

Zookeeper的Leader脚色正是Paxos中的总统。在Zookeeper集群中,Leader负责协调变乱的处理并保证同等性,而Follower节点则跟随Leader的决议。
总统选举

总统(Leader)的选举机制是Paxos的一部门,选举过程可能比较复杂,Zookeeper使用Paxos来确保集群中的Leader同等性。你可以阅读相关博客了解更多详细信息:如何选出总统
ZK Server的操作

让我们通过几个景象来更好地理解Zookeeper是如何实施Paxos算法的。
情况一:


  • 客户端甲到某个ZK Server扣问某条法令的情况(比方ZNode的数据)。ZK Server直接查看本地存储(local storage),并告诉客户端结果。ZK Server会声明:“我的数据不一定是最新的。”假如客户端想要最新的数据,ZK Server会同步到Leader并返回最新结果。
情况二:


  • 客户端乙到某个ZK Server请求修改数据(比方ZNode数据)。ZK Server会将该请求提交给Leader,Leader会扣问集群中的其他ZK Server的意见。当凌驾半数的ZK Server同意后,Leader会发布命令,完成数据的修改,ZK Server返回给客户端。
情况三:


  • 假如ZK Server的Leader忽然挂掉,其他ZK Server会发现无法接洽上Leader。此时,ZK集群会启动Leader选举,选举出一个新的Leader。在此期间,客户端请求会被拒绝,直到选举完成。
总结

Paxos是Zookeeper的灵魂,它提供了分布式系统中告竣同等性的底子。通过Paxos,Zookeeper保证了在分布式环境下的同等性与容错性。只管Zookeeper还有其他特性(如Session、Watcher、Version等),但Paxos的核心原理仍然是理解Zookeeper工作的关键。
Zookeeper安装文档

1、上传并解压

上传安装包到master并解压
  1. tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /usr/local/soft
  2. # 重命名
  3. cd /usr/local/soft
  4. mv apache-zookeeper-3.5.7-bin/ zookeeper-3.5.7
复制代码
2、设置环境变量
  1. vim /etc/profile
  2. # 加入下列内容
  3. ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.5.7
  4. export PATH=$PATH:$ZOOKEEPER_HOME/bin
  5. # 重新加载环境变量
  6. source /etc/profile
复制代码
3、修改设置文件
  1. # 切换到配置文件目录
  2. cd /usr/local/soft/zookeeper-3.5.7/conf
  3. # 复制默认配置文件并重命名
  4. cp zoo_sample.cfg zoo.cfg
  5. # 修改配置
  6. vim zoo.cfg
  7. # 找到dataDir并修改
  8. dataDir=/usr/local/soft/zookeeper-3.5.7/data
  9. # 在文件尾部增加
  10. server.0=master:2888:3888
  11. server.1=node1:2888:3888
  12. server.2=node2:2888:3888
复制代码
4、新建相关目录及文件
  1. cd /usr/local/soft/zookeeper-3.5.7
  2. # 创建ZK数据存放位置
  3. mkdir data
  4. cd data
  5. # 在data目录下创建myid文件
  6. touch myid
复制代码
5、同步到其它节点
  1. cd /usr/local/soft/
  2. scp -r zookeeper-3.5.7 node1:`pwd`
  3. scp -r zookeeper-3.5.7 node2:`pwd`
复制代码
6、设置从节点的环境变量

设置node1和node2的环境变量
同步调2中环境变量设置同等
最后记得source
7、修改myid文件

每台都需修改,并且myid都差异
  1. cd /usr/local/soft/zookeeper-3.5.7/data
  2. vim myid
  3. # master ---> myid  --> 0
  4. # node1 ---> myid  --> 1
  5. # node2 ---> myid  --> 2
复制代码
8、启动与停止ZK

三台都需要实行

  • 启动
    1. zkServer.sh start
    复制代码
  • 停止
    1. zkServer.sh stop
    复制代码
  • 查看ZK状态
    通过jps可以查看zk的进程:QuorumPeerMain
    当有一个leader的时间启动成功
    1. zkServer.sh status
    复制代码
9、ZK基本操作

zk  是一个目录布局 ,每个节点可以存数据,同时可以有子节点
  1. # 连接ZK
  2. zkCli.sh
  3. # 创建目录
  4. create /test testData
  5. create /test/a aData
  6. # 获取数据
  7. get /test
  8. # 查看目录
  9. ls /test
  10. # 删除节点
  11. delete /test
  12. # 如果节点非空
  13. deleteall /test
复制代码
10、重置zk

如遇故障,可进行重置
重置将清除ZK中全部数据,慎用!!!

  • 杀掉全部zk进程
    1. # 找到ZK的进程编号pid
    2. kill -9 {pid}
    复制代码
  • 删除数据
    删除data目录下的version文件, 全部节点都要删除
    1. rm -rf /usr/local/soft/zookeeper-3.5.7/data/version-2
    复制代码
  • 重新启动zk
    1. zkServer.sh start
    复制代码
11、设置启停脚本

1.进入脚本运行目录
  1. cd /usr/local/bin
复制代码
2.创建脚本文件
  1. vim zk
复制代码
3.添加以下内容:
  1. #!/bin/sh
  2. case $1 in
  3. "start"){
  4.        for i in master node1 node2
  5.        do
  6.          echo "********$i --> zkServer.sh start **********"
  7.          ssh $i 'source /etc/profile; /usr/local/soft/zookeeper-3.8.4/bin/zkServer.sh start;exit'
  8.        done
  9. };;
  10. "stop"){
  11.    for i in master node1 node2
  12.    do
  13.        echo "********$i --> zkServer.sh stop **********"
  14.        ssh $i 'source /etc/profile; /usr/local/soft/zookeeper-3.8.4/bin/zkServer.sh stop;exit'
  15.    done
  16. };;
  17. "status"){
  18.    for i in master node1 node2
  19.    do
  20.        echo "********$i --> zkServer.sh status **********"
  21.        ssh $i 'source /etc/profile; /usr/local/soft/zookeeper-3.8.4/bin/zkServer.sh status;exit'
  22.    done
  23. };;
  24. "restart"){
  25.    for i in master node1 node2
  26.    do
  27.        echo "********$i --> zkServer.sh restart **********"
  28.        ssh $i 'source /etc/profile; /usr/local/soft/zookeeper-3.8.4/bin/zkServer.sh restart;exit'
  29.    done
  30. };;
  31. esac
复制代码
4.修改文件权限
  1. chmod 777 zk
复制代码
5.直接运行
  1. zk start
复制代码
6.其他命令
  1. zk stop
  2. zk status
  3. zk restart
复制代码
今天的分享就到这了,之后会分享hbase相关的内容。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表