ZooKeeper 搭建详细步骤之二(伪集群模式)

ZooKeeper 搭建详细步骤之三(真集群)
ZooKeeper 搭建详细步骤之二(伪集群模式)
ZooKeeper 搭建详细步骤之一(单机模式)
ZooKeeper 及相关概念简介

伪集群搭建

ZooKeeper 伪集群是指在一个单一的物理或虚拟机环境中模拟出一个由多个 ZooKeeper 节点构成的集群。尽管这些节点实际上运行在同一台机器上,但它们通过配置不同的端口、数据目录和配置文件,以模拟在真实分布式环境下不同服务器上运行的效果。

伪集群的主要目的是便于开发、测试和学习 ZooKeeper 集群的功能和行为,而不必消耗大量的硬件资源来部署多台独立的物理服务器。

以下是搭建 ZooKeeper 伪集群的一般步骤:

准备工作

  1. 环境要求

    • 安装了 Java 运行环境(JRE 或 JDK),确保版本符合 ZooKeeper 的兼容性要求。
  • 下载并解压 ZooKeeper 的官方发行包到本地目录。
  1. 目录结构

    为每个 ZooKeeper 节点创建独立的数据目录和日志目录,例如:

    zk_node1_data
    zk_node1_log
    zk_node2_data
    zk_node2_log
    zk_node3_data
    zk_node3_log
    # 也可以让数据和日志存放同一个目录,这样只需要三个目录即可
    zk1
    zk2
    zk3
    
  2. 创建 myid 文件

    • 在每个节点的数据目录下创建一个名为 myid 的文本文件
    • 其中仅包含一行,写入对应的节点编号(1、2、3)。
  3. 配置文件

    • 对于每个节点,复制 ZooKeeper 原始发行包中的 conf/zoo.cfg 文件,为每个节点创建对应的配置文件,如:

      zoo1.cfg
      zoo2.cfg
      zoo3.cfg
      
    • 在这些配置文件中设置以下关键参数:

      • dataDir: 指定对应节点的数据目录。

      • clientPort: 分配不同的端口号给每个节点,如 2181、2281、2381。

      • server.x:

        • x 是节点编号,从 1 开始递增。

        • 格式为 server.x=localhost:y:z,其中 localhost 表示本机地址,y 是用于内部通信的选举端口(如 2888 和 3888),z 是数据同步端口(通常与选举端口相差 1000,如 3888 和 4888)。

        • 示例:

          server.1=127.0.0.1:2888:3888
          server.2=127.0.0.1:4888:5888
          server.3=127.0.0.1:6888:7888
          

启动集群

  1. 启动节点

    • 使用如下命令启动每个节点,指定各自的配置文件:

      bin/zkServer.sh start conf/zooX.cfg
      
    • 其中 X 应替换为实际节点编号(1、2、3)。

验证与管理

  1. 检查状态

    • 使用 zkCli.sh 工具连接任意一个节点的客户端端口,检查集群状态:

      bin/zkCli.sh -server localhost:2181
      
    • 在 CLI 中执行 statls / 命令,确认是否能正常连接并查看集群信息。

  2. 模拟故障与恢复

    • 可以通过停止某个节点的进程来模拟节点故障,然后重新启动以观察集群的自我修复能力。

通过以上步骤,您可以在一台机器上搭建起一个由三个节点组成的 ZooKeeper 伪集群,用于学习、测试和验证 ZooKeeper 的集群功能和容错机制。在实际操作时,请参照具体版本的 ZooKeeper 文档,因为配置细节可能会随着版本更新而有所变化。

步骤举例演示

新建三个目录和 myid 文件

[zhang@node1 ~]$ cd /opt/apps/zookeeper/
[zhang@node1 zookeeper]$ ls
bin  conf  docs  lib  LICENSE.txt  logs  NOTICE.txt  README.md  README_packaging.md  zk_data  zk_logs
# 在 zookeeper 安装目录下新建三个目录
[zhang@node1 zookeeper]$ mkdir zk1 zk2 zk3
[zhang@node1 zookeeper]$ ls
bin  conf  docs  lib  LICENSE.txt  logs  NOTICE.txt  README.md  README_packaging.md  zk1  zk2  zk3  zk_data  zk_logs
# 每个目录下 新建 myid 文件 并追加内容分别为1 2 3 
[zhang@node1 zookeeper]$ touch zk1/myid
[zhang@node1 zookeeper]$ echo 1 >> zk1/myid
[zhang@node1 zookeeper]$ touch zk2/myid
[zhang@node1 zookeeper]$ echo 2 >> zk2/myid
[zhang@node1 zookeeper]$ touch zk3/myid
[zhang@node1 zookeeper]$ echo 3 >> zk3/myid
# 查看确认
[zhang@node1 zookeeper]$ cat zk1/myid
1
[zhang@node1 zookeeper]$ 

新建三个配置文件

