fesh個人實踐,歡迎經驗交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3900253.html
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