分布式协调服务--ZooKeeper

文章目录

  • ZooKeeper
    • zk的由来
    • zk解决了什么问题
  • ZK工作原理
    • ZK数据模型
    • zk功能
      • 1.命名服务
      • 2.状态同步
      • 3.配置中心
      • 4.集群管理
  • zk部署
    • 单机
      • 启动zk
      • 验证zk
    • zk集群
      • 集群角色
      • 选举过程
        • 1.节点角色状态
        • 2.选举ID
        • 3.具体过程
        • 4.心跳机制
        • 5.ZAB协议
      • ZooKeeper 选举示例
        • 1.第一轮投票:
        • 2.节点收到其他投票并更新提议:
        • 3.节点 5 被选为 Leader:
        • 4.其余节点成为 Follower:
    • 集群部署

ZooKeeper

官方网站:https://zookeeper.apache.org/
官方文档:https://zookeeper.apache.org/doc/

zk的由来

ZooKeeper 是由 雅虎(Yahoo!)开发的,用来解决分布式系统中协调和管理的问题。它最早是雅虎为了支持其大规模分布式应用而开发的协调服务。

在分布式系统中,多个节点需要相互协调和通信以保持一致性,而直接实现这些协调任务是非常复杂和容易出错的。雅虎在开发其分布式应用时,发现每次要构建高效且可靠的分布式协调机制都非常困难,特别是在面对节点故障、网络分区等复杂的分布式问题时。因此,雅虎开发了 ZooKeeper 作为一个通用的协调服务,来为分布式系统中的任务提供高效、可靠的协调功能。

zk解决了什么问题

在分布式系统中,有许多常见的协调问题需要解决。ZooKeeper 的设计目标是通过提供一个简单的、高可用的、可扩展的分布式协调服务来解决这些问题。

1.分布式协调的复杂性
在分布式系统中,节点彼此独立运行,它们之间可能存在网络延迟、节点故障或网络分区等问题。要让这些节点协调一致地工作,尤其是保证数据一致性和协调复杂的工作流(如任务调度、分布式锁等),非常困难。ZooKeeper 提供了一套简单的 API,使开发人员无需关心分布式协调的底层复杂性,只需通过 ZooKeeper 的数据模型和 Watch 机制,就可以轻松实现协调功能。

2.一致性问题
分布式系统的一个关键问题是 一致性。当多个节点对同一个共享资源进行操作时,如何确保数据的一致性?例如,多个客户端可能同时读取和写入某个共享的数据,而如果没有有效的协调机制,可能会导致数据不一致。

ZooKeeper 通过其 原子性和顺序一致性 的特性,确保所有节点能够以相同的顺序看到相同的数据变化。它使用 Paxos 类的协议确保每个写操作都在大多数节点上达成共识,从而实现分布式数据的一致性。

3.分布式锁
在分布式系统中,多个客户端可能需要同时访问和修改共享资源,如何避免资源竞争并确保只有一个客户端能同时访问共享资源是一个挑战。ZooKeeper 通过 临时节点 和 有序节点 的机制,简化了分布式锁的实现,使得开发者可以很方便地实现分布式锁和领导者选举。

临时节点:当客户端创建临时节点时,ZooKeeper 保证在客户端会话断开后自动删除节点。这有助于管理分布式系统中的锁和其他资源。有序节点:ZooKeeper 允许创建带有序号的节点,从而可以方便地实现如分布式队列、任务调度等应用场景。

4. Leader 选举
在分布式系统中,有时需要选出一个节点作为 Leader 来协调其他节点的工作,比如处理写请求或分配任务。ZooKeeper 提供了 Leader 选举机制,通过其一致性协议可以快速选出一个 Leader,并确保其他节点知道谁是当前的 Leader。

这一功能广泛应用于集群管理,例如 Hadoop、Kafka 等系统都使用 ZooKeeper 进行 Leader 选举。

5.分布式配置管理
分布式系统通常会有多个节点,这些节点可能需要共享某些配置信息。如果手动管理这些配置信息并在节点之间同步非常麻烦,ZooKeeper 提供了分布式配置管理的功能。

开发者可以将配置存储在 ZooKeeper 中,ZooKeeper 保证这些配置能实时同步到所有的客户端节点。通过 Watch 机制,客户端还能监听配置的变化,当配置更新时,ZooKeeper 会通知所有客户端进行调整。

6.分布式服务注册与发现
在分布式系统中,服务的节点数量通常是动态变化的,某些服务可能会随时加入或离开集群。为了实现 服务注册与发现,ZooKeeper 提供了一个集中的注册服务,服务节点可以将自己的信息注册到 ZooKeeper 中,客户端则可以从 ZooKeeper 上发现并获取这些服务节点的信息。

这为负载均衡、容错等机制提供了基础支持。例如,ZooKeeper 被广泛应用于 Apache Kafka、Dubbo、Hadoop 等框架中作为服务注册与发现的基础组件。

7.故障恢复与高可用性
在分布式系统中,节点故障是不可避免的。如果系统中没有合适的协调机制,故障会导致系统整体不可用。ZooKeeper 通过 复制机制 和 多数决原则,确保即使部分节点故障,集群也能正常运行。

复制机制:ZooKeeper 中的所有数据都被复制到集群中的多个节点上,这样即使某些节点发生故障,其他节点依然可以提供服务。
多数决原则:只要有超过半数的 ZooKeeper 节点正常工作,整个系统就能继续运行。这种机制保证了 ZooKeeper 集群的高可用性。

ZK工作原理

ZK数据模型

在zookeeper 中,节点分为两类第一类是指构成zookeeper集群的主机,称之为主机节点第二类则是指内存中zookeeper数据模型中的数据单元,用来存储各种数据内容,称之为数据节点ZNode.zookeeper内部维护了一个层次关系(树状结构)的数据模型,它的表现形式类似于Linux的文件系统,甚至操作的种类都一致。Zookeeper数据模型中有自己的根目录(/),根目录下有多个子目录,每个子目录后面有若干个文件,由斜杠(/)进行分割的路径,就是一个ZNode,每个ZNode上都会保存自己的数据内容和一系列属性信息.

在这里插入图片描述

zk功能

1.命名服务

命名服务是分布式系统中比较常见的一类场景。命名服务是分布式系统最基本的公共服务之一。在分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等—―这些我们都可以统称它们为名字(Name),其中较为常见的就是一些分布式服务框架(如RPC、RMI)中的服务地址列表,通过使用命名服务,客户端应用能够根据指定名字来获取资源的实体、服务地址和提供者的信息等。

2.状态同步

每个节点除了存储数据内容和node节点状态信息之外,还存储了已经注册的APP的状态信息,当有些节点或APP不可用,就将当前状态同步给其他服务。

3.配置中心

现在我们大多数应用都是采用的是分布式开发的应用,搭建到不同的服务器上,我们的配置文件,同一个应用程序的配置文件一样,还有就是多个程序存在相同的配置,当我们配置文件中有个配置属性需要改变,需要改变每个程序的配置属性,这样会很麻烦的去修改配置,那么可用使用ZooKeeper来实现配置中心。

ZooKeeper 采用的是推拉相结合的方式:客户端向服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端发送Watcher事件通知,客户端接收到这个消息通知后,需要主动到服务端获取最新的数据。

Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,此应用比较流行。

4.集群管理

所谓集群管理,包括集群监控与集群控制两大块,前者侧重对集群运行时状态的收集,后者则是对集群进行操作与控制,在日常开发和运维过程中,我们经常会有类似于如下的需求:

1.希望知道当前集群中究竟有多少机器在工作。
2.对集群中每台机器的运行时状态进行数据收集。对集群中机器进行上下线操作。
ZooKeeper 具有以下两大特性:1.客户端如果对ZooKeeper的一个数据节点注册Wwatcher监听,那么当该数据节点的内容或是其子节点列表发生变更时,Zookeeper服务器就会向已注册订阅的客户端发送变更通知。2.对在ZooKeeper上创建的临时节点,一旦客户端与服务器之间的会话失效,那么该临时节点也就被自动清除。

Watcher(事件监听器)是Zookeeper中的一个很重要的特性。Zookeeper 允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去,该机制是Zookeeper实现分布式协调服务的重要特性。

zk部署

单机

官方文档:https://zookeeper.apache.org/doc/r3.6.2/zookeeperStarted.html#sc_InstallingSingleMode

1.配置Java环境
官方依赖介绍:https://zookeeper.apache.org/doc/r3.8.0/zookeeperAdmin.html#sc_systemReq

2.包安装

