衡阳网站开发培训,手机网站建设哪家优惠,在那个网站做驾校模拟题,如何规避电子政务门户网站建设教训单点配置
ZooKeeper在启动的时候#xff0c;默认会读取/conf/zoo.cfg配置文件#xff0c;该文件缺失会报错。因此#xff0c;我们需要在将容器/conf/挂载出来#xff0c;在制定的目录下#xff0c;添加zoo.cfg文件。 zoo.cfg logback.xml
配置文件的信息可以从二进制包…单点配置
ZooKeeper在启动的时候默认会读取/conf/zoo.cfg配置文件该文件缺失会报错。因此我们需要在将容器/conf/挂载出来在制定的目录下添加zoo.cfg文件。 zoo.cfg logback.xml
配置文件的信息可以从二进制包的conf文件中获取 ZooKeeper的github地址
/conf/zoo.cfg配置文件
#基本时间单位
tickTime2000#存储数据的目录
dataDir/data#存储日志的目录
dataLogDir/datalog #是否以独立模式运行如果是集群模式则改为false
standaloneEnabledtrue#客户端端口,用户连接zookeeper服务
clientPort2181
logback.xml日志文件顺带将输出日志设置了不设置的话会采用默认的日志等级
configurationproperty namezookeeper.console.threshold valueINFO /property namezookeeper.log.dir value. /property namezookeeper.log.file valuezookeeper.log /property namezookeeper.log.threshold valueWARN /property namezookeeper.log.maxfilesize value256MB /property namezookeeper.log.maxbackupindex value20 /appender nameCONSOLE classch.qos.logback.core.ConsoleAppenderencoderpattern%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}%L] - %m%n/pattern/encoderfilter classch.qos.logback.classic.filter.ThresholdFilterlevel${zookeeper.console.threshold}/level/filter/appenderroot levelWARNappender-ref refCONSOLE //root
/configuration
docker run -d \--name zookeeper \-v /opt/zookeeperconf/zookeeper1/:/conf/ \zookeeper:3.9.3
之后就可以正常启动了。
我们进入到容器中验证启动的ZooKeeper是否可以正常使用 # 进入容器内部使用bash命令行
docker exec -it zookeeper1 /bin/bash# 通过2181端口,连接ZooKeeper服务
bin/zkCli.sh -server 127.0.0.1:2181#创建/zk_test目录,并绑定mydata值
create /zk_test mydata#获取zk_test的绑定值另外两个ls是列出该目录下所有的值
get zk_test
集群配置
节点数量说明
建议配置奇数节点3、5、7、9。原因如下:
ZooKeeper集群模式只有在超过半数节点可用的情况下才会对外提供服务 3个节点允许宕机1个 5个节点允许宕机2个 7个节点允许宕机3个 8个节点也是允许宕机3个所以配置奇数个,性价比高。
配置文件说明
logback.xml文件可以共享一个但是zoo.cgf需要配置不同的文件因为当server-list列表中的节点是自己的时候会监听该地址。当节点是别人的时候去向该地址发起请求建立连接。所以zoo.cfg需要是不同的文件。如何判断是否是自己的地址server.x中的x isEqual ZOO_MY_ID。
搭建步骤
1.启动多个节点
这里我们启动三个节点。先将单机模式的配置文件复制三份并按照下方docker命令将容器依次启动。注意如果我们进行集群模式的搭建必须在环境变量中传入ZOO_MY_ID该值用作节点的编号。【先启动单机获取每一个节点的IP通信地址之后再进行配置文件的修改搭建集群。】
# 节点1,节点与ZOO_MY_ID相对应
docker run -d \--name zookeeper1 \-v /opt/zookeeperconf/zookeeper1/:/conf/ \-e ZOO_MY_ID1 \zookeeper:3.9.3docker run -d \--name zookeeper2 \-v /opt/zookeeperconf/zookeeper2/:/conf/ \-e ZOO_MY_ID2 \zookeeper:3.9.3docker run -d \--name zookeeper3 \-v /opt/zookeeperconf/zookeeper3/:/conf/ \-e ZOO_MY_ID3 \zookeeper:3.9.3 2.查看节点的IP地址
由于Docker中网络模式有多种类型这里建议初次搭建集群的同学直接使用容器本身生成的IP地址。这一步的目的是为了确保zk节点之间能够互相进行通信。熟练了之后我们可以把他们放到同一个网络下使用别名进行通信。
docker inspect ContainerName 我的三个容器的IPAddress分别为172.17.0.2、172.17.0.3、172.17.0.4。
3.改写配置文件重启所有节点
接下来进行配置文件的更改如果启动容器的ZOO_MY_ID等于下方的server.x中的X,将其地址更改为0.0.0.0表示监听该地址。
# 节点1 myid1
tickTime2000
dataDir/data
clientPort2181
initLimit5
syncLimit2
standaloneEnabledfalse
server.10.0.0.0:2888:3888
server.2172.17.0.3:2888:3888
server.3172.17.0.4:2888:3888# 节点2 myid2
tickTime2000
dataDir/data
clientPort2181
initLimit5
syncLimit2
standaloneEnabledfalse
server.1172.17.0.2:2888:3888
server.20.0.0.0:2888:3888
server.3172.17.0.4:2888:3888# 节点3 myid3
tickTime2000
dataDir/data
clientPort2181
initLimit5
syncLimit2
standaloneEnabledfalse
server.1172.17.0.2:2888:3888
server.2172.17.0.3:2888:3888
server.30.0.0.0:2888:3888 配置文件修改完成之后我们依次进行集群的重启即可。
docker restart zookeeper1 重启之后我们查看日志可以会看到节点1和节点2报java.net.ConnectException: Connection refused的错误信息这是非常正常的。具体原因看下方节点之间通信错误。
4.验证集群模式是否配置成功
进行其中一个容器执行bin/zkServer.sh status,会看到以下信息Mode:表示该节点在集群中的角色。 我们也可以随机进入一个节点写入一条信息看看其他节点能不能同步该信息。
搭建集群时常见的错误信息
1.Cannot assign requested address
错误信息无法分配、注册请求的地址。
解决方法将节点自身的zoo.cfg的IP地址更改为0.0.0.0即可
2024-11-04 09:41:20,659 [myid:] - ERROR [ListenerHandler-zookeeper01/10.43.187.245:3888:o.a.z.s.q.QuorumCnxManager$Listener$ListenerHandler1099] - Exception while listening to address zookeeper01/10.43.187.245:3888
java.net.BindException: Cannot assign requested addressat java.base/sun.nio.ch.Net.bind0(Native Method)at java.base/sun.nio.ch.Net.bind(Unknown Source)at java.base/sun.nio.ch.Net.bind(Unknown Source)at java.base/sun.nio.ch.NioSocketImpl.bind(Unknown Source)at java.base/java.net.ServerSocket.bind(Unknown Source)at java.base/java.net.ServerSocket.bind(Unknown Source)at org.apache.zookeeper.server.quorum.QuorumCnxManager$Listener$ListenerHandler.createNewServerSocket(QuorumCnxManager.java:1141)at org.apache.zookeeper.server.quorum.QuorumCnxManager$Listener$ListenerHandler.acceptConnections(QuorumCnxManager.java:1070)at org.apache.zookeeper.server.quorum.QuorumCnxManager$Listener$ListenerHandler.run(QuorumCnxManager.java:1039)at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)at java.base/java.util.concurrent.FutureTask.run(Unknown Source)at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.base/java.lang.Thread.run(Unknown Source)
Connection refused
错误信息向其他节点发起建立连接的请求被拒绝了
解决方法 首先说明一下在集群中所有节点没有全部启动的情况下这种报错是正常的因为我们的节点没有全部启动所以自然也就没有办法建立连接了这种情况下启动所有的节点自然就不会报错了。还有一种原因就是配置文件错误最大的可能性是IP地址配置错误导致节点之间一直没有办法进行通信。可以试试在报错的容器内部能不能ping无法建立连接的IP地址
2024-11-04 09:28:03,754 [myid:] - WARN [QuorumConnectionThread-[myid1]-3:o.a.z.s.q.QuorumCnxManager401] - Cannot open channel to 2 at election address /10.43.128.163:3888
java.net.ConnectException: Connection refusedat java.base/sun.nio.ch.Net.pollConnect(Native Method)at java.base/sun.nio.ch.Net.pollConnectNow(Unknown Source)at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(Unknown Source)at java.base/sun.nio.ch.NioSocketImpl.connect(Unknown Source)at java.base/java.net.SocksSocketImpl.connect(Unknown Source)at java.base/java.net.Socket.connect(Unknown Source)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.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.base/java.lang.Thread.run(Unknown Source)主要参考资料
ZooKeeper官方教程
DockerHub:ZooKeeper