本安装教程,采用zookeeper 3.6.1html
3.6.0的zk,在启动后,若是发现本身的data 目录是空的,则不会参与集群选举,知道该节点连上一个master, 而后从其同步过完整的数据后,才具备选举权 ,之因此这么作的缘由是。万一谁不当心删了数据文件,这个时候重启该节点,若是运行该节点参与选举,要是该节点被选成master, 会致使怎个集群数据丢失。java
但第一次启动集群,你们确实都没数据,若是都没有选举权的话,第一次选举就不会进行,因此要在data 目录下建立一个initialize文件,暂时屏蔽调3.6.0的数据丢失保护功能。集群启动,正常选举后,该文件会被删除,进入数据丢失的保护机制shell
通常可直接配置zk发型包conf下的zoo.cfg文件apache
tickTime=2000 dataDir=/var/lib/zookeeper/data dataLogDir=/var/lib/zookeeper/log #默认dataLogDir和dataDir在一块儿,最好将其分开,以提升zk性能。由于同时写数据和日志到一个磁盘,磁盘会有些瓶颈限制 autopurge.purgeInterval=1 #开启按期清理功能,以避免数据和日志文件过大 autopurge.snapRetainCount=1000 clientPort=2181 #zk集群对外提供服务的端口 initLimit=5 syncLimit=2 server.1=zoo1:2888:3888 #"server.1"中的1,便是该机器在数据文件夹中配置的myid。 zoo1,zoo2,zoo3是zk集群的节点hostname或ip。 2888是follower用来跟leader通讯的端口,3888是用来选举leader的端口 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
2015-07-02 21:06:01,682 [myid:] - ERROR [main:QuorumPeerMain@86] - Invalid config, exiting abnormally org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Address unresolved: Master.Hadoop:3888 at org.apache.zookeeper.server.quorum.QuorumPeer$QuorumServer.<init>(QuorumPeer.java:205) at org.apache.zookeeper.server.quorum.flexible.QuorumMaj.<init>(QuorumMaj.java:89) at org.apache.zookeeper.server.quorum.QuorumPeerConfig.createQuorumVerifier(QuorumPeerConfig.java:401) at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseDynamicConfig(QuorumPeerConfig.java:425) at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:291) at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:126) at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:110) at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:79) Invalid config, exiting abnormally
这种错误是由于配置文件,端口号后面有空格,去掉空格就能够了oop
磁盘的读写性能会严重影响到zk的性能。因此尽可能将zk的数据存储目录防止带单独的磁盘。有条件的话,将其日志文件路径也放置到单独磁盘。同其它程序共用一个磁盘,当磁盘读写性能出现瓶颈时,zk的性能会急速降低性能
当zk申请的内存超过操做系统的空闲内存,那么操做系统会启用swap机制,即利用硬盘作为交换内存。这也将严重影响zk的性能。因此若是系统有4g内存,那么zk申请内存最好小于等于3G。flex
在bin下 ./zkServer.sh start
该zkServer.sh会首先执行zkEnv.sh
zkEnv.sh中有整个zk执行相关环境变量设置,从zkEnv.sh代码中能够看到操作系统
if [ -f "${ZOOCFGDIR}/zookeeper-env.sh" ]; then . "${ZOOCFGDIR}/zookeeper-env.sh" fi if [ "x$ZOOCFG" = "x" ] then ZOOCFG="zoo.cfg" fi ZOOCFG="$ZOOCFGDIR/$ZOOCFG" if [ -f "$ZOOCFGDIR/java.env" ] then . "$ZOOCFGDIR/java.env" fi
它回去zk配置目录,也即CONF中找zookeeper-env.sh,和java.env。因此咱们能够将相关的环境变量设置到这两个文件中(没有就建立)日志
.env文件其实跟shell差很少,启动定义的环境变量格式为key=value
,最终生效,经过执行该文件,或者source 它均可以。code
从zkEnv.sh中还能够得出的信息是,要设置zk server端的内存占用大小,是经过ZK_SERVER_HEAP
来,由于zkEnv.sh有以下代码
# default heap for zookeeper server ZK_SERVER_HEAP="${ZK_SERVER_HEAP:-1000}" export SERVER_JVMFLAGS="-Xmx${ZK_SERVER_HEAP}m $SERVER_JVMFLAGS"
固然其它一些-D的java 参数, 能够设置到这个变量上SERVER_JVMFLAGS
上述脚本实际上最终入口,是执行了zookeeper的jar。咱们固然也能够直接经过java命令启动zookeeper的jar,并加装指定配置
java -cp zookeeper.jar:lib/*:conf org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.conf
https://zookeeper.apache.org/doc/r3.6.1/zookeeperAdmin.html#sc_zkMulitServerSetup