[root@ubuntu2204 ~]#apt list zookeeper
正在列表...完成
zookeeper/jammy 3.4.13-6ubuntu4 all[root@ubuntu2204 ~]#apt -y insta11 zookeeper[root@ubuntu2204 ~]#grep -Ev "#|^$” /etc/zookeeper/conf/zoo.cfg
tickTime=2000      服务器与服务器之间的单次心跳检测时间间隔,单位为毫秒
initLimit=10       集群中leader服务器与fo1lower服务器初始连接心跳次数,即多少个2000毫秒
syncLimit=5        leader与fo11ower之间检测发送和应答的心跳次数,如果该fo11ower在时间段5*200不能与leader进行通信,此follower将不可用
dataDir=/var/lib/zookeeper      自定义的zookeeper保存数据的目录
c1ientPort=2181                 客户端连接zookeeper服务器的端口,zookeeper会监听这个端口,接受客户端的访问请求
[root@ubuntu2204 ~]#1s /usr/share/zookeeper/bin/
zkcleanup.sh zkc1i.sh zkEnv.sh zkserver.sh[root@ubuntu2204 ~]#/usr/share/zookeeper/bin/zkServer.sh start
ZooKeeper JMx enab1ed by default
using config: /etc/zookeeper/conf/zoo.cfg
starting zookeeper ... STARTED[root@ubuntu2204 ~]#/usr/share/zookeeper/bin/zkserver.sh status
ZooKeeper JMX enabled by default
using config: /etc/zookeeper/conf/zoo.cfg
Mode: standalone

单机安装脚本
install_zookeeper_single_node.sh

