A:本脚本运行的机器,Linux RHEL6
B,C,D,...:待安装zookeeper cluster的机器, Linux RHEL6
首先在脚本运行的机器A上确定可以ssh无密码登录到待安装zk的机器B,C,D,...上,然后就可以在A上运行本脚本:
$ ./install_zookeeper
前提:
B, C, D机器必须配置好repo,本脚本使用的是cdh5的repo, 下面的内容保存到:/etc/yum.repos.d/cloudera-cdh5.repo:
[cloudera-cdh5] # Packages for Cloudera's Distribution for Hadoop, Version 5, on RedHat or CentOS 6 x86_64 name=Cloudera's Distribution for Hadoop, Version 5 baseurl=http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/5/ gpgkey = http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera gpgcheck = 1 enabled = 1
自动安装脚本将自动在B,C,D机器上安装好zookeeper, 配置好相关配置文件。但没有启动它们。支持1,3,5,7个服务器。
#!/bin/bash  
#  
# @file  
#   install_zookeeper.sh  
#  
# @date  
#   2014-12-21  
#  
# @author  
#   cheungmine@hgdb.net  
#  
# @version  
#   0.0.1pre  
#  
# @usage  
#   ./install_zookeeper.sh  
################################################################################  
#***********************************************************  
# split_to_array  
#   split string into array  
#***********************************************************  
function split_to_array() {  
    OLD_IFS="$IFS"  
    IFS="$2"  
    array=($1)  
    IFS="$OLD_IFS"  
}  
#***********************************************************  
# install_zookeeper  
#   install zookeeper on 1, 3 or 5 servers  
#  
# Parameters:  
#   clientPort - the port at which the clients will connect to  
#   servers - varying arguments: 1, 3, 5, up to 7  
#     "zkServer:serverPort:appPort"  
#     zkServer - ipaddr of zookeeper server  
#     serverPort - communication port for zookeeper servers  
#     appPort - communication port between zookeeper with other applications  
#  
# Example:  
#   1) install_zookeeper 2181 zk1 zk2 zk3  
#   2) install_zookeeper 2181 192.168.122.201 192.168.122.202 192.168.122.203  
#   3) install_zookeeper "2181" "192.168.122.201:2888:3888" "192.168.122.202:2888:3888" "192.168.122.203:2888:3888"  
#   4) install_zookeeper "2181:/var/lib/zookeeper" "192.168.122.201:2888:3888" "192.168.122.202:2888:3888" "192.168.122.203:2888:3888"  
#***********************************************************  
ERR_INVALID_ZK_SERVERS=1001  
function install_zookeeper() {  
    echo -e "<INFO> install zookeeper on cluster ..."  
    #chk_root  
    local ret clientPort dataDir len i ZOO_CFG server serverPort appPort destip destlogin  
    serverPort=2888  
    appPort=3888  
    # parse the first argument  
    split_to_array $1 ":"  
    # the port at which the clients will connect  
    clientPort=${array[0]}  
    # the directory where the snapshot is stored  
    dataDir="/var/lib/zookeeper"  
    if [ ${#array[*]} -eq 2 ]; then  
        dataDir=${array[1]}  
    fi  
    echo -e "<INFO> clientPort: $clientPort"  
    echo -e "<INFO> dataDir: $dataDir"  
    # zookeeper configure file  
    ZOO_CFG="/usr/lib/zookeeper/conf/zoo.cfg"  
    # get list of servers: args  
    shift  
    local argc=$#  
    if [ $argc -eq 1 -o $argc -eq 3 -o $argc -eq 5 -o $argc -eq 7 ]; then  
        echo -e "<INFO> zookeeper servers in cluster: [$argc]"  
    else  
        echo -e "<ERROR> invalid zookeeper servers: [$argc]"  
        exit $ERR_INVALID_ZK_SERVERS;  
    fi  
    local argv="$@"  
    OLD_IFS="$IFS"  
    IFS=" "  
    local args=($argv)  
    IFS="$OLD_IFS"  
    # array variable  
    local ipaddrs=()  
    local servers=()  
    local sid=0  
    for a in ${args[@]}  
    do  
        let sid++  
        # check if server format is either of:  
        #   serverIP  
        # or:  
        #   serverIP:serverPort:appPort  
        split_to_array $a ":"  
        serverIP=${array[0]}  
        if [ ${#array[*]} -ne 3 ]; then  
            a="$serverIP:$serverPort:$appPort";  
        fi  
        local server="server.$sid=$a"  
        servers[sid-1]=$server  
        echo $server  
        ipaddrs[sid-1]=$serverIP  
    done  
    # output array to one line string: echo ${servers[@]}  
    # get length of array  
    len=${#servers[*]}  
    i=0  
    while [ $i -lt $len ]  
    do  
        let sid=i+1  
        destip=${ipaddrs[$i]}  
        destlogin=root@$destip  
        echo -e "<INFO> configuring server.$sid: $destip ...c"  
        ret=`ssh $destlogin "yum install -y zookeeper zookeeper-server && service zookeeper-server init --myid=$sid"`  
        ret=`ssh $destlogin "echo '#!{{install_zookeeper@hgdb.net==>' >> $ZOO_CFG"`  
        for s in ${servers[*]}  
        do  
            ret=`ssh $destlogin "echo '$s' >> $ZOO_CFG"`  
        done  
        ret=`ssh $destlogin "echo '#!<==install_zookeeper@hgdb.net}}' >> $ZOO_CFG"`  
        echo -e "OK."  
        let i++  
    done  
    echo "<INFO> zookeeper cluster installation completed successfully!"  
}  
#=======================================================================  
install_zookeeper "2181" "192.168.122.201" "192.168.122.202" "192.168.122.203"
根据配置修改最后一行:
install_zookeeper "2181" "192.168.122.201" "192.168.122.202" "192.168.122.203"
注意:需要把zk-cluster的每台机器上的防火墙停掉,再启动zookeeper:
$ /usr/lib/zookeeper/bin/zkServer.sh start-foreground