zookeeper
Posted 福州-司马懿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zookeeper相关的知识,希望对你有一定的参考价值。
前期准备
安装 virtualbox,搭建2台虚拟机,安装 centos8 系统
使用 minimal 的模式,安装命令行模式的系统即可
安装开发工具
JDK
使用 java -version
查看 java 是否安装。若未安装,访问 oracle 官网 https://www.oracle.com/java/technologies/downloads/ ,复制RPM包的链接地址
下载并安装java
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
rpm -ivh jdk-17_linux-x64_bin.rpm
其它
- 如果不支持
ifconfig
命令查看IP,使用dnf -y install net-tools
安装必要的网络工具。 - 使用
yum install wget
安装下载器 - 使用
yum install tar
安装解压器
分别修改主机名(避免混淆)
//主机1
hostnamectl set-hostname PC1
//主机2
hostnamectl set-hostname PC2
设置好后,用putty重连,即可看到新的主机名了
下载zookeeper
在 zookeeper官网下载 zookeeper https://zookeeper.apache.org/releases.html
mkdir download
mkdir software
cd download
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
tar -zvxf apache-zookeeper-3.7.0-bin.tar.gz -C ../software/
cd ../software/apache-zookeeper-3.7.0-bin/
ls
zookeeper的三种模式
单机模式
zookeeper的默认配置文件为 conf/zoo.cfg
,需要使用 cp
命令,将 zoo_sample.cfg
复制为 zoo.cfg
[root@centos2 apache-zookeeper-3.7.0-bin]# cat conf/zoo_sample.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# 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
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
配置说明
- tickTime:服务器与客户端之间交互的基本时间单元(ms)
- dataDir:保存zookeeper数据路径
- dataLogDir:保存zookeeper日志路径,当此配置不存在时,默认路径与dataDir一致
- clientPort:客户端访问zookeeper时使用的端口号
- 启动服务器
./zkServer.sh start
cd bin
sh zkServer.sh start
# 或者
./zkServer.sh start
2. 查看服务器状态 ./zkServer.sh status
3. 启动客户端 ./zkCli.sh
看到控制台输出Welcome to ZooKeeper
说明连接成功
4. 停止服务器 ./zkServer.sh stop
伪集群模式
伪集群模式,主要是在一台设备上模拟集群环境
- 创建3个不同的配置文件
配置文件中会涉及到3种不同类型的端口
- 2181 对client端提供服务
- 2881 集群内机器间相互通讯使用
- 3881 选举leader使用
zoo_1.cfg
tickTime=2000
initLimit=5
dataDir=/tmp/zookeeper/data1
clientPort=2181
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883
zoo_2.cfg
tickTime=2000
initLimit=5
dataDir=/tmp/zookeeper/data2
clientPort=2182
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883
zoo_3.cfg
tickTime=2000
initLimit=5
dataDir=/tmp/zookeeper/data3
clientPort=2183
server.1=127.0.0.1:2881:3881
server.2=127.0.0.1:2882:3882
server.3=127.0.0.1:2883:3883
- 在存放数据的目录创建 myid 文件,用来标识服务器id
mkdir -p /tmp/zookeeper/data1
mkdir -p /tmp/zookeeper/data2
mkdir -p /tmp/zookeeper/data3
echo 1 >> /tmp/zookeeper/data1/myid
echo 2 >> /tmp/zookeeper/data1/myid
echo 3 >> /tmp/zookeeper/data1/myid
- 分别启动服务(若未指明配置文件,默认使用 conf/zoo.cfg)
ssh bin/zkServer.sh start conf/zoo_1.cfg
ssh bin/zkServer.sh start conf/zoo_2.cfg
ssh bin/zkServer.sh start conf/zoo_3.cfg
- 查看zookeeper状态
ssh bin/zkServer.sh status conf/zoo_1.cfg
ssh bin/zkServer.sh status conf/zoo_2.cfg
ssh bin/zkServer.sh status conf/zoo_3.cfg
可以看到只有1个leader,其它两个都是follower
5.使用客户端连接服务器
下面的3个命令可以连接任意一个服务器
ssh bin/zkCli.sh -server localhost:2181
ssh bin/zkCli.sh -server localhost:2182
ssh bin/zkCli.sh -server localhost:2183
集群模式
zookeeper定义
zookeeper 在分布式应用中一般做主从协调、服务器节点动态上下线、同意配置管理、分布式共享锁、统一名称服务等
zookeeper 对外提供了一个类似于文件系统的层次化的数据存储服务,为了保证整个zookeeper集群的容错性和高性能,每个zookeeper集群都是由多台服务器节点组成,这些节点通过复制保证了各个服务器节点之间的数据一致性。只要当这些服务器节点中的过半数可用,那么整个zookeeper集群就可用
角色
zookeeper集群中,会有三种角色:leader、follower、observer,分别对应着总统、议员、观察员。
- leader:是zookeeper集群工作的核心,也是事务性请求(写操作)的唯一调度和处理者,它保证集群事务处理的顺序性,同时负责进行投票的发起和决议,以及更新系统状态
- follower:负责处理客户端的非事务(读操作)请求,如果接收到客户端发来的事务性请求,则会转发给leader,让leader进行处理,同时还负责在leader选举过程中参与投票
- observer:负责观察zookeeper集群最新状态的变化,并且将这些状态进行同步。对于非事务性请求可以进行独立处理;对于事务性请求,则会转发给leader服务器进行处理。它不参与任何形式的投票,只提供非事务性的服务,通常用于在不影响集群事务处理能力的前提下,提升集群的非事务处理能力(提高集群读的能力,也降低了集群选主的复杂程度)
observer观察者是针对查询操作作负载的,observer与follower服务器最大的区别在于observer没有投票权。
- 在客户端发起的增删改操作中,leader服务器是不会把消息传递给observer服务器,让其投票的。
- 但查询操作跟follower一样,客户端的查询到了observer服务器节点,observer服务器去访问leader服务器获取最新的数据,然后返回给客户端
选举机制
选举机制(FastLeaderElection算法):sid最大且被超过集群中半数的机器拥护时,就会成为leader
可以这样理解:客户端的增删改操作无论访问到了哪台zookeeper服务器,最终都会被转发给leader服务器,再由leader服务器分给zookeeper集群中所有的follower服务器去投票(投票指的是在内存中做增删改操作),半数投票通过就被认为操作可执行(commit),否则不可执行
只有两种情况无法选出leader
- 整个集群只有2台服务器(注意不是只剩2台,而是集群的总节点数为2)
- 整个集群超过半数机器挂掉
之所以推荐奇数台集群服务器,其实是集群的优化配置问题,即:集群的容灾数量=集群总节点数/2 - 1
- 2台服务器,至少2台正常运行才行(2的半数为1,半数以上最少为2),正常运行1台服务器都不允许挂掉
- 3台服务器,至少2台正常运行才行(3的半数为1.5,半数以上最少为2),正常运行可以允许1台服务器挂掉
- 4台服务器,至少3台正常运行才行(4的半数为2,半数以上最少为3),正常运行可以允许1台服务器挂掉
- 5台服务器,至少3台正常运行才行(5的半数为2.5,半数以上最少为3),正常运行可以允许2台服务器挂掉
- 6台服务器,至少3台正常运行才行(6的半数为3,半数以上最少为4),正常运行可以允许2台服务器挂掉
偶数台服务器相比于奇数台,除了增加成本,对宕机容错的能力并没有任何提升。因此推荐奇数台服务器
以上是关于zookeeper的主要内容,如果未能解决你的问题,请参考以下文章