#!/bin/bash
#
#********************************************************************
#Author:            wangxiaochun
#Date:              2020-06-20
#FileName:          install_zookeeper.sh
#URL:               http://www.wangxiaochun.com
#Description:       The test script
#Copyright (C):     2022 All rights reserved
#********************************************************************#支持在线和离线安装ZK_VERSION=3.8.1
#ZK_VERSION=3.8.0
#ZK_VERSION=3.6.3
#ZK_VERSION=3.7.1
#ZK_URL=https://archive.apache.org/dist/zookeeper/zookeeper-${ZK_VERSION}/apache-zookeeper-${ZK_VERSION}-bin.tar.gz
ZK_URL=https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-${ZK_VERSION}/apache-zookeeper-${ZK_VERSION}-bin.tar.gz
#ZK_URL="https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/apache-zookeeper-${ZK_VERSION}-bin.tar.gz"
#ZK_URL="https://downloads.apache.org/zookeeper/stable/apache-zookeeper-${ZK_VERSION}-bin.tar.gz"INSTALL_DIR=/usr/local/zookeeperHOST=`hostname -I|awk '{print $1}'`.  /etc/os-releasecolor () {RES_COL=60MOVE_TO_COL="echo -en \\033[${RES_COL}G"SETCOLOR_SUCCESS="echo -en \\033[1;32m"SETCOLOR_FAILURE="echo -en \\033[1;31m"SETCOLOR_WARNING="echo -en \\033[1;33m"SETCOLOR_NORMAL="echo -en \E[0m"echo -n "$1" && $MOVE_TO_COLecho -n "["if [ $2 = "success" -o $2 = "0" ] ;then${SETCOLOR_SUCCESS}echo -n $"  OK  "    elif [ $2 = "failure" -o $2 = "1"  ] ;then ${SETCOLOR_FAILURE}echo -n $"FAILED"else${SETCOLOR_WARNING}echo -n $"WARNING"fi${SETCOLOR_NORMAL}echo -n "]"echo 
}install_jdk() {if [ $ID = 'centos' -o  $ID = 'rocky' ];thenyum -y install java-1.8.0-openjdk-devel || { color "安装JDK失败!" 1; exit 1; }elseapt updateapt install openjdk-11-jdk -y || { color "安装JDK失败!" 1; exit 1; } #apt install openjdk-8-jdk -y || { color "安装JDK失败!" 1; exit 1; } fijava -version
}install_zookeeper() {if [ -f apache-zookeeper-${ZK_VERSION}-bin.tar.gz ] ;thencp apache-zookeeper-${ZK_VERSION}-bin.tar.gz /usr/local/src/elsewget -P /usr/local/src/ --no-check-certificate $ZK_URL || { color  "下载失败!" 1 ;exit ; }fitar xf /usr/local/src/${ZK_URL##*/} -C /usr/localln -s /usr/local/apache-zookeeper-*-bin/ ${INSTALL_DIR}echo "PATH=${INSTALL_DIR}/bin:$PATH" >  /etc/profile.d/zookeeper.sh.  /etc/profile.d/zookeeper.shmkdir -p ${INSTALL_DIR}/data cat > ${INSTALL_DIR}/conf/zoo.cfg <<EOF
tickTime=2000
initLimit=10
syncLimit=5
dataDir=${INSTALL_DIR}/data
clientPort=2181
maxClientCnxns=128
autopurge.snapRetainCount=3
autopurge.purgeInterval=24
EOFcat > /lib/systemd/system/zookeeper.service <<EOF
[Unit]
Description=zookeeper.service
After=network.target[Service]
Type=forking
#Environment=${INSTALL_DIR}
ExecStart=${INSTALL_DIR}/bin/zkServer.sh start
ExecStop=${INSTALL_DIR}/bin/zkServer.sh stop
ExecReload=${INSTALL_DIR}/bin/zkServer.sh restart[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reloadsystemctl enable --now  zookeeper.servicesystemctl is-active zookeeper.serviceif [ $? -eq 0 ] ;then color "zookeeper 安装成功!" 0  else color "zookeeper 安装失败!" 1exit 1fi   
}install_jdkinstall_zookeeper

启动zk

#查看选项
[root@ubuntu1804~]#zkServer.sh --help#前台启动观察启动过程
[root@ubuntu1804~]#zkServer.sh start-foreground#后台启动
[root@ubuntu1804~]#zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
using config: /usr/local/zookeeper/bin/ ../conf/zoo.cfg
starting zookeeper ... STARTED注意:如果配置service, zkserver.sh和systemctl不要混用,否则无法启动

验证zk

[root@ubuntu1804~]#zkserver.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
client port found: 2181. client address: localhost.client SSL: false.
Mode: standalone
[root@ubuntu1804 ~]#ss -ntpl|grep 2181
LISTEN   0   50       *:2181     *:*       users: (("java",pid=1041,fd=70))[root@ubuntu1804 ~]#pstree -p 1041
java (1041) --{java}(1044)|-{java}(1045)|-{java}(1046)|-{java}(1047)|-{java}(1048)|-{java}(1049)|-{java}(1050)|-{java}(1051)|-{java}(1052)|-{java}(1053)|-{java}(1054)|-{java}(1055)

zk集群

ZooKeeper集群用于解决单点和单机性能及数据高可用等问题。
在这里插入图片描述
在这里插入图片描述
Zookeeper集群基于Master/Slave的模型

处于主要地位负责处理写操作)的主机称为Leader节点,处于次要地位主要负责处理读操作的主机称为follower节点
当进行写操作时,由Master(leader)完成,再同步到其它Slave(follower)节点;而且要求在保证写操作在所有节点的总数过半后;才会认为写操作成功。

生产中读取的方式一般是以异步复制方式来实现的。

对于n台server,每个server都知道彼此的存在。只要有>n/2台server节点可用,整个zookeeper系统保持可用。因此zookeeper集群通常由奇数台Server节点组成。

官方链接:下图表示读的比例越高,性能越好
https://zookeeper.apache.org/doc/r3.7.0/zookeeperOver.html
在这里插入图片描述

集群角色

角色功能简介:1.Leader:领导者是ZooKeeper集群中最核心的角色,所有的写请求都会经过 Leader 处理,它负责将写操作同步给其他节点并保证集群一致性。Leader 还负责管理整个集群的状态以及协调其他节点的选举。2.Follower:跟随者主要负责处理客户端的读请求,并作为写请求的中转,将其转发给 Leader 处理。Follower参与集群中的一致性协议,通过与 Leader 同步数据来保持数据一致性。3.Observer:观察者这是一个特殊的角色,主要处理读请求,不参与投票和写操作的同步,适合在需要扩展读能力的场景下使用,可以减轻集群的写压力。4.Leaarner: 学习者和leader进行状态同步的节点统称Learner,包括:Follower和Observer5.Client:客户端客户端与ZooKeeper集群交互,发起读写请求,依赖于 ZooKeeper的一致性和Watch机制来监控分布式系统的状态变化。

在这里插入图片描述

选举过程

1.节点角色状态
节点角色状态:1.LOOKING:    寻找Leader状态,处于该状态需要进入选举流程2.LEADING:    领导者状态,处于该状态的节点说明是角色已经是Leader3.FOLLOWING:  跟随者状态,表示Leader已经选举出来,当前节点角色是follower4.OBSERVER:   观察者状态,表明当前节点角色是observer
2.选举ID
选举ID;1.ZXID (zookeeper transaction id):每个改变Zookeeper状态的操作都会自动生成一个对应的ZXID。ZXID最大的节点优先选为Leader2.myid:服务器的唯一标识(SID),通过配置myid文件指定,集群中唯一当ZXID一样时,myid大的节点优先选为Leader
3.具体过程
当集群中的zookeeper节点启动以后,会根据配置文件中指定的zookeeper节点地址进行leader选择操作,
过程如下:1.每个zookeeper都会发出投票,由于是第一次选举leader,因此每个节点都会把自己当做leader角色进行选举,每个zookeeper的投票中都会包含自己的myid和zxid,此时zookeeper 1的投票为myid为1,初始zxid有一个初始值0xO,后期会随着数据更新而自动变化,zookeeper 2的投票为myid为2,初始zxid为初始生成的值。2.每个节点接受并检查对方的投票信息,比如投票时间、是否状态为LOOKING状态的投票。3.对比投票,优先检查zxid,如果zxid不一样则zxid大的为leader,如果zxid相同则继续对比myid,myid大的一方为leader成为Leader的必要条件: Leader要具有最高的zid;当集群的规模是n时,集群中大多数的机器(至少n/2+1)得到响应并从follower中选出的Leader。
4.心跳机制
心跳机制: Leader与Follower利用PING来感知对方的是否存活,当Leader无法响应PING时,将重新发起Leader选举。
5.ZAB协议

ZAB(ZooKeeper Atomic Broadcast原子广播)协议是为分布式协调服务zooKeeper专门设计的一种支持崩溃恢复的原子广播协议。在Zookeeper 中,主要依赖ZAB协议来实现分布式数据一致性,基于该协议,Zookeeper实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。

当Leader服务器出现网络中断、崩溃退出与重启等异常情况时,
ZAB(Zookeeper Atomic Broadcast)协议就会进入恢复模式并选举产生新的Leader服务器。
这个过程大致如下:1.Leader Election(选举阶段)︰节点在一开始都处于选举阶段,只要有一个节点得到超半数节点的票数,它就可以当选准leader,2.Discovery(发现阶段)︰在这个阶段,followers跟准leader进行通信,同步followers最近接收的事务提议。3.Synchronization(同步阶段):同步阶段主要是利用leader前一阶段获得的最新提议历史,同步集群中所有的副本。同步完成之后准leader 才会成为真正的leader。4.Broadcast(广播阶段)︰到了这个阶段,Zookeeper集群才能正式对外提供事务服务,并且leader可以进行消息广播。同时如果有新的节点加入,还需要对新节点进行同步

集群特性

整个集群中只要有超过集群数量一半的zookeeper工作是正常的,那么整个集群对外就是可用的。

假如有2台服务器做了一个Zookeeper集群,只要有任何一台故障或宕机,那么这个ZooKeeper集群就不可用了,因为剩下的一台没有超过集群一半的数量,但是假如有三台zookeeper组成一个集群,那么损坏一台就还剩两台,大于3台的一半,所以损坏一台还是可以正常运行的,但是再损坏一台就只剩一台集群就不可用了。那么要是4台组成一个zookeeper集群,损坏一台集群肯定是正常的,那么损坏两台就还剩两台,那么2台不大于集群数量的一半,所以3台的zookeeper集群和4台的zookeeper集群损坏两台的结果都是集群不可用,以此类推5台和6台以及7台和8台都是同理。

ZooKeeper 选举示例

假设 ZooKeeper 集群中有 5 个节点,ID 分别为 1、2、3、4、5,节点的 ZXID 如下:
在这里插入图片描述

1.第一轮投票:

第一轮每个节点都选自己

节点1提议自己为Leader,投票内容为 (ID=1, ZXID=0x100)。
节点2提议自己为Leader,投票内容为 (ID=2, ZXID=0x200)。
节点4提议自己为Leader,投票内容为 (ID=4, ZXID=0x300)。
节点5提议自己为Leader,投票内容为 (ID=5, ZXID=0x400)
2.节点收到其他投票并更新提议:
节点1收到其他节点的投票,发现节点5的ZXID比自己大,更新投票为(ID=5, ZXID=0x400)。
节点2和3同样更新为支持节点5。
节点4也更新为支持节点5。
3.节点 5 被选为 Leader:
最终,节点5获得了超过半数(3 个以上)节点的支持,因此节点5成为新的 Leader。
4.其余节点成为 Follower:
其他节点确认了节点5成为Leader 后,进入FOLLOWING 状态,开始从节点5同步数据。

集群部署

官方文档:https://zookeeper.apache.org/doc/r3.6.2/zookeeperAdmin.html#sc_zkMulitServerSetup

1.环境准备

#三台ubuntu18.04,20.04,22.04
zookeeper-node1.wang.org 10.0.0.101
zookeeper-node2.wang.org 10.0.0.102
zookeeper-node3.wang.org 10.0.0.103#在三个节点都安装]DK8或JDK11
[root@zookeeper-node1 ~]#apt update && apt -y install openjdk-11-jdk
[root@zookeeper-node1 ~]#apt update 8& apt -y install openjdk-8-jdk
[root@zookeeper-node2 ~]#apt update 8& apt -y install openjdk-8-jdk
[root@zookeeper-node3 ~]#apt update && apt -y install openjdk-8-jdk

2.在所有节点下载并解压缩ZooKeeper包文件

[root@zookeeper-node1 ~]#wget -P /usr/local/src https://downJoads.apache.org/zookeeper/stable/apache-zookeeper-3.6.3-bin.tar.gz[root@zookeeper-node1 ~]#tar xf /usr/local/src/apache-zookeeper-3.6.3-bin.tar.gz -c /usr/local/[root@zookeeper-node1 ~]#ln -s /usr/local/apache-zookeeper-3.6.3-bin /usr/local/zookeeper[root@zookeeper-node1 ~]#echo 'PATHE/usr/local/zookeeper/bin:$PATH' > /etc/profile.d/zookeeper .sh
[root@zookeeper-node1 ~]#. /etc/profile.d/zookeeper.sh

3.准备配置文件

#三个节点都要创建数据目录
[root@zookeeper-node1 ~]#mkdir /usr/local/zookeeper/data
#基于模板配置文件生成配置文件
[root@zookeeper-node1 ~]#cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg#修改配置文件
[root@zookeeper-node1 ~]#vim /usr/local/zookeeper/conf/zoo.cfg
#配置文件内容
[root@zookeeper-node1 ~-]#grep -v "\^\#” /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000          服务器与服务器之间的单次心跳检测时间间隔,单位为毫秒
initLimit=10           集群中leader服务器与follower服务器初始连接心跳次数,即多少个2000毫秒syncLimit=5            leader与follower之间连接完成之后,后期检测发送和应答的心跳次数,如果该follower在设置的时间内(5*2000)不能与leader进行通信,那么此 follower将被视为不可用。dataDir=/usr/loca1/zookeeper/data      自定义的zookeeper保存数据的目录clientPort=2181                        客户端连接zookeeper服务器的端口,zookeeper会监听这个端口,接受客户端的访问请求maxclientcnxns=128                    单个客户端IP可以和zookeeper保持的连接数autopurge .snapRetaincount=3          3.4.0中的新增功能:启用后,zooKeeper自动清除功能,会将只保留此最新3个快照和相应的事务日志,并分别保留在dataDir 和dataLogDir中,删除其余部分,默认值为3,最小值为3autopurge.purgeInterval=24           3.4.0及之后版本,ZK提供了自动清理日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能格式: server.MyID服务器唯一编号=服务器IP;
Leader和Follower的数据同步端口(只有leader才会打开):Leader和Follower选举端口(L和F都有)
server.1=10.0.0.101: 2888:3888
server.2=10.0.0.102: 2888:3888
server.3=10.0.0.103: 2888:3888
如果添加节点,只需要在所有节点上添加新节点的上面形式的配置行,在新节点创建myid文件,并重启所有节点服务即可
[root@zookeeper-node1 ~]#scp /usr/local/zookeeper/conf/zoo.cfg 10.0.0.102:/usr/local/zookeeper/conf/
[root@zookeeper-node1 ~]#scp /usr/local/zookeeper/conf/zoo.cfg 10.0.0.103:/usr/local/zookeeper/conf/

4.在各个节点生成ID文件

[root@zookeeper-node1 ~]#echo 1 > /usr/local/zookeeper/data/myid
[root@zookeeper-node2~-]#echo 2 > /usr/local/zookeeper/data/myid
[root@zookeeper-node3 ~]#echo 3 > /usr/local/zookeeper/data/myid

5.各服务器启动Zookeeper

#注意:在所有三个节点快速启动服务,否则会造成集群失败
[root@zookeeper-node1 ~]#zkServer.sh start
[root@zookeeper-node2 ~]#zkServer.sh start
[root@zookeeper-node3 ~]#zkserver.sh start#注意:如果无法启动查看日志
[root@zookeeper-node1 ~]#cat /usr/local/zookeeper/logs/zookeeper-root-server-zookeeper-node1.wang.org.out

6.查看集群状态

[root@zookeeper-node1 ~]#zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. client address: localhost. client SSL: false.
Mode: follower[root@zookeeper-node1 ~]#ss -ntl|grep 888
LISTEN  0    50              [::ffff:10.0.0.101]:3888#只有leader监听2888/tcp端口
[root@zookeeper-node2 ~]#zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config:/usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. client address: localhost.client ssl: fa1se.
Mode: leader
[root@zookeeper-node2~]#ss -ntl|grep 888
LISTEN 0      50      [::ffff:10.0.0.102]:3888       ☆:☆
LISTEN 0      50      [::ffff:10.0.0.102]:3888       ☆:☆[root@zookeeper-node3 ~]#zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config:/usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. client address: localhost.client ssl: false.
Mode: follower
[root@zookeeper-node3~]#ss -ntl|grep 888
LISTEN 0      50      [::ffff:10.0.0.103]:3888       ☆:☆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/53513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity TextMeshPro 设置竖排

默认竖排是这样的 但是我们要的竖排效果并不是这样我们要是竖排连续的根据文本限制来进行换行 第一步我们先设置文本的旋转Z轴为90如下图 然后我们给文本加一个Tag <rotate270> 如下图 但是这个效果还是不是我们想要的效果我们可以使用TexeMeshPro提供的一个选项EnableR…

Python画笔案例-041 绘制正方形阶梯

1、绘制正方形阶梯 通过 python 的turtle 库绘制正方形阶梯&#xff0c;如下图&#xff1a; 2、实现代码 绘制正方形阶梯&#xff0c;以下为实现代码&#xff1a; """正方形阶梯.py """ import turtledef draw_square(length):for _ in range(6…

以太网--TCP/IP协议(一)

概述 以太网是局域网的一种&#xff0c;其他的比如还有令牌环、FDDI。和局域网对应的就是广域网&#xff0c;如Internet&#xff0c;城域网等。 从网络层次看&#xff0c;局域网协议主要偏重于低层&#xff08;业内一般把物理层、数据链路层归为低层&#xff09;。以太网协议…

Qt工程使用MQTT-C库与mqtt服务器数据通信

实现mqtt订阅与发布话题&#xff0c;与mqtt服务器进行数据通信 编译环境&#xff1a;Qt5.15.2 vs2019 需要mqttc库&#xff1a;mqttc.lib, mqttc.dll&#xff08;根据MQTT-C源码编译出来的库&#xff0c;参考cmake编译MQTT-C源码-CSDN博客&#xff09; 一、Qt pro文件编写 …

数据结构C //线性表ADT结构及相关函数

数据结构&#xff08;C语言版&#xff09;严蔚敏 吴伟民 线性表ADT结构及相关函数 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块&#xff08;头文件&#xff0c;函数文件&#xff0c;主文件&#xff09; list.h头文件 /****…

LeetCode 2181.合并零之间的节点

题目描述 给你一个链表的头节点 head &#xff0c;该链表包含由 0 分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val 0 。 对于每两个相邻的 0 &#xff0c;请你将它们之间的所有节点合并成一个节点&#xff0c;其值是所有已合并节点的值之和。然后将所有 0 …

浏览器百科:网页存储篇-如何在Chrome中打开IndexedDB窗格(十一)

1.引言 在现代Web开发中&#xff0c;网页存储技术扮演着至关重要的角色。IndexedDB作为一种低级API&#xff0c;允许客户端存储大量结构化数据&#xff0c;并提供高性能的搜索能力。在上一篇文章中&#xff0c;我们深入探讨了IndexedDB的基础知识及其应用场景。为了更有效地调…

安全产品概述

防火墙 防火墙的核心功能是过滤掉有害的流量&#xff0c;在专用网络和公共网络之间建立保护屏障。防火墙过滤通常基于一系列规则&#xff0c;如 IP 地址、域名、协议、端口号、关键字等&#xff0c;对入站和出站的流量进行过滤。这些规则也称为访问控制列表&#xff08;ACCESS…

网络编程day04(UDP、Linux IO 模型)

目录 【1】UDP 1》通信流程 2》函数接口 1> recvfrom 2> sendto 3》代码展示 1> 服务器代码 2> 客户端代码 【2】Linux IO 模型 场景假设一 1》阻塞式IO&#xff1a;最常见、效率低、不耗费CPU 2》 非阻塞 IO&#xff1a;轮询、耗费CPU&#xff0c;可以处…

Spring Boot属性注入的多种方式!

Spring Boot的一个问题&#xff0c;证明你是不是真正的 "会用" Spring boot ?Spring Boot的一个问题&#xff0c;直接暴露你是不是真正使用Spring Boothttps://mp.weixin.qq.com/s?__bizMzkzMTY0Mjc0Ng&mid2247484040&idx1&sn64ad15d95e44c874cc890973…

2024年CCPC网络赛A题题解 —— 军训Ⅰ(gym105336A)

个人认为很唐的一道题&#xff0c;考虑到不少人可能懒得写&#xff0c;我这里给大家发个代码叭&#xff0c;还有一点点题解&#xff08;因为真的不是很难&#xff09;。这是题面&#xff1a; 然后我来讲讲怎么做&#xff0c;不觉得会有多少人题目意思都理解不了叭&#xff1f;这…

码上进阶_刷题模块测试_用例设计

码上进阶_刷题模块测试_用例设计 系统概述&#xff1a; 码上进阶是为程序员专门打造的交流平台&#xff0c;采用主流的微服务框架和C端技术栈作为技术基础。在这个平台上&#xff0c;程序员 可以通过刷题、练习和模拟面试来提升自己的面试能力。 功能测试&#xff1a; 登录…

Linux 常用命令 - tail 【显示文件最后几行内容】

简介 tail 这个命令源自英文单词 “尾巴”&#xff0c;它的主要功能是显示文件的最后几行内容。通过使用 tail&#xff0c;用户可以查看文件的最新添加内容&#xff0c;特别是对于监控日志文件来说非常有用。tail 命令默认显示文件的最后 10 行&#xff0c;但这可以通过参数调…

数学建模_数据预处理流程(全)

数据预处理整体流程图 一般数据预处理流程 处理缺失值&#xff1a;填补或删除缺失值。处理异常值&#xff1a;检测并处理异常值。数据编码&#xff1a;将分类变量进行标签编码或独热编码。数据标准化/归一化&#xff1a;对数据进行标准化或归一化处理。连续变量离散化&#xff…

基于JAVA+SpringBoot+Vue的企业级工位管理系统

基于JAVASpringBootVue的企业级工位管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; …

WinCC 中对 VBS 进行单步执行调试

以前应该写过文章给各位展示如何在WinCC 中通过自身控件对脚本&#xff08;C、VBS&#xff09;进行脚本诊断和排错。但是也有用户反馈说在编写了一些相对复杂的脚本后&#xff0c;WinCC自身控件无法做到单步调试&#xff0c;也会影响脚本的诊断调试效率。如果能够对WinCC 中的脚…

论文解读:《LAMM: Label Alignment for Multi-Modal Prompt Learning》

系列文章目录 文章目录 系列文章目录LAMM: Label Alignment for Multi-Modal Prompt Learning学习1、论文细节理解1、研究背景2、论文贡献3、方法框架4、研究思路5、实验6、限制 LAMM: Label Alignment for Multi-Modal Prompt Learning学习 1、论文细节理解 VL模型和下游任务…

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统 在产品将要上线之前&#xff0c;需要制作不同类型格式的根文件系统 在产品研发阶段&#xff0c;我们还是需要使用nfs的方式挂载根文件系统 优点&#xff1a;可以直接在上位机中修改文件系统内容&#xff0c;延长EMMC的寿命 【1】重启上位机nfs服…

Docker初识(Docker技术集群与应用)

一、基础设施即服务 IaaS&#xff08;Infrastructure as a Service&#xff09; eg&#xff1a;购买的云服务器&#xff0c;就是IaaS 提供给客户的服务是对所有设施的利用&#xff0c;包括处理、存储、网络和其他基本的计算资源。客户能够部署和运行任意软件&#xff0c;包括…

人工智能安全治理框架导图

资源链接&#xff1a;《人工智能安全治理框架》1.0版发布_中央网络安全和信息化委员会办公室