环境:建议3-5台服务器

ip                      hostname        id

10.100.11.13            z1              1  

10.100.11.14            z2              2

10.100.11.17            z3              3


绑定 ip hostname到 /etc/hosts


1 java环境部署

1.1 下载jdk  jdk-8u77-linux-x64.tar.gz http://download.oracle.com/otn-pub/java/jdk/8u77-b03/jdk-8u77-linux-x64.tar.gz


把 jdk-8u77-linux-x64.tar.gz 解压为 /usr/local/jdk

添加环境变量

/etc/profile 文件中添加


## JAVA

export JAVA_HOME=/usr/local/jdk

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar


并把 /usr/local/jdk/bin添加到 PATH中

. /etc/profile重载 profile配置


2 zookeeper安装

以z1为例:

把zookeeper-3.4.8.tar.gz (www.apache.org下载)解压到到 /usr/local/zookeeper

/usr/local/zookeeper/bin添加到PATH环境变量中


2.1 配置zoo.cfg

/usr/local/zookeeper/conf/zoo.cfg

######

tickTime=2000

dataDir=/var/lib/zookeeper

clientPort=2181

initLimit=5

syncLimit=2

server.1=z1:2888:3888

server.2=z2:2888:3888

server.3=z3:2888:3888

#####

注意server.后面的号要与myid号对应上,范围0-255

snapshot、log文件将保存在dataDir目录下,配置dataLogDir=/var/lib/zookeeper/logs,log将生成于dataLogDir目录下


2.2 创建 myid 文件,保存id号。存放在zoo.cfg文件中指定的dataDir目录下

echo 1 > /var/lib/zookeeper/myid


2.3 zookeeper启动脚本

先在 /usr/local/zookeeper/bin/zkEnv.sh 在#!/usr/bin/env bash行下添加下面这行

export JAVA_HOME=/usr/local/java/jdk


vi /etc/init.d/zk

##############

#!/bin/sh

#

# Startup script for the ZooKeeper daemon

#

# processname: ZooKeeper

# pidfile: /var/run/ZooKeeper.pid

# config: /usr/local/zookeeper/conf/zoo.cfg

# chkconfig: - 21 79

# description: Start and stop ZooKeeper


# Source function library

. /etc/rc.d/init.d/functions



RETVAL=0


prog="ZooKeeper"

prog_bin=/usr/local/zookeeper/bin/zkServer.sh


start() {

    echo -n $"Starting $prog: "

    daemon $prog_bin start

    #/usr/local/zookeeper/bin/zkServer.sh start

    RETVAL=$?

    echo

    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog

}


stop() {

    echo -n $"Stopping $prog: "

    daemon $prog_bin stop

    RETVAL=$?

    echo

    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog

}


status() {

    $prog_bin status

}


# See how we were called.

case "$1" in

    start)

        start

        ;;

    stop)

        stop

        ;;

    restart)

        stop

        start

        ;;

    status)

        status

        ;;

    *)

        echo "Usage: $0 {start|stop|restart|status}"

        exit 1

esac


exit $RETVAL

##############

chmod +x /etc/init.d/zk


2.3.2 CentOS 7 zookeeper启动脚本

vi /usr/lib/systemd/system/zk.service

##############

[Unit]

Description=Startup script for the ZooKeeper daemon

Documentation=http://zookeeper.apache.org/

After=network.target remote-fs.target nss-lookup.target


[Service]

Type=forking

ExecStart=/usr/local/zookeeper/bin/zkServer.sh start

ExecReload=/bin/kill -HUP $MAINPID

ExecStop=/usr/local/zookeeper/bin/zkServer.sh stop

PrivateTmp=true


[Install]

WantedBy=multi-user.target

##############

systemctl enable zk

systemctl start zk

z2, z3参照z1,注意myid文件内容的 ID号要与配置文件中的 server.x对应上



PS:

zkServer.sh status        查看状态

zkCli.sh -server ip:2181        # zk cli操作

ls /            # 列出节点

create /web1  'webgroup'        # 创建节点


默认情况,启动脚本启动zookeeper失败原因:

首先需要知道 交互式shell和非交互式shell、登录shell和非登录shell是有区别的


