在一台主机上跑多个zk实例,每个zk实例对应一个独立的配置文件;但是每个配置文件的clientPort & admin.serverPort & dataDir & dataLogDir绝对不能相同,还需要在dataDir中创建myid文件来指定该dataDir对应的zk实例。
安装Java
安装JAVA, 请见
http://qiangsh.blog.51cto.com/3510397/1771748
准备ZooKeeper
下载,解压软件
配置zookeeper的环境变量
创建Zookeeper项目目录
配置ZooKeeper
创建myid文件,并填入ID值
准备配置文件
修改配置文件
配置server0
配置server1
配置server2
配置参数zoo.cfg解读
- tickTime=2000:通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒。配置服务器与客户端或服务器与服务器之间的通信心跳时间。
- initLimit = 10:LF初始通信时限。表示Leader和Follower初始连接时能容忍的时间,10代表10个tickTime,超过该时间则认为通信失败。
- syncLimit = 5:LF同步通信时限。Leader和Follower之间通信时间如果超过syncLimit * tickTime,Leader认为Follwer挂掉,从服务器列表中删除Follwer。
- dataDir:保存Zookeeper中的数据。注意:默认的tmp目录,容易被Linux系统定期删除,所以一般不用默认的tmp目录。
- clientPort = 2181:客户端连接端口,通常不做修改。
server.A=B:C:D解读
👉在每个服务器中都启动zookeeper,会通过选举机制来产生follower跟leader
- A 是一个数字,表示这个是第几号服务器; 集群模式下配置一个文件 myid,这个文件在 data 目录下,这个文件里面有一个数据 就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比 较从而判断到底是哪个 server
- B 是这个服务器的地址
- C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口
- D 是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口
启动ZooKeeper
启动失败!查看日志发现:Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain,下载的安装包不对,退到zookeeper文件下,执行编译:
mvn package -Dmaven.test.skip=true
测试连接
编写启动脚本
- zookeeper01
- zookeeper02
- zookeeper03