栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

【Java从0到架构师】Zookeeper - 安装、核心工作机制、基本命令

Java 更新时间:发布时间: 百科书网 趣学号

分布式基石 Zookeeper 框架全面剖析
  • Zookeeper 安装、配置、运行
  • Zookeeper 的核心工作机制
    • 特性
    • 数据结构、节点
  • 基本操作命令
    • 服务器的启动和监控
    • 客户端连接
    • 创建节点
    • 查看节点
    • 修改节点数据
    • 删除节点
    • 绑定事件

Java 从 0 到架构师目录:【Java从0到架构师】学习记录

Zookeeper 安装、配置、运行

集群安装的时候建议使用 2n+1

  • 对于集群中的节点,leader 节点和 follower 节点,当 leader 节点挂掉之后,需要在集群中选择一个节点作为 leader 节点,其中选举的策略是少数服从多数·

安装 Zookeeper:注:Zookeeper 是 Java 写的,需要 jdk 的环境

1、上传安装包到服务器

  • 下载地址:https://downloads.apache.org/zookeeper/

2、解压到指定目录

tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz  -C /usr/local/

3、修改文件所在配置目录

zookeeper/conf

# 拷贝配置文件
# cp zoo_sample.cfg zoo.cfg
cat zoo_sample.cfg | grep -v "#" | grep -v "^$" > zoo.cfg

# 在配置文件中添加如下内容
dataDir=/usr/local/apache-zookeeper-3.6.0-bin/data
server.1=192.168.52.128:2888:3888 # M01的ip地址
server.2=192.168.52.129:2888:3888 # M02的ip地址
server.3=192.168.52.130:2888:3888 # M03的ip地址

配置文件解析:

tickTime=2000 # 心跳时间单位(ms): 2s
initLimit=10 # 集群启动的时间限制: 10 * 2000 = 20s
syncLimit=5 # 同步数据的时间限制: 5 * 2000 = 10s
dataDir=/usr/local/apache-zookeeper-3.6.0-bin/data # 数据存放的目录
clientPort=2181 # 客户端连接端口

# 集群中的服务列表 1,2,3 代表服务的 id, 需要和 myid (必须放在 dateDir 目录) 文件中的内容一直, 并且在 1~252 之间
server.1=192.168.52.128:2888:3888 # 2888 数据同步端口 | 3888 选举端口
server.2=192.168.52.129:2888:3888
server.3=192.168.52.130:2888:3888

4、创建数据存储目录,并创建标志文件 myid
在 /root/apps/zookeeper 创建 data 目录:

mkdir -p /root/apps/zookeeper/data
cd /root/apps/zookeeper/data
echo 1 > myid

5、把安装好的配置拷贝到其他的机器

注意: 一定要修改 myid 文件
M001,myid 为 1
M002,修改 myid 为 2
M003,修改 myid 为 3

6、配置 Zookeeper 的环境变量

vi /etc/profile
export ZOOKEEPER_HOME=/root/apps/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

7、启动服务

zkServer.sh start # 启动命令
zkServer.sh status # 查看状态命令
zkServer.sh stop # 停止服务命令
zkServer.sh restart# 停止服务命令
jps # 查看java进程, QuorumPeerMain是Zookeeper的进程

如果遇到无法连接的问题,很有可能是防火墙拦截了端口:
systemctl stop firewalld # 关闭防火墙
systemctl disable firewalld # 禁止防火墙自启

Zookeeper 的日志在 logs/zookeeper-root-server-localhost.localdomain.out,出现问题可以查看这个

Zookeeper 的核心工作机制 特性

1、节点的最佳实践:1 个 leader,2 个 follower 组成的集群

Leader 的选举机制:少数服从多数,选举 leader 时只需要有一半及以上人同意即可,因此 2n + 1 个节点最合适。
如果集群节点比较多,会影响写数据的性能,因为写数据只能在 Leader 节点,并且需要同步到 从节点才可以访问。

2、全局数据一致:每个 server 保存一份相同的数据副本,client 无论连接到哪个 server,数据都是一致的

3、分布式读写,更新请求转发,由 leader 实施

4、更新请求顺序进行,来自同一个 client 的更新请求按其发送顺序依次执行

5、数据更新原子性,一次数据更新要么成功(半数以上节点成功),要么失败

6、实时性,在一定时间范围内,client 能读到最新数据(毫秒级别)

数据量不要超过 1M

数据结构、节点

1、层次化的目录结构,命名符合常规文件系统规范

2、每个节点在 Zookeeper 中叫做 Znode,并且其有一个唯一的路径标识

3、节点 Znode 可以包含数据(只能存储很小量的数据,< 1M)和子节点

但是 EPHEMERAL 类型的节点不能有子节点,后面有讲解

4、客户端应用可以在节点上设置监视器


Znode 有 4 种形式的目录节点:

  • PERSISTENT - 持久化节点
  • PERSISTENT_SEQUENTIAL - 持久化顺序节点
  • EPHEMERAL - 临时节点
  • EPHEMERAL_SEQUENTIAL - 临时节点顺序节点

短暂 (ephemeral):断开连接自己删除
持久 (persistent):断开连接不删除

创建 Znode 时设置顺序标识,Znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护

在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

基本操作命令 服务器的启动和监控
# 服务启动 | 关闭 | 重启 | 状态
zkServer.sh  start | stop | restart | status
#  查看java进程, QuorumPeerMain是Zookeeper的进程
jps
# 监控服务器
netstat -natl

netstat -ntpl
客户端连接

终端中 ctrl + L 清屏

# 如果是连接当前本机地址, 可以使用 zkCli.sh
zkCli.sh -server localhost:2181
# 查看命令所有可以执行的命令
help
创建节点
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
	[-s]: 顺序节点 默认为否
	[-e]: 临时节点 默认为否
	[-c]: 创建一个容器节点
	[-t ttl] 创建一个持久化节点或者一个持久化顺序节点的时候, 指定存活时间
	[path]: 路径 | oloo目录
	[data]: 设置路径下存放的数据
# 创建持久化节点
create /pNod pNode

# 创建临时节点, 临时节点在会话关闭以后, 会自动删除
# 临时节点不允许有子节点
create -e /eNode eNode

# 创建顺序节点
# 顺序节点,允许进行节点重复创建, 默认会在节点后面添加一个全局唯一的顺序ID
create /lock
create -s /lock/getId
create -e -s /lock/getId2

# 创建容器节点
# 容器节点下面存放多个子节点, 当子节点删除完以后容器节点自动删除
# 子节点删除完毕后, 通过定时器, 在一分钟没有子节点, 直接删除该节点znode.container.checkIntervalMs
create -c /cnode cnode
create -c /cnode/child01 child01
create -c /cnode/child02 child02
delete /cnode/child01
delete /cnode/child02
get /cnode
查看节点
ls [-s] [-w] [-R] path
	[-s]: 显示统计信息
	[-w]: 查看事件信息
	[-R]: 显示递归目录 
get [-s] [-w] path
	[-s]: 显示统计信息
	[-w]: 获取事件信息. 只会绑定一次
get -s /pNod

pNode # 获取到的节点数据
cZxid = 0x600000010 # 创建节点的事务Id
ctime = Tue Apr 21 16:23:31 CST 2020 # 创建时间
mZxid = 0x600000010 # 修改的事务ID
mtime = Tue Apr 21 16:23:31 CST 2020 # 修改时间
pZxid = 0x600000010 
cversion = 0 # 当前版本信息
dataVersion = 0 # 数据版本信息
aclVersion = 0 # 权限版本信息
ephemeralOwner = 0x0 # 临时节点的会话ID
dataLength = 5 # 数据长度
numChildren = 0 # 子节点个数
修改节点数据
set [-s] [-v version] path data
	[-s]: 设置过程显示节点的状态信息
	[-v]: 给指定版本的节点设置数据
set -v 0 /node2 node3
set /node2 node3
删除节点
delete [-v version] path
	-v: 在并发的时候, 使用乐观锁进行删除
# 递归删除节点
deleteall /pNod
绑定事件

绑定一次事件:

# 当 eNode 被修改后, 会发出提示, 但是不会知道被修改的值
get -w /eNode

绑定永久的事件:

# 默认绑定当前节点以及子节点的所有的事件:
addWatch [-m mode] path 
	-m PERSISTENT | PERSISTENT_RECURSIVE

常见的事件有:
NodeDataChanged: 节点数据改变事件
NodeChildrenChanged: 子节点数量改变事件
NodeCreated: 节点创建时间
addWatch -m PERSISTENT /eNode  

如果对于数据的获取: 一般绑定的是 NodeDataChanged
如果对于获取子节点列表: 一般绑定的是 NodeChildrenChanged
转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/273687.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号