[zhang@node1 zookeeper]$ cd conf
[zhang@node1 conf]$ ls
configuration.xsl  logback.xml  zoo.cfg  zoo_sample.cfg
# 以 zoo.cfg 为模板,复制出三个配置文件
[zhang@node1 conf]$ cp zoo.cfg zoo1.cfg
[zhang@node1 conf]$ cp zoo.cfg zoo2.cfg
[zhang@node1 conf]$ cp zoo.cfg zoo3.cfg
[zhang@node1 conf]$ ls
configuration.xsl  logback.xml  zoo1.cfg  zoo2.cfg  zoo3.cfg  zoo.cfg  zoo_sample.cfg
[zhang@node1 conf]$ vim zoo1.cfg
# 编辑内容如下

编辑 dataDir 、clientPort、server.1、server.2、server.3

三个配置文件分别编辑下面内容,三个配置文件 clientPort 和 dataDir 不同

在这里插入图片描述

继续编辑

# 继续编辑修改另两个配置文件
[zhang@node1 conf]$ cp zoo1.cfg zoo2.cfg
[zhang@node1 conf]$ cp zoo1.cfg zoo3.cfg
[zhang@node1 conf]$ vim zoo2.cfg
[zhang@node1 conf]$ vim zoo3.cfg# 启动一个节点,这里zkServer 会自动到 conf 目录下找 zoo1.cfg
[zhang@node1 conf]$ zkServer.sh start zoo1.cfg
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/bin/../conf/zoo1.cfg
Starting zookeeper ... STARTED
[zhang@node1 conf]$ zkServer.sh start zoo2.cfg
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/bin/../conf/zoo2.cfg
Starting zookeeper ... STARTED
[zhang@node1 conf]$ zkServer.sh start zoo3.cfg
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/bin/../conf/zoo3.cfg
Starting zookeeper ... STARTED# 启动后,可以查看进程,有三个 QuorumPeerMain
[zhang@node1 conf]$ jps
34962 QuorumPeerMain
30132 QuorumPeerMain
16533 NodeManager
2777 NameNode
2906 DataNode
35036 Jps
34911 QuorumPeerMain
登录节点

登录不同节点的方式,需要打开不同的 shell 窗口

zkCli.sh -server node1:2181

zkCli.sh -server node1:2182

zkCli.sh -server node1:2183

[zhang@node1 mybin]$ zkCli.sh -server node1:2181
Connecting to node1:2181
2024-04-26 14:49:53,975 [myid:] - INFO  [main:o.a.z.Environment@98] - Client environment:zookeeper.version=3.8.4-9316c2a7a97e1666d8f4593f34dd6fc36ecc436c, built on 
#......省略
2024-04-26 14:49:53,991 [myid:] - INFO  [main:o.a.z.c.X509Util@78] - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation
# 省略.......WATCHER::WatchedEvent state:SyncConnected type:None path:null
[zk: node1:2181(CONNECTED) 0] 
集群中角色

如何查看集群中各个节点的角色?

Leader(领导者):

  • 描述:在一个 ZooKeeper 集群中,任何时候都只会有一个 Leader 节点。它是集群的核心,负责处理写请求(如创建、更新、删除节点等操作)以及维护集群状态的一致性。

Follower(跟随者):

  • 描述:Follower 节点是集群中的大多数节点,它们接收并响应客户端的读请求,并参与 Leader 节点发起的事务投票。

可以使用命令:

zkServer.sh status 配置文件.cfg

# 启动三个节点
[zhang@node1 mybin]$ zkServer.sh start /opt/apps/zookeeper/conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/conf/zoo1.cfg
Starting zookeeper ... STARTED
[zhang@node1 mybin]$ zkServer.sh start /opt/apps/zookeeper/conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/conf/zoo2.cfg
Starting zookeeper ... STARTED
[zhang@node1 mybin]$ zkServer.sh start /opt/apps/zookeeper/conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/conf/zoo3.cfg
Starting zookeeper ... STARTED# 结合配置文件查看各个节点状态
[zhang@node1 mybin]$ zkServer.sh status /opt/apps/zookeeper/conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/conf/zoo3.cfg
Client port found: 2183. Client address: localhost. Client SSL: false.
Mode: follower # 跟随者
[zhang@node1 mybin]$ zkServer.sh status /opt/apps/zookeeper/conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/conf/zoo1.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower # 跟随者
[zhang@node1 mybin]$ zkServer.sh status /opt/apps/zookeeper/conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/conf/zoo2.cfg
Client port found: 2182. Client address: localhost. Client SSL: false.
Mode: leader # 领导者#====检查选举
# 停止领导者 node2
[zhang@node1 mybin]$ zkServer.sh stop /opt/apps/zookeeper/conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/conf/zoo2.cfg
Stopping zookeeper ... STOPPED# 再去查看剩余的两个节点,发现 节点3 变成了领导者了
[zhang@node1 mybin]$ zkServer.sh status /opt/apps/zookeeper/conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/conf/zoo3.cfg
Client port found: 2183. Client address: localhost. Client SSL: false.
Mode: leader
[zhang@node1 mybin]$ zkServer.sh status /opt/apps/zookeeper/conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/conf/zoo1.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[zhang@node1 mybin]$ 

