天天看點

分布式Apache ZooKeeper-3.4.6叢集安裝

Apache ZooKeeper是一個為分布式應用所設計的開源協調服務,其設計目的是為了減輕分布式應用程式所承擔的協調任務。它可以為使用者提供同步、配置管理、分組和命名等服務。在這裡,對ZooKeeper的完全分布式叢集安裝部署進行介紹。

一、基本環境

JDK    :1.8.0_11 (要求1.6+)

ZooKeeper:3.4.6

主機數:3(要求3+,且必須是奇數,因為ZooKeeper的選舉算法)

主機名 IP位址 JDK ZooKeeper myid

master 192.168.145.129 1.8.0_11 server.1  1

slave1 192.168.145.130 1.8.0_11 server.2  2

slave2 192.168.145.131 1.8.0_11 server.3  3

二、master節點上安裝配置

1、下載下傳并解壓ZooKeeper-3.4.6.tar.gz

tar -zxvf zookeeper-3.4.6.tar.gz

這裡路徑為 /home/fesh/zookeeper-3.4.6

2、設定the Java heap size (個人感覺一般不需要配置)

保守地use a maximum heap size of 3GB for a 4GB machine

3、$ZOOKEEPER_HOME/conf/zoo.cfg

cp zoo_sample.cfg zoo.cfg

建立此配置檔案,并設定内容

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/home/fesh/data/zookeeper
# the port at which the clients will connect
clientPort=2181

 server.1=master:2888:3888
 server.2=slave1:2888:3888
 server.3=slave2:2888:3888
           

4、/home/fesh/data/zookeeper/myid

在節點配置的dataDir指定的目錄下面,建立一個myid檔案,裡面内容為一個數字,用來辨別目前主機,$ZOOKEEPER_HOME/conf/zoo.cfg檔案中配置的server.X,則myid檔案中就輸入這個數字X。(即在每個節點上建立并設定檔案myid,其内容與zoo.cfg中的id相對應)這裡master節點為 1

mkdir -p /home/fesh/data/zookeeper

cd /home/fesh/data/zookeeper

touch myid

echo “1” > myid

5、設定日志

conf/log4j.properties

# Define some default values that can be overridden by system properties
zookeeper.root.logger=INFO, CONSOLE
           

改為

# Define some default values that can be overridden by system properties  
zookeeper.root.logger=INFO, ROLLINGFILE
           

#
# Add ROLLINGFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
           

改為—每天一個log日志檔案,而不是在同一個log檔案中遞增日志

#
# Add ROLLINGFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
           

bin/zkEvn.sh

if [ "x${ZOO_LOG_DIR}" = "x" ]
then
    ZOO_LOG_DIR="."
fi

if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
    ZOO_LOG4J_PROP="INFO,CONSOLE"
fi

           

改為

if [ "x${ZOO_LOG_DIR}" = "x" ]
then
    ZOO_LOG_DIR="$ZOOBINDIR/../logs"
fi

if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
    ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi

           

參考:Zookeeper運維的一些經驗

http://mp.weixin.qq.com/s?__biz=MzAxMjQ5NDM1Mg==&mid=2651024176&idx=1&sn=7659ea6a7bf5c37b083e30060c3e55ca&chksm=8047384fb730b1591ff1ce7081822577112087fc7ec3976f020a263b503f6a8ef0856b3a3057&scene=0#wechat_redirect&utm_source=tuicool&utm_medium=referral

三、從master節點分發檔案到其他節點

1、在master節點的/home/fesh/目錄下

scp -r zookeeper-3.4.6 slave1:~/

scp -r zookeeper-3.4.6 slave2:~/

scp -r data slave1:~/

scp -r data slave2:~/

2、在slave1節點的/home/fesh/目錄下

vi ./data/zookeeper/myid

修改為 2

3、在slave2節點的/home/fesh/目錄下

vi ./data/zookeeper/myid

修改為 3

四、其他配置

1、在每個節點配置/etc/hosts (并保證每個節點/etc/hostname中分别為master、slave1、slave2) 主機 -IP位址映射

192.168.145.129 master

192.168.145.130 slave1

192.168.145.131 slave2

2、在每個節點配置環境變量/etc/profile

#Set ZOOKEEPER_HOME ENVIRONMENT
export ZOOKEEPER_HOME=/home/fesh/zookeeper-3.4.6
export PATH=$PATH:$ZOOKEEPER_HOME/bin
           

五、啟動

在每個節點上$ZOOKEEPER_HOME目錄下,運作 (這裡的啟動順序為 master > slave1 > slave2 )

bin/zkServer.sh start

并用指令檢視啟動狀态

bin/zkServer.sh status

master節點

slave1節點

slave2節點

(注:之前我配置正确的,但是一直都是,每個節點上都啟動了,但就是互相連接配接不上,最後發現好像是防火牆的原因,啊啊啊!一定要先把防火牆關了! sudo ufw disable )

檢視$ZOOKEEPER_HOME/zookeeper.out 日志,會發現開始會報錯,但當leader選出來之後 就沒有問題了。

參考:

1、http://zookeeper.apache.org/doc/r3.4.6/zookeeperAdmin.html

2、一個很好的部落格 http://www.blogjava.net/hello-yun/archive/2012/05/03/377250.html