伪分布zookeeper一台机三个节点
参考文献:
https://blog.csdn.net/weixin_53727695/article/details/137554882?spm=1001.2014.3001.5501
按照林子雨教程下载并安装了zookeeper,后来发现zookeeper要三个节点,就去找了其他方法配置。
因为我是配置好了zookeeper,所有我现在的zookeeper下面就有了数据存储文件data
日志存储文件 logs
- 原本zookeeper目录下 /usr/local/zookeeper
复制三份:
cp -r zookeeper /usr/local/zookeeper01
cp -r zookeeper /usr/local/zookeeper02
cp -r zookeeper /usr/local/zookeeper03
如果它提示你没有找到该文件目录,那有可能是权限问题
解决:
sudo cp -r zookeeper /usr/local/zookeeper01
sudo cp -r zookeeper /usr/local/zookeeper02
sudo cp -r zookeeper /usr/local/zookeeper03
- 新建myid文件
因为我本来就已经建好了配置文件 数据存储文件是data 数据日志文件是logs
如果没建好的可以按照下面步骤: 要进之前复制出来的三个zookeeper0?目录下,里面mkdir{dataDir,datalogDir}
cd /usr/local/zookeeper01
mkdir {dataDir,dataLogDir} #zookeeper01,zookeeper02,zookeeper03都要创建
cd /usr/local/zookeeper02
mkdir {dataDir,dataLogDir}
cd /usr/local/zookeeper03
mkdir {dataDir,dataLogDir}
cd /usr/local/zookeeper01/dataDir/
vim myid #在里面输入1
cd /usr/local/zookeeper02/dataDir/
vim myid #在里面输入2
cd /usr/local/zookeeper03/dataDir/
vim myid #在里面输入3
推荐这个:#类似下面这样
#echo "1" > /usr/local/zookeeper01/dataDir/myid
#echo "2" > /usr/local/zookeeper02/dataDir/myid
#echo "3" > /usr/local/zookeeper03/dataDir/myid
如果执行不了,或者写了之后退出不了,有可能是权限问题:
解决:
sudo sh -c 'echo "1" > /usr/local/zookeeper01/data/myid'
sudo sh -c 'echo "2" > /usr/local/zookeeper02/data/myid'
sudo sh -c 'echo "3" > /usr/local/zookeeper03/data/myid'
然后查看当前文件是否成功输入:
cat /usr/local/zookeeper01/data/myid
cat /usr/local/zookeeper02/data/myid
cat /usr/local/zookeeper03/data/myid
3.配置zoo.cfg文件
cd /usr/local/zookeeper01/conf
cp /usr/local/zookeeper01/conf/zoo_sample.cfg zoo.cfg 这个因为我之前已经配过了 已经有复制过了,所有我这里就不需要复制了,如果没有复制过的就复制
vim /usr/local/zookeeper01/conf/zoo.cfg
如果读写保存不了,那也有可能是权限问题,所有直接用sudo命令执行:
sudo vim /usr/local/zookeeper01/conf/zoo.cfg
配置zookeeper01的zoo.cfg
tickTime=2000 #默认有
initLimit=10 #默认有
syncLimit=5 #默认有
dataDir=/usr/local/zookeeper01/data #要改!即前面新建的路径 我的是data
dataLogDir=/usr/local/zookeeper01/logs #要改!同理 我的是logs
clientPort=2181 #该服务的端口号
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
**** 配置zookeeper02的zoo.cfg****:sudo vim /usr/local/zookeeper02/conf/zoo.cfg
cd /usr/local/zookeeper02/conf
cp /usr/local/zookeeper02/conf/zoo_sample.cfg zoo.cfg
sudo vim /usr/local/zookeeper02/conf/zoo.cfg
配置内容:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper02/data #修改指定路径
dataLogDir=/usr/local/zookeeper02/logs ##修改指定路径
clientPort=2182 #端口号要更改,不能与其他服务端口冲突
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
配置zookeeper03的zoo.cfg****:
cd /usr/local/zookeeper03/conf
cp /usr/local/zookeeper03/conf/zoo_sample.cfg zoo.cfg
vim /usr/local/zookeeper03/conf/zoo.cfg
配置内容:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper03/data #修改指定路径
dataLogDir=/usr/local/zookeeper03/logs ##修改指定路径
clientPort=2183 #端口号要更改,不能与其他服务端口冲突
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
配置的时候一定要谨慎检查!!!
**** 此步骤要谨慎布置,仔细检查,如果配置错误容易导致后面启动失败!同理启动失败时回来查看文件修改是否有误!****
4.启动集群
(这里启动失败的话可能由于权限不足,授予权限sudo chmod -R 777 /usr/local,再进入目录./zkServer.sh start)
但我改了权限之后还是报错 开不了zookeeper,就去检查了配置文件,发现是主机ip
有误,还有就是我把server1.后面的注释去除之后就可以了,我也不知道是不是这个错误,但最好还是IP后面不要有注释,这样也可能有错
ZooKeeper 启动失败可能有以下几个原因:
- 配置文件错误:请检查 zoo.cfg 配置文件是否有拼写错误,比如 initLimit 是否正确设置。从搜索结果中可以看到,一个常见的错误是 initLimit 没有设置或者拼写错误,这会导致启动失败。****(一般是配置文件问题)
- 端口未开放:确保配置文件中用到的所有端口都已经在防火墙中开放,并且添加到安全组中。
- 权限问题:检查 dataDir 指定的目录是否有写权限。如果权限不足,您可能需要更改目录的权限,例如使用 sudo chown -R 用户名:用户名 赋予的文件路径 来赋予权限。****(一般不是这个问题)
要检查 dataDir 指定的目录是否有写权限,你可以按照以下步骤操作:
①查看当前权限: 使用 ls -ld 命令来查看 dataDir 目录的当前权限和所有者。例如,如果你的 dataDir 是 /usr/local/zookeeper01/data,你可以执行:
bash
ls -ld /usr/local/zookeeper01/data
这将显示类似于以下的输出:
drwxr-xr-x 2 root root 4096 Dec 1 12:34 /usr/local/zookeeper01/data
这里的 drwxr-xr-x 表示目录的权限,其中 d 表示这是一个目录,rwx 表示所有者(在这里是 root)有读、写和执行的权限,r-x 表示组有读和执行的权限,r-x 表示其他用户也有读和执行的权限。
②检查当前用户: 使用 whoami 命令来查看当前用户:
bash
whoami
这将返回你当前登录的用户名。
③检查写权限: 如果 dataDir 的所有者是 root,而你不是以 root 用户登录的,那么你需要检查你的用户是否属于 root 组,或者目录的权限是否允许你的用户写入。你可以使用以下命令来检查你的用户是否属于 root 组:
bash
groups
这将列出你当前用户所属的所有组。
- 更改权限: 如果没有写权限,你可以使用 chmod 命令来更改目录的权限,例如,给所有用户添加写权限:
bash
sudo chmod 777 /usr/local/zookeeper01/data
或者,给组添加写权限(如果你的用户属于该组):
bash
sudo chmod 775 /usr/local/zookeeper01/data
请注意,777 权限是非常开放的,任何人都可以读写执行,这可能不安全。通常建议使用更严格的权限,例如 755(所有者可以读写执行,组和其他用户可以读执行)。
②更改所有者: 如果你的用户不是 dataDir 的所有者,你可以使用 chown 命令来更改所有者,例如:
bash
sudo chown -R $(whoami):$(whoami) /usr/local/zookeeper01/data
这将把 dataDir 目录及其子目录的所有者和组更改为你当前的用户。
- 日志文件查看:查看 ZooKeeper 的日志文件,通常位于 dataDir 配置的目录下,文件名称为 zookeeper.out。通过查看日志文件可以找到具体的错误信息。
- 使用 start-foreground 查看错误:您可以尝试使用 ./zkServer.sh start-foreground 命令来启动 ZooKeeper,这样可以在前台显示详细的错误信息,帮助您定位问题。****(这个可以很好的查看问题出现在哪,可以直接执行这个命令解决)
- 检查 myid 文件:确保每个 ZooKeeper 节点的 dataDir 目录下都有 myid 文件,并且文件中的数字与 zoo.cfg 中的 server.X 配置相匹配。****(这个也很重要,一定要先对应!!!)
- 检查 Java 环境:确保 Java 环境已正确配置,并且 JAVA_HOME 环境变量已设置。ZooKeeper 启动脚本需要找到 Java 路径。
- 检查 ZooKeeper 版本:确保您下载的是正确的 ZooKeeper 安装包,从 Zookeeper 3.5.7 版本开始,官方发布了两个不同的压缩包,确保下载并解压 apache-zookeeper-x.x.x-bin.tar.gz 包。
我真的检查了好多次配置问题:
直接执行这个命令,查看启动失败的主要原因:./zkServer.sh start-foreground
hadoop@ubuntu:/usr/local/zookeeper01/bin$ ./zkServer.sh start-foreground
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper01/bin/../conf/zoo.cfg
2024-11-30 09:34:45,567 [myid:] - INFO [main:QuorumPeerConfig@133] - Reading configuration from: /usr/local/zookeeper01/bin/../conf/zoo.cfg
2024-11-30 09:34:45,576 [myid:] - INFO [main:QuorumPeerConfig@385] - clientPortAddress is 0.0.0.0/0.0.0.0:2181
2024-11-30 09:34:45,576 [myid:] - INFO [main:QuorumPeerConfig@389] - secureClientPort is not set
2024-11-30 09:34:45,586 [myid:] - ERROR [main:QuorumPeerMain@89] - Invalid config, exiting abnormally
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Address unresolved: 127.0.0.1:3889 #å¯å¦å¤æ‰“开一个ç»ç«¯ä½¿ç”¨ip addr show查看自己ç
IP
at org.apache.zookeeper.server.quorum.QuorumPeer$QuorumServer.<init>(QuorumPeer.java:279)
at org.apache.zookeeper.server.quorum.flexible.QuorumMaj.<init>(QuorumMaj.java:89)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.createQuorumVerifier(QuorumPeerConfig.java:595)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseDynamicConfig(QuorumPeerConfig.java:628)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.setupQuorumPeerConfig(QuorumPeerConfig.java:601)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:420)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:150)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:113)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:82)
Invalid config, exiting abnormally(地址解析错误,这表明 ZooKeeper 无法解析配置文件中指定的地址 127.0.0.1:3889)
解决:****这个问题通常是由于以下几个原因造成的:
- 端口冲突:确保端口 3889 没有被其他服务占用。您可以使用 netstat -tulnp 命令来检查端口使用情况。
- 配置错误:检查 zoo.cfg 配置文件中的 server.X 配置项,确保每个 server.X 的地址和端口配置正确。对于单机测试,您可以将所有 server.X 配置为相同的地址和不同的端口,如下所示:
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890****(后来我就是把这个解析删掉之后,在去开zookeeper就可以了,所以后面最好不要加注释!!!)
- 网络配置问题:确保 127.0.0.1 能够被正确解析。在某些情况下,如果系统的 hosts 文件配置不正确,可能会导致地址解析问题。您可以检查 /etc/hosts 文件,确保 127.0.0.1 正确映射到 localhost。
- 权限问题:确保 ZooKeeper 进程有权限访问和绑定这些端口。如果没有,您可能需要以 root 用户身份运行 ZooKeeper 或者调整防火墙设置。
- 重新启动 ZooKeeper:在修正配置文件后,重新启动 ZooKeeper 以应用更改。
- 检查 Java 网络配置:在某些情况下,Java 虚拟机的网络配置可能会影响地址解析。您可以检查 Java 的网络配置,确保没有限制或错误的配置。
权限,网络配置,Java配置,端口冲突,我都检查过了没有问题!
您提供的 Java 版本信息显示您正在使用 Java 8 的更新版本(1.8.0_371),这是 ZooKeeper 支持的 Java 版本之一。这意味着 Java 版本不太可能是导致 ZooKeeper 启动失败的原因。
既然我们已经确认了 Java 版本和网络配置都没有问题,接下来我们可以继续排查 ZooKeeper 配置和环境的其他潜在问题:
- 检查 /etc/hosts 文件: 打开 /etc/hosts 文件,确保 127.0.0.1 正确地映射到了 localhost。这是解析本地回环地址所必需的。
bash
cat /etc/hosts
如果 /etc/hosts 文件中没有正确配置,您可以使用以下命令添加:
bash
echo "127.0.0.1 localhost" | sudo tee -a /etc/hosts
- 检查 ZooKeeper 用户权限: 确保运行 ZooKeeper 的用户(在这个案例中是 hadoop 用户)有权限访问 dataDir 和 dataLogDir 目录。
bash
ls -ld /usr/local/zookeeper01/data
ls -ld /usr/local/zookeeper01/logs
如果权限不足,您可以更改目录权限:
bash
sudo chown -R hadoop:hadoop /usr/local/zookeeper01/data
sudo chown -R hadoop:hadoop /usr/local/zookeeper01/logs
- 检查 ZooKeeper 依赖的库文件: 确保 ZooKeeper 所需的所有依赖库都存在并且没有损坏。这些库文件通常位于 /usr/local/zookeeper01/lib/ 目录下。
- 清理旧的 ZooKeeper 数据: 如果之前的 ZooKeeper 实例没有正确关闭,可能会留下一些状态文件导致新的实例无法启动。您可以尝试清理 dataDir 和 dataLogDir 目录下的数据(请确保备份重要数据):
bash
rm -rf /usr/local/zookeeper01/data/*
rm -rf /usr/local/zookeeper01/logs/*
- 重新配置 myid 文件: 确保每个 ZooKeeper 节点的 dataDir 目录下都有一个名为 myid 的文件,并且其内容与 zoo.cfg 中的 server.X 配置项匹配。
- 使用 start-foreground 模式启动: 使用 start-foreground 模式启动 ZooKeeper,这样可以在前台直接看到启动过程中的详细输出,有助于诊断问题:
bash
./zkServer.sh start-foreground
- 查看 ZooKeeper 的日志文件: 如果 ZooKeeper 启动失败,查看 dataLogDir 指定的日志目录下是否有新生成的日志文件,并检查其中的错误信息。
通过以上步骤,您应该能够进一步诊断 ZooKeeper 启动失败的原因。如果问题依然无法解决,请提供更多的错误日志信息以便进一步分析。
所以其实无论是什么步骤,最后都是回到最开始的问题,zoo.cfg配置环境的问题!!!
所以这个真的要好好检查!!!
启动集群:
后台启动zookeeper01的zoo.cfg服务端
cd /usr/local/zookeeper01/bin/
./zkServer.sh start # 启动第一个节点
netstat -lntp |grep java # 查看监听的端口
后台启动zookeeper02的zoo.cfg服务端
cd /usr/local/zookeeper02/bin/
./zkServer.sh start # 启动第二个节点
netstat -lntp |grep java # 查看监听的端口
后台启动zookeeper03的zoo.cfg服务端
cd /usr/local/zookeeper03/bin/
./zkServer.sh start # 启动第三个节点
netstat -lntp |grep java # 查看监听的端口
查看进程:
****.****启动完后依次查看集群的状态、主从信息:
/usr/local/zookeeper01/bin/zkServer.sh status
/usr/local/zookeeper02/bin/zkServer.sh status
/usr/local/zookeeper03/bin/zkServer.sh status
**** 这里有个问题是一定要全部启动后按顺序启动集群!****
zookeeper关闭命令:
/usr/local/zookeeper01/bin/zkServer.sh stop
/usr/local/zookeeper02/bin/zkServer.sh stop
/usr/local/zookeeper03/bin/zkServer.sh stop
版权归原作者 xizige__ 所有, 如有侵权,请联系我们删除。