ZooKeeper--分布式协调服务

news2024/12/23 9:13:52

文章目录

  • 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/zookeeper


HOST=`hostname -I|awk '{print $1}'`

.  /etc/os-release

color () {
    RES_COL=60
    MOVE_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_COL
    echo -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' ];then
        yum -y install java-1.8.0-openjdk-devel || { color "安装JDK失败!" 1; exit 1; }
    else
        apt update
        apt install openjdk-11-jdk -y || { color "安装JDK失败!" 1; exit 1; } 
        #apt install openjdk-8-jdk -y || { color "安装JDK失败!" 1; exit 1; } 
    fi
    java -version
}


install_zookeeper() {
    if [ -f apache-zookeeper-${ZK_VERSION}-bin.tar.gz ] ;then
        cp apache-zookeeper-${ZK_VERSION}-bin.tar.gz /usr/local/src/
    else
        wget -P /usr/local/src/ --no-check-certificate $ZK_URL || { color  "下载失败!" 1 ;exit ; }
    fi
    tar xf /usr/local/src/${ZK_URL##*/} -C /usr/local
    ln -s /usr/local/apache-zookeeper-*-bin/ ${INSTALL_DIR}
    echo "PATH=${INSTALL_DIR}/bin:$PATH" >  /etc/profile.d/zookeeper.sh
    .  /etc/profile.d/zookeeper.sh
    mkdir -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
EOF
	cat > /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
EOF
    systemctl daemon-reload
    systemctl enable --now  zookeeper.service
    systemctl is-active zookeeper.service
	if [ $? -eq 0 ] ;then 
        color "zookeeper 安装成功!" 0  
    else 
        color "zookeeper 安装失败!" 1
        exit 1
    fi   
}


install_jdk

install_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和Observer

  5.Client:客户端
      客户端与ZooKeeper集群交互,发起读写请求,依赖于 ZooKeeper的一致性和Watch机制来监控分布式系统的状态变化。

在这里插入图片描述

选举过程

1.节点角色状态
节点角色状态:
  1.LOOKING:    寻找Leader状态,处于该状态需要进入选举流程
  2.LEADING:    领导者状态,处于该状态的节点说明是角色已经是Leader
  3.FOLLOWING:  跟随者状态,表示Leader已经选举出来,当前节点角色是follower
  4.OBSERVER:   观察者状态,表明当前节点角色是observer
2.选举ID
选举ID;
   1.ZXID (zookeeper transaction id):每个改变Zookeeper状态的操作都会自动生成一个对应的ZXID。ZXID最大的节点优先选为Leader
   2.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,最小值为3
                                      
autopurge.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.coloradmin.cn/o/2123345.html

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

相关文章

Flutter学习之一搭建开发环境

Flutter学习之一:搭建ununtu系统开发环境 一.背景 随着企业发展跟环境的变化&#xff0c;目前大前端开发越来越火&#xff0c;在国内应该是一个趋势&#xff1b;个人的技术栈主要还是在原生安卓开发上&#xff1b;长江后浪推前浪&#xff0c;如果不及时学习新知识&#xff0c…

中文文本分类详解及与机器学习算法对比

一.文本分类 文本分类旨在对文本集按照一定的分类体系或标准进行自动分类标记&#xff0c;属于一种基于分类体系的自动分类。文本分类最早可以追溯到上世纪50年代&#xff0c;那时主要通过专家定义规则来进行文本分类&#xff1b;80年代出现了利用知识工程建立的专家系统&…

首届云原生编程挑战赛总决赛冠军比赛攻略_greydog.队

关联比赛: 首届云原生编程挑战赛【复赛】实现一个 Serverless 计算服务调度系统 一、初赛赛道一&#xff08;实现一个分布式统计和过滤的链路追踪&#xff09; 赛题分析 1、数据来源 采集自分布式系统中的多个节点上的调用链数据&#xff0c;每个节点一份数据文件。数据格式…

系统架构师考试学习笔记第四篇——架构设计实践知识(21)安全架构设计理论与实践

本章考点&#xff1a; 第21课时主要学习信息系统中安全架构设计的理论和工作中的实践。根据考试大纲,本课时知识点会涉及案例分析题和论文题(各占25分),而在历年考试中,综合知识选择题目中也有过诸多考查。本课时内容侧重于知识点记忆;,按照以往的出题规律,安全架构设计基础知识…

工具知识 | Linux常用命令

参考 linw7的github《鸟哥的Linux私房菜》 一.文件管理 1.文件查找&#xff1a;find2.文件拷贝&#xff1a;cp3.打包解包&#xff1a;tar 二.文本处理 1.(显示行号)查看文件&#xff1a;nl2.文本查找&#xff1a;grep3.排序&#xff1a;sort4.转换&#xff1a;tr5.切分文本&…

Web 基础——Apache

Event Worker 的升级版、把服务器进程和连接进行分析&#xff0c;基于异步 I/O 模型。 请求过来后进程并不处理请求&#xff0c;而是直接交由其它机制来处理&#xff0c;通过 epoll 机制来通知请求是否完成&#xff1b; 在这个过程中&#xff0c;进程本身一直处于空闲状态&am…

【目标检测数据集】铁轨表面缺损检测数据集4789张VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4789 标注数量(xml文件个数)&#xff1a;4789 标注数量(txt文件个数)&#xff1a;4789 标注…

只有IP地址没有域名怎么实现HTTPS访问?

&#x1f510; 实现IP地址HTTPS访问 &#x1f310; 确认公网IP地址 公网IP&#xff1a;确保你拥有一个公网IP地址&#xff0c;或者内网映射公网&#xff0c;这是实现HTTPS访问的前提。 &#x1f4dd; 选择证书颁发机构&#xff08;CA&#xff09; 选择CA&#xff1a;选择一个…

【Qt】Qt音频

Qt 音频 在 Qt 中&#xff0c;⾳频主要是通过 QSound 类来实现。但是需要注意的是 QSound 类只⽀持播放 wav 格式的⾳频⽂件。也就是说如果想要添加⾳频效果&#xff0c;那么⾸先需要将 ⾮wav格式 的⾳频⽂件转换为 wav 格式。 【注意】使⽤ QSound 类时&#xff0c;需要添加模…

【C#Mutex】 initiallyOwned错误引起的缺陷

临界区只能对同一个进程的不同线程同步&#xff0c;互斥量可以跨进程同步。典型应用场景&#xff1a;两个exe会操作同一个注册表项。 错误代码 封装类 public class CMutexHelp : IDisposable {public CMutexHelp(){s_mutex.WaitOne();} private static Mutex s_mutex …

深度学习-目标检测(二)Fast R-CNN

一&#xff1a;Fast R-CNN Fast R-CNN 是一篇由Ross Girshick 在 2015 年发表的论文&#xff0c;题为 “Fast R-CNN”。这篇论文旨在解决目标检测领域中的一些问题&#xff0c;特别是传统目标检测方法中存在的速度和准确性之间的矛盾。 论文摘要&#xff1a;本文提出了一种基于…

关于tomcat如何设置自启动的设置

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、Windows 下的设置服务自启2.1 服务的注册2.2 开启自启 三、MacOS下设置服务自启…

ROS CDK魔法书:建立你的游戏王国(Python篇)

引言 在虚拟游戏的世界里&#xff0c;数字化的乐趣如同流动的音符&#xff0c;谱写着无数玩家的共同回忆。而在这片充满创意与冒险的乐园中&#xff0c;您的使命就是将独特的游戏体验与丰富的技术知识相结合&#xff0c;打造出令人难以忘怀的作品。当面对如何实现这一宏伟蓝图…

【数据结构】4——树和森林

数据结构——4树和森林 笔记 文章目录 数据结构——4树和森林树的存储结构双亲表示法孩子链表孩子兄弟表示法&#xff08;二叉树表示法、二叉链表表示法&#xff09; 树与二叉树转换森林和二叉树转化森林转二叉树二叉树转森林 树和森林的遍历树先根后根层次 森林 树的存储结构…

使用nvm工具实现多个nodejs版本的维护和切换

NodeJS的升级比较快&#xff0c;在开发中要使用最新的版本&#xff0c;必须经常升级&#xff0c;但对于一些老项目可能又要使用低版本的NodeJS&#xff0c;虽然可以在系统中同时安装多个NodeJS的版本&#xff0c;然后通过修改环境变量的方式实现切换&#xff0c;但这种方法太麻…

断点回归模型

断点回归&#xff08;Regression Discontinuity Design, RDD&#xff09;是一种准实验设计方法&#xff0c;用于评估政策或其他干预措施的效果。这种方法利用了一个清晰的阈值或“断点”&#xff0c;在这个阈值上&#xff0c;处理状态&#xff08;例如是否接受某种干预&#xf…

浅谈为什么数据库要用B树

朋友,你有没有遇到过这样的情况?明明数据库里存的东西还不算太多,可一查数据,页面加载慢得像蜗牛?别急,问题可能出在你的数据库索引上。而今天我要跟你聊的,就是在数据库里被广泛应用的B树(B-Trees),它可是提升数据库性能的秘密武器。听起来有点深奥?别担心,我会用…

C程序设计——再说说函数参数的值传递

上一篇的最后&#xff0c;我强调了C语言里&#xff0c;所有函数参数的传递&#xff0c;都是值传递&#xff0c;即形参值改变&#xff0c;不影响实参的值。 指针作为函数参数 我们知道&#xff0c;指针也是C语言的一个类型&#xff0c;所以指针&#xff0c;也可以作为函数参数…

【TPAMI 2024】一种用于混合事件-帧摄像机的异步线性滤波器架构

题目&#xff1a;An Asynchronous Linear Filter Architecture for Hybrid Event-Frame Cameras 一种用于混合事件-帧摄像机的异步线性滤波器架构 作者&#xff1a;Ziwei Wang; Yonhon Ng; Cedric Scheerlinck; Robert Mahony 摘要 事件相机非常适合捕捉高动态范围(HDR)视觉…

运维保障高效化的智慧能源开源了

一、简介 AI视频监控平台, 是一款功能强大且简单易用的实时算法视频监控系统。愿景在最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;减少企业级应用约 95%的开发成本&#xff0c;在强大视频算…