到此,ZooKeeper 伪集群的搭建过程完成,同时我们也以此学习了集群中节点的登录、角色查看、选举验证等相关内容。真集群的搭建过程,我们在下一节来详细讲解!
ZooKeeper 搭建详细步骤之三(真集群)
ZooKeeper 搭建详细步骤之二(伪集群模式)
ZooKeeper 搭建详细步骤之一(单机模式)
ZooKeeper 及相关概念简介

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

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

相关文章

【架构】后端项目如何分层及分层领域模型简化

文章目录 一. 如何分层1. 阿里规范2. 具体案例分析 二. 分层领域模型的转换1. 阿里规范2. 模型种类简化分析 三. 小结 本文描述后端项目中如何进行分层,以及分层领域模型简化 一. 如何分层 1. 阿里规范 阿里的编码规范中约束分层逻辑如下: 开放接口层&#xff1a…

【华为 ICT HCIA eNSP 习题汇总】——题目集19

1、(多选)以下选项中,FTP 常用文件传输类型有()。 A、ASCII 码类型 B、二进制类型 C、EBCDIC 类型 D、本地类型 考点:应用层 解析:(AB) 文件传输协议(FTP&…

Mybatis.net + Mysql

项目文件结构 NuGet下载Mybatis.net相关包:IBatisNet 安装完成后,会显示在,在已安装页面。同时,在管理器中的引用列表中,会多出来两个引用文件 IBatisNet.CommonIBatisNet.DataMapper 安装 Mysql.data。 注意&#xff…

WIN10 anaconda 安装 CondaError: Run ‘conda init‘ before ‘conda activate‘

1 下载 https://www.anaconda.com/download/success 2 安装 3 修改环境变量 安装后修改环境变量 4 winrun 进入命令窗口 输入cmd 输入 conda info 5 创建 虚拟环境 conda create -n yolov8 python3.8 -y 6 CondaError: Run ‘conda init’ before ‘conda activate’ c…

基于python+django网易新闻+评论的舆情热点分析平台

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

掌握JavaScript面向对象编程核心密码:深入解析JavaScript面向对象机制对象基础、原型模式与继承策略全面指南,高效创建高质量、可维护代码

ECMAScript(简称ES,是JavaScript的标准规范)支持面向对象编程,通过构造函数模拟类,原型链实现继承,以及ES6引入的class语法糖简化面向对象开发。对象可通过构造函数创建,使用原型链共享方法和属…

界面组件DevExpress中文教程 - 如何在Node.js应用中创建报表?

DevExpress Reporting是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。 获取DevExpress Reporting最新正式版下载(Q技术…

如何查看我的Docker 容器和 `app.py` 脚本有足够的权限来读取 `config.json` 文件

要检查 Docker 容器和 app.py 脚本是否具有读取 config.json 文件的足够权限,你可以按照以下步骤操作: 检查宿主机上的文件权限: 在宿主机上,使用 ls -l 命令查看 config.json 文件的权限。 ls -l /path/to/config.json确保该文件…

【webrtc】MessageHandler 7: 基于线程的消息处理:切换main线程向observer发出通知

以当前线程作为main线程 RemoteAudioSource 作为一个handler 仅实现一个退出清理的功能 首先on message的处理会切换到main 线程 :main_thread_其次,这里在main 线程对sink_ 做清理再次,在main 线程做出状态改变,并能通知给所有的observer 做出on changed 行为。对接mediac…

预编码算法学习笔记

文章目录 1. 基本原理2. 常见应用2.1 自编码器2.2 变分自编码器2.3 稀疏自编码器 3. 学习笔记 在机器学习领域,预编码算法是一种强大的工具,用于将高维数据映射到低维表示,从而提取数据中的重要特征。本文将介绍预编码算法的基本原理、常见应…

.net core ef 连表查询

Information和TypeInfo连表查询 类似: select st.Title1,si.* from [Star_Information] si left join Star_TypeInfo st on si.typeId2st.id 先在EfCoreDbContext.cs配置 protected override void OnModelCreating(ModelBuilder builder){base.OnModelCreating(b…

anaconda的安装和Jupyter Notebook修改默认路径

anaconda的安装 就一个注意事项:在结尾时候记得配置系统环境变量 要是没有配置这个环境变量,后面就不能cmd启动Jupyter Notebook Jupyter Notebook修改默认路径 我们要找到Jupyter Notebook的配置文件 输入下面指令 jupyter notebook --generate-config就可以找到存放配置文…