在登录shell里,环境信息需要读取/etc/profile和~ /.bash_profile, ~/.bash_login, and ~/.profile按顺序最先的一个,并执行其中的命令。除非被 --noprofile选项禁止了; 在非登录shell里,环境信息只读取 /etc/bash.bashrc和~/.bashrc


手工执行是属于登陆shell,脚本执行数据非登陆shell,而我的linux环境配置中只对/etc/profile进行了jdk1.7等环境的配置,所以脚本执行/usr/local/zookeeper/bin/zkServer.sh start 启动zookeeper失败了


解决方法(下面3个方法任选1):

1、脚本代码中添加“source /etc/profile;” 改为:ssh crxy$i "source /etc/profile;/usr/local/zookeeper/bin/zkServer.sh start"

2、把profile的配置信息echo到.bashrc中  echo 'source /etc/profile' >> ~/.bashrc

3、在/zookeeper/bin/zkEnv.sh的中开始位置添加 export JAVA_HOME=/usr/local/jdk1.7.0_45(就像hadoop中对hadoop-env.sh的配置一样)



若其中一个节点故障,如突然停电、磁盘故障再修复,导致zk启动失败,

```

zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg

Error contacting service. It is probably not running.


查看zookeeper.out


2018-02-23 14:10:29,993 [myid:] - INFO  [main:QuorumPeerConfig@103] - Reading configuration from: /usr/local/zookeeper/bin/../conf/zoo.cfg

2018-02-23 14:10:30,003 [myid:] - INFO  [main:QuorumPeer$QuorumServer@149] - Resolved hostname: 192.168.1.75 to address: /192.168.1.75

2018-02-23 14:10:30,004 [myid:] - INFO  [main:QuorumPeer$QuorumServer@149] - Resolved hostname: 192.168.1.69 to address: /192.168.1.69

2018-02-23 14:10:30,004 [myid:] - INFO  [main:QuorumPeer$QuorumServer@149] - Resolved hostname: 192.168.1.68 to address: /192.168.1.68

2018-02-23 14:10:30,004 [myid:] - INFO  [main:QuorumPeer$QuorumServer@149] - Resolved hostname: 192.168.1.214 to address: /192.168.1.214

2018-02-23 14:10:30,004 [myid:] - INFO  [main:QuorumPeer$QuorumServer@149] - Resolved hostname: 192.168.1.213 to address: /192.168.1.213

2018-02-23 14:10:30,004 [myid:] - INFO  [main:QuorumPeerConfig@331] - Defaulting to majority quorums

2018-02-23 14:10:30,006 [myid:5] - INFO  [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3

2018-02-23 14:10:30,006 [myid:5] - INFO  [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0

2018-02-23 14:10:30,007 [myid:5] - INFO  [main:DatadirCleanupManager@101] - Purge task is not scheduled.

2018-02-23 14:10:30,014 [myid:5] - INFO  [main:QuorumPeerMain@127] - Starting quorum peer

2018-02-23 14:10:30,021 [myid:5] - INFO  [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:4180

2018-02-23 14:10:30,025 [myid:5] - INFO  [main:QuorumPeer@1019] - tickTime set to 2000

2018-02-23 14:10:30,025 [myid:5] - INFO  [main:QuorumPeer@1039] - minSessionTimeout set to -1

2018-02-23 14:10:30,026 [myid:5] - INFO  [main:QuorumPeer@1050] - maxSessionTimeout set to -1

2018-02-23 14:10:30,026 [myid:5] - INFO  [main:QuorumPeer@1065] - initLimit set to 5

2018-02-23 14:10:45,543 [myid:5] - ERROR [main:QuorumPeer@557] - Unable to load database on disk

java.io.IOException: Transaction log: /data/zookeeper/logs/version-2/log.24f7000209f2 has invalid magic number 1331917856 != 1514884167

at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.inStreamCreated(FileTxnLog.java:584)

at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.createInputArchive(FileTxnLog.java:600)

at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.goToNextLog(FileTxnLog.java:566)

at org.apache.zookeeper.server.persistence.FileTxnLog$FileTxnIterator.next(FileTxnLog.java:648)

at org.apache.zookeeper.server.persistence.FileTxnSnapLog.restore(FileTxnSnapLog.java:158)

```


加载数据数据失败

处理方法:

删除 dataDir 目录下除文件myid外的其他文件或目录,然后重启zk