
Zookeeper 安装、配置、运行Java 从 0 到架构师目录:【Java从0到架构师】学习记录
集群安装的时候建议使用 2n+1
安装 Zookeeper:注:Zookeeper 是 Java 写的,需要 jdk 的环境
1、上传安装包到服务器
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 种形式的目录节点:
短暂 (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