最近想学Zookeper,参考了http://blog.csdn.net/u010317829/article/details/52119281 进行动手配置
中间踩了一个坑,记录一下。
单机配置时:只配置dataDir和dataLogDir即可,不用配置下面的server.*
否则会报:Zookeeper Invalid config, exiting abnormally
安装集群伪分布模式
1、分别建立zoo-1.cfg zoo-2.cfg zoo-3.cfg
server.id=IP地址:集群中机器与Leader通信的端口Port1:集群进行重新选举时端口Port2
如果为多台服务器,Port1可以相同,否则:同一台机器,则Port1也必须不同
zoo-1.cfg
2、在dataDir目录下分别建立d_1、d_2、d_3文件夹,每个文件夹中建立myid文件,myid文件中存放的分别是serverId
d_1/myid 中为1
d_2/myid中为2
d_3/myid中为3
3、在zookeeper/bin Copy zkServer.cmd,修改后分别另存为:zkServer-1.cmd zkServer-2.cmd zkServer-3.cmd
三个cmd中分别设置ZOOCFG为zoo-1.cfg \zoo-2.cfg\zoo-3.cfg
剩下的按原作者教程,直接启动即可。cmd下分别运行zkserver-1.cmd,zkserver-2.cmd,zkserver-3.cmd.
启动前两个zkserver时,会出现类似下面的错误,这是因为Zookeeper集群启动时,每个结点都会试图去连集群中的其他结点,其他结点还没启动,所以肯定会出现这样的异常的,这样的错误是可以忽略的。当三个结点都启动后就OK了
584] - Cannot open channel to 3 at election address localhost/127.0.0.1:3889
java.net.ConnectException: Connection refused: connect
在搭建中自己遇到的问题或知识点:
一、出现 Invalid config, exiting abnormally 的情况可能有3个:
1、是否开启了日志输出路径dataLogDir,如果开启了检查是不是创建了所需的文件夹
2、检查 myid 是不是在dataDir=/zzy/zookeeper-3.4.5/tmp (tmp 需要自己建立) 目录下。
3、myid 是不是有此文件,并且有值。myid若没有,需要自己建立,内容是一个数字、对应的server数值,就是对应每台服务器的Server ID数字。如:zoo.cfg中server.1,则此文件中内容为1
二、zkcli.cmd zkcli的所有操作都可以通过API来实现
建立会话连接,zkClient常用的操作和文件系统大致相同,主要包括查看、新增、修改、删除、配额、权限控制等。具体内容可见官方文档或http://blog.csdn.net/u010392705/article/details/69664064
三、集群与单机的访问方式只是ConnectString不同
参数 | 说明 |
---|---|
clientPort | 无默认值,必须配置,不支持系统属性方式配置。当前服务器对外提供服务端口,客户通过此端口与服务器建立连接,一般设置为1281。集群中不需要统一端口,可任意配置端口。 |
dataDir | 无默认值,必须配置。服务器存储快照文件目录。默认情况下,如果没有配置dataLogDir,那么事务日志也会存储在这个目录中。建议将事务日志目录独立配置。 |
tickTime | 默认值:3000(ms),,不支持系统属性方式配置。用于配置zookeeper中最小时间单元长度,很多运行时的时间间隔都是使用它的倍数来表示的。 |
initLimit | Leader Zookeeper接收集群其他服务器初始化等待最大时间(10*tickTime)。 |
syncLimit | Leader Zookeeper和集群其他服务器通信最大时间(5*tickTime)。 |
每一行此配置表示一个集群中的一台服务器。其中id为Server ID,用来标识该机器在集群中的编号。同时,在所在服务器的数据目录(/tmp/zookeeper)下创建一个myid文件,该文件只有一行内容,并且是一个数字,就是对应每台服务器的Server ID数字。
比如server.1=IP1:2888:3888的myid中的内容就是1。不同服务器的ID需要保持不同,并且和zoo.cfg文件中server.id中的id和myid文件的内容保持一致。id的取值范围为1~255。
其中,server.id中配置参数的第一个port是集群中其他机器与Leader之间通信的端口,第二个port为当Leader宕机或其他故障时,集群进行重新选举Leader时使用的端口
参考: