2. Zookeeper精要-单机多节点

本文介绍Zookeeper单机多节点伪集群的部署方法,通过在一台机器上运行多个实例实现集群效果,有效解决研发阶段资源不足的问题。文章详细介绍了配置步骤及参数说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Zookeeper精要-standalone模式文章中我们有说到,如何安装Zookeeper,如何启动单例模式的Zookeeper实例,今天我们说一下如何部署Zookeeper的单机多节点。

1. 单例模式(Standalone)的缺陷

Zookeeper的单例模式的实例存在一个潜在的单点失效的风险,如果Zookeeper服务失败,整个使用该服务进行分布式调度的应用程序将会全面雪崩且停止运行,因此,在生产环境中,是不推荐使用Zookeeper的单例(Standalone)模式的。

2. Zookeeper 集群

在生产环境中,Zookeeper应该运行在一个有多台机器组成的集群上面,而每台机器上面的Zookeeper部署方式一致,即Zookeeper的可复用模式(replicated mode),此集群我们称之为Zookeeper集群。Zookeeper集群中,机器数目最小推荐3台,一般情况下,生产环境中推荐使用5台机器的Zookeeper集群。在相同的应用程序域中的这些可复用的机器,我们称之为quorum。

在集群模式下,Zookeeper服务的实例运行在多台不同的机器上,在quorum当中的所有服务器,它们的配置文件都是相同的。在一个quorum当中,Zookeeper的实例都是以Leader/Follower的形式运行。quorum当中的实例之一被选为Leader,其余为Follower。如果Leader失效,新的Leader选择将会发生,其他运行的实例将会选举出一个Leader,然而,这些相对复杂的东西对于开发者和Zookeeper的使用者来说都是不可见的。

3. Zookeeper 单机多节点-伪集群

在我们使用Zookeeper的过程中,一般情况下我们只是在生产环境或者UAT环境中才会使用多台机器进行集群的部署,但是在研发过程中,通常情况下我们是没有那么多资源使用的,所以Zookeeper提供了一种可以部署伪集群的方式,即可以在一台机器上运行多个Zookeeper实例。

本文我们部署三个实例的伪集群来给大家阐述伪集群的部署方案。

3.1. 配置Zookeeper

如下图所示,我们在Zookeeper的conf目录中建立三个文件,分别为zoo1.cfg、zoo2.cfg、zoo3.cfg

这里写图片描述

在zoo1.cfg中,我们写入如下内容:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper/zoo1
clientPort=2181
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.3=localhost:2668:3668

在zoo2.cfg中,我们写入如下内容:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper/zoo2
clientPort=2182
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.3=localhost:2668:3668

在zoo3.cfg中,我们写下如下内容:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper/zoo3
clientPort=2183
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.3=localhost:2668:3668

注意我们在以上三个配置文件中dataDir的不同,我们需要建立指定的目录并且在目录中新建myid文件,写入对应的id,同时需要注意clientPort也不同。

在/var/lib/zookeeper目录下建立zoo1、zoo2、zoo3目录

这里写图片描述

在zoo1中新建文件myid并写入1,在zoo2中新建文件myid并写入2,在zoo3中新建文件myid并写入3。

以上配置完成之后,进入Zookeeper的bin目录,按一下方法启动Zookeeper伪集群。

./zkServer.sh start zoo1.cfg
./zkServer.sh start zoo2.cfg
./zkServer.sh start zoo3.cfg

启动之后,分别执行如下命令,可查看对应实例的状态。

./zkServer.sh status zoo1.cfg
./zkServer.sh status zoo2.cfg
./zkServer.sh status zoo3.cfg

这里写图片描述

4. 参数解释

initLimit : 指定在初始化过程中Follower连接Leader的超时限制时间。

超时时间=tickTime*initLimit

syncLimit : 指定Follower同步Leader数据的超时时间。

超时时间=tickTime*syncLimit

[root@localhost kafka]# export ZOOKEEPER_OPTS="-Djava.security.auth.login.config=/usr/local/kafka/config/zookeeper_jaas.conf" [root@localhost kafka]# bin/zookeeper-server-start.sh config/zookeeper.properties [2025-03-21 10:14:57,131] INFO Reading configuration from: config/zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig) [2025-03-21 10:14:57,133] INFO autopurge.snapRetainCount set to 3 (org.apache.zookeeper.server.DatadirCleanupManager) [2025-03-21 10:14:57,133] INFO autopurge.purgeInterval set to 0 (org.apache.zookeeper.server.DatadirCleanupManager) [2025-03-21 10:14:57,133] INFO Purge task is not scheduled. (org.apache.zookeeper.server.DatadirCleanupManager) [2025-03-21 10:14:57,133] WARN Either no config or no quorum defined in config, running in standalone mode (org.apache.zookeeper.server.quorum.QuorumPeerMain) [2025-03-21 10:14:57,151] INFO Reading configuration from: config/zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig) [2025-03-21 10:14:57,152] INFO Starting server (org.apache.zookeeper.server.ZooKeeperServerMain) [2025-03-21 10:14:57,185] INFO Server environment:zookeeper.version=3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT (org.apache.zookeeper.server.ZooKeeperServer) [2025-03-21 10:14:57,185] INFO Server environment:host.name=localhost (org.apache.zookeeper.server.ZooKeeperServer) [2025-03-21 10:14:57,185] INFO Server environment:java.version=1.8.0_181 (org.apache.zookeeper.server.ZooKeeperServer) [2025-03-21 10:14:57,185] INFO Server environment:java.vendor=Oracle Corporation (org.apache.zookeeper.server.ZooKeeperServer) [2025-03-21 10:14:57,185] INFO Server environment:java.home=/usr/java/jdk1.8.0_181/jre (org.apache.zookeeper.server.ZooKeeperServer) [2025-03-21 10:14:57,185] INFO Server environment:java.class.path=.:{JAVA_HOME}/lib:/usr/java/jdk1.8.0_181/jre/lib::/usr/local/kafka/bin/../libs/activation-1.1.1.jar:/usr/local/kafka/bin/../libs/aopalliance-repackaged-2
最新发布
03-22
<think>好的,我现在需要解决用户的问题:为什么ZooKeeper在没有配置quorum的情况下会以standalone模式运行。首先,我需要回忆一下ZooKeeper的基本配置和启动模式。 根据引用[3],单点模式(standalone)用于开发测试,不提供高可用性。而Quorum模式需要多个服务器组成集群。用户提到没有配置quorum却进入了standalone模式,这可能和配置文件的参数有关。通常,ZooKeeper的配置文件是zoo.cfg,里面需要设置server条目来定义集群成员。如果没有这些配置,ZooKeeper可能默认进入单机模式。 接下来,检查用户提供的引用。引用[2]显示在运行zkServer.sh status时,模式显示为standalone,并且配置文件路径正确。用户可能在配置文件中没有正确设置server相关的参数,或者配置被错误修改了。另外,引用[4]提到用户可能在未停止服务的情况下修改了配置,导致进程残留,可能影响了新配置的加载。 此外,引用[5]提到Standalone模式是独立部署,不依赖其他平台。这可能说明如果ZooKeeper检测不到集群配置,就会自动回退到standalone模式。因此,用户需要检查zoo.cfg中是否有server.x=host:port:port的配置项,以及是否配置了initLimit和syncLimit等集群相关参数。如果没有这些,ZooKeeper无法形成quorum,只能以单机模式运行。 另外,可能用户之前配置错误,然后删除了ZooKeeper并重新分发文件,但旧的进程未被杀死(如引用[4]所述),导致新的配置没有被正确加载。这时候需要确保所有旧进程都被终止,再重新启动服务,以便读取正确的配置。 总结原因可能包括:配置文件中缺少集群配置、配置错误、旧进程未清理导致新配置未生效。解决方法包括检查配置文件,确保集群参数正确,清理旧进程后重启服务。</think>### 为什么 ZooKeeper 在没有配置 quorum 的情况下会以 standalone 模式运行? #### 1. **ZooKeeper 的默认行为** - ZooKeeper 的启动模式由配置文件 `zoo.cfg` 中的参数决定。如果未显式配置集群相关的 `server.x` 条目(例如 `server.1=node1:2888:3888`),ZooKeeper **默认会进入 standalone 模式**,因为它无法检测到其他节点以形成 quorum 集群[^3][^5]。 #### 2. **配置文件的缺失或错误** - **关键配置项缺失**:Quorum 模式需要至少包含以下配置: ```properties initLimit=10 syncLimit=5 server.1=node1:2888:3888 server.2=node2:2888:3888 server.3=node3:2888:3888 ``` 如果这些条目缺失或格式错误,ZooKeeper 将无法识别集群配置,自动回退到 standalone 模式[^5]。 - **数据目录未初始化**:即使配置了 `server.x`,如果未在 `dataDir` 目录下创建 `myid` 文件(包含当前节点的唯一ID),ZooKeeper 也会拒绝加入集群,转而以 standalone 模式启动[^4]。 #### 3. **进程残留导致配置未生效** - 如果之前未正确停止 ZooKeeper 服务(例如通过 `zkServer.sh stop`),旧进程可能仍在运行。此时修改配置文件后重启,新配置可能未被加载,导致服务继续以旧的 standalone 模式运行[^4]。 --- ### 排查步骤 1. **检查配置文件 `zoo.cfg`** - 确认是否包含 `server.x` 条目。 - 验证文件路径是否正确(如引用[2]中显示的 `/opt/module/zookeeper-3.5.7/conf/zoo.cfg`)。 2. **验证 `myid` 文件** - 进入 `dataDir` 目录,检查是否存在 `myid` 文件,且内容与 `server.x` 中的ID匹配。 3. **清理残留进程** - 执行 `jps` 查找残留的 `QuorumPeerMain` 进程,手动终止后再重启服务。 4. **查看日志文件** - 检查 `zookeeper.out` 或日志目录中的输出,确认启动时是否报错(如集群配置解析失败)。 --- ### 示例配置对比 | **Standalone 模式** | **Quorum 模式** | |----------------------------------|------------------------------------| | 无需 `server.x` 条目 | 必须定义 `server.x` 条目 | | 仅用于本地测试 | 支持高可用和数据一致性 | | 日志中显示 `Mode: standalone`[^2] | 日志中显示 `Mode: leader/follower` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RonTech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值