zookeeper信息配置流程:
配置zoo.cfg文件
(1)重命名/opt/module/zookeeper/conf目录下的zoo_sample.cfg为zoo.cfg
mv zoo_sample.cfg zoo.cfg
(2)打开zoo.cfg文件
vim zoo.cfg
修改数据存储路径配置
dataDir=/opt/module/zookeeper/zkData
增加如下配置
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
(3)同步/opt/module/zookeeper目录内容到hadoop103、hadoop104
[atguigu@hadoop102 module]$ xsync zookeeper/
(4)分别修改hadoop103、hadoop104上的myid文件中内容为3、4
(5)zoo.cfg配置参数解读
server.A=B:C:D。
A是一个数字,表示这个是第几号服务器;
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
B是这个服务器的地址;
C是这个服务器Follower与集群中的Leader服务器交换信息的端口;
D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
问题描述
(1)分别启动Zookeeper
分别在hadoo102,hadoop103,hadoop104 启动zookeeper进程
bin/zkServer.sh start
(2)查看状态
使用指令查看进程
xcall jps --需要编写xcall脚本
你会发现QuorumPeerMain都存在
bin/zkServer.sh status
然后使用指令查看进程状态
进程存在 ,但就是无法正常启动zookeeper
进入/opt/module/zookeeper/logs 查看日志信息
2024-11-08 17:05:52,624 [myid:2] - INFO [QuorumPeer[myid=2](plain=[0:0:0:0:0:0:0:0]:2181)(secure=disabled):FastLeaderElection@980] - Notification time out: 400
2024-11-08 17:05:52,624 [myid:2] - WARN [QuorumConnectionThread-[myid=2]-2:QuorumCnxManager@401] - Cannot open channel to 4 at election address /10.206.0.7:3888
java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.initiateConnection(QuorumCnxManager.java:384)
at org.apache.zookeeper.server.quorum.QuorumCnxManager$QuorumConnectionReqThread.run(QuorumCnxManager.java:458)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
2024-11-08 17:05:52,625 [myid:2] - WARN [QuorumConnectionThread-[myid=2]-3:QuorumCnxManager@401] - Cannot open channel to 3 at election address /10.206.0.9:3888
java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.initiateConnection(QuorumCnxManager.java:384)
at org.apache.zookeeper.server.quorum.QuorumCnxManager$QuorumConnectionReqThread.run(QuorumCnxManager.java:458)
简而言之就是无法与 hadoop103,hadoop104 进行通信,但是如果
ping hadoop103 的时候是可以通的
原因分析:
此处是由于在购买服务器时候,会给一个公网ip,和内网ip
-
公网IP:公网IP通常用于服务器和外部网络的通信。它适用于你需要从外部访问或远程管理的情况。比如:
- 你需要通过SSH进行远程登录管理这些服务器。
- 如果有外部应用需要访问你的Hadoop集群(比如外部数据源),可以通过公网IP进行连接。
-
内网IP:内网IP用于服务器之间的内部通信,确保集群内节点之间的流量不会通过公网。比如:
- 在Hadoop集群内部,DataNode、NameNode、ResourceManager等组件之间通过内网IP进行通信。
- 用于HDFS文件存储、MapReduce计算任务的分发与协调等。
解决方案:
ZooKeeper之间的相互通信应当使用内网IP。因为ZooKeeper是Hadoop集群中的协调服务,通常用于集群中的节点间协调和管理信息,确保集群的高可用性和一致性。在集群内部,ZooKeeper服务器需要相互之间频繁地进行心跳和数据同步,这些通信都应该通过内网IP进行,以避免公网流量影响性能和安全性。
server.1=192.168.1.2:2888:3888
server.2=192.168.1.3:2888:3888
server.3=192.168.1.4:2888:3888
这里,192.168.1.2
、192.168.1.3
和192.168.1.4
就是ZooKeeper节点间的内网IP。
而不是hadoop102,hadoop103,hadoop104 本地DNS服务器解析的公网ip