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时使用的端口号
  1. 启动服务器./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

伪集群模式

伪集群模式,主要是在一台设备上模拟集群环境

  1. 创建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
  1. 在存放数据的目录创建 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
  1. 分别启动服务(若未指明配置文件,默认使用 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

  1. 查看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的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

Zookeeper中节点操作代码

Zookeeper客户端java代码操作

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

Java代码操作zookeeper