「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」
zookeeper概要、背景及作用
zookeeper产生背景
项目从单体到分布式转变之后,将会产生多个节点之间协同的问题。如:
1. 每天的定时任务由谁哪个节点来执行?
2. RPC调用时的服务发现?
3. 如何保证并发请求的幂等
4. ....
这些问题可以统一归纳为多节点协调问题,如果靠节点自身进行协调这是非常不可靠的,性能上也不可取。必须由一个独立的服务做协调工作,它必须可靠,而且保证性能。
zookeeper概要
ZooKeeper是用于分布式应用程序的协调服务。它公开了一组简单的API,分布式应用程序可以基于这些API用于同步,节点状态、配置等信息、服务注册等信息。其由JAVA编写,支持JAVA 和C两种语言的客户端。
znode 节点
ookeeper 中数据基本单元叫节点,节点之下可包含子节点,最后以树级方式程现。每个节点拥有唯一的路径path。客户端基于PATH上传节点数据,zookeeper 收到后会实时通知对该路径进行监听的客户端。
节点类型
zookeeper 中节点叫znode存储结构上跟文件系统类似,以树级结构进行存储。不同之外在于znode没有目录的概念,不能执行类似cd之类的命令。znode结构包含如下:
path:唯一路径
childNode:子节点
stat:状态属性
type:节点类型
| 类型 | 描述 |
|---|---|
| PERSISTENT | 持久节点 |
| PERSISTENT_SEQUENTIAL | 持久序号节点 |
| EPHEMERAL | 临时节点(不可在拥有子节点) |
| EPHEMERAL_SEQUENTIAL | 临时序号节点(不可在拥有子节点) |
下边这俩节点类型是3.5.3 版本后新增的
Container 节点
3.5.3 版本新增,如果Container节点下面没有子节点,则Container节点在未来会被Zookeeper自动清除,定时任务默认60s 检查一次
TTL 节点
3.5.3 版本新增, 默认禁用,只能通过系统配置zookeeper.extendedTypesEnabled=true 开启,不稳定
各节点特点
节点介绍与作用
1. PERSISTENT(持久节点)
持久化保存的节点,也是默认创建的
#默认创建的就是持久节点
create /test
2.PERSISTENT_SEQUENTIAL(持久序号节点)
创建时zookeeper 会在路径上加上序号作为后缀,。非常适合用于分布式锁、分布式选举等场景。创建时添加 -s 参数即可。
#创建序号节点
create -s /test
#返回创建的实际路径
Created /test0000000001
create -s /test
#返回创建的实际路径2
Created /test0000000002
3.EPHEMERAL(临时节点)
临时节点会在客户端会话断开后自动删除。适用于心跳,服务发现等场景。创建时添加参数-e 即可。
#创建临时节点, 断开会话 在连接将会自动删除
create -e /temp
4.EPHEMERAL_SEQUENTIAL(临时序号节点)
与持久序号节点类似,不同之处在于EPHEMERAL_SEQUENTIAL是临时的会在会话断开后删除。创建时添加 -e -s
create -e -s /temp/seq
zookeeper部署及常规配置
zookeeper 基于JAVA开发,下载后只要有对应JVM环境即可运行。其默认的端口号是2181运行前得保证其不冲突。
版本选择
官网下载地址zookeeper.apache.org/releases.ht…
目前3.6.3是稳定版本,那么我就下载3.6.3进行安装配置
apache-zookeeper-xxx-tar.gz 代表源代码
apache-zookeeper-xxx-bin.tar.gz 运行版本
下载地址(国外下载太慢,我们从清华镜像这边下载): mirrors.tuna.tsinghua.edu.cn/apache/zook…
部署
wget 下载
cd /usr/local
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
解压
tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz
拷贝默认配置
将原文件复制一份防止以后使用
cd apache-zookeeper-3.6.3-bin/conf/
cp zoo_sample.cfg zoo.cfg
配置文件说明
vim zoo.cfg
zookeeper时间配置中的基本单位 (毫秒)
tickTime=2000
允许follower初始化连接到leader最大时长,它表示tickTime时间倍数 即:initLimit*tickTime
initLimit=10
允许follower与leader数据同步最大时长,它表示tickTime时间倍数
syncLimit=5
zookeper 数据存储目录
dataDir=/tmp/zookeeper
对客户端提供的端口号
clientPort=2181
单个客户端与zookeeper最大并发连接数
maxClientCnxns=60
保存的数据快照数量,之外的将会被清除
autopurge.snapRetainCount=3
自动触发清除任务时间间隔,小时为单位。默认为0,表示不自动清除。
autopurge.purgeInterval=1
我们将数据目录改到zookeeper下面,复制路径修改到dataDir
启动服务
进入bin目录,下面有这些文件
其中
zkServer.sh 为linux的启动命令
zkCli.sh 为客户端连接命令
启动命令
./bin/zkServer.sh start conf/zoo.cfg
设置自启动
1、进入到/ect/init.d目录下,创建zookeeper脚本
cd /etc/init.d
vim zookeeper
2、加入如下脚本
#!/bin/bash
#chkconfig:2345 10 90
#description:service zookeeper
#processname:zookeeper
export JAVA_HOME=/usr/local/java
case $1 in
start) su root /usr/local/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start;;
stop) su root /usr/local/apache-zookeeper-3.6.3-bin/bin/zkServer.sh stop;;
status) su root /usr/local/apache-zookeeper-3.6.3-bin/bin/zkServer.sh status;;
restart) su root /usr/local/apache-zookeeper-3.6.3-bin/bin/zkServer.sh restart;;
*) echo "require start|stop|status|restart" ;;
esac
3、给脚本添加执行权限
chmod +x zookeeper
4、使用service zookeeper start/stop命令来尝试启动关闭zookeeper,使用service zookeeper status查看zookeeper状态。
或者直接 zookeeper start/stop/status
5、添加到开机启动
chkconfig --add zookeeper
此处可能遇到问题:
可以再vi 一下zookeeper文件,看下脚本是否齐全
6、查看开机自启的服务中是否已经有我们的zookeeper
chkconfig --list zookeeper