大數據技術有着眾多系統需要分布式協調服務,比如Hadoop、Kafka系統,其中主從切換、維護命名空間、以及分布式協調通知等場景,需要保證數據的分布式一致性。
Zookeeper是業界最著名的分布式協調系統,下文中簡稱為ZK。ZK系統的實現基於ZAB協議(Zookeeper Atomic Broadcast),ZAB協議的核心定義了那些會改變Zookeeper服務器數據狀態的事務請求的處理方式。由於ZK實現的原理比較復雜,這里不再展開,感興趣的讀者可以閱讀《從Paxos到Zookeeper分布式一致性原理與實踐》這本書。
本文將重點討論如何搭建一套穩定的ZK集群,合理地配置ZK參數,以及更高效地使用新版本的特性。希望能給初學者帶來一些參考,也歡迎大家在留言區討論~~~
1. 初始化各個zk節點基礎環境
- 安裝jdk
下載jdk1.8.0_144,並解壓到目錄/usr/local/
- 關閉swap
#臨時生效
swapoff -a
#永久生效
echo 'swapoff -a' >> /etc/rc.d/rc.local
2. 中轉機配置一份zookeeper
從ZK官網下載zookeeper-3.5.8到中轉機,下載完成后解壓tar包。這里要注意安裝的版本號,根據Apache版本命名規范,x.y.z的y表示增加重要功能的版本號,z表示修復bug后的版本號,因此要權衡y和z的版本號。
筆者考慮到3.5是目前比較新的版本,且當前3.5最新的z版本號為8,之前的一些bug已經被修復,相對比較穩定,因此選擇了3.5.8版本。
修改zk配置文件
- 修改zoo.cfg配置文件
cp conf/zoo_sample.cfg conf/zoo.cfg
#追加或修改以下配置
vim conf/zoo.cfg
# 配置數據保存目錄
dataDir=/data0/zookeeper
# 只保留10個快照文件(用於自動清除歷史數據)
autopurge.snapRetainCount=10
# 每隔1小時掃描一次數據目錄
autopurge.purgeInterval=1
server.1=zk1.bjehp.com:2888:3888
server.2=zk2.bjehp.com:2888:3888
server.3=zk3.bjehp.com:2888:3888
server.4=zk4.bjehp.com:2888:3888
server.5=zk5.bjehp.com:2888:3888
# 把所有的四字命令加入白名單
4lw.commands.whitelist=*
- 修改zookeeper的日志目錄
vim bin/zkEnv.sh
ZOO_LOG_DIR="/var/log/zookeeper"
ZOO_LOG4J_PROP="INFO,ROLLINGFILE" # 用於滾動清除系統日志
JAVA_HOME="/usr/local/jdk1.8.0_144"
- 添加jvm內存配置
vim conf/java.env
SERVER_JVMFLAGS="-Xms2g -Xmx4g $SERVER_JVMFLAGS" # 配置zk的JVM內存參數
- 修改log4j
vim conf/log4j.properties
zookeeper.log.maxfilesize=64MB # 每64MB迭代一個系統日志文件
zookeeper.log.maxbackupindex=10 # 只保留10個系統日志文件
- 配置jmx端口
vim bin/zkServer.sh
ZOOMAIN="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY -Dcom.sun.management.jmxremote.port=6999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false org.apache.zookeeper.server.quorum.QuorumPeerMain"
3. 安裝並啟動zk服務
登錄各個zk節點,執行以下操作
安裝
拷貝中轉機的zookeeper-3.5.8安裝包到/usr/local目錄
mkdir /data0/zookeeper
mkdir /var/log/zookeeper
#對每個zk節點配置相應的id數字,id取值范圍1~255,這里id要與zoo.cfg配置對應
vim /data0/zookeeper/myid
啟動並驗證
/usr/local/apache-zookeeper-3.5.8-bin/bin/zkServer.sh start
ll /var/log/zookeeper/
ll /data0/zookeeper/
/usr/local/apache-zookeeper-3.5.8-bin/bin/zkServer.sh status
tailf /var/log/zookeeper/zookeeper-*.log
echo mntr|nc zk.node 2181
zk節點全部啟動后,會有一個leader節點,其余四個為follower節點。
停止
/usr/local/apache-zookeeper-3.5.8-bin/bin/zkServer.sh stop
配置監控報警
- 磁盤/內存/cpu
- 端口存活
- 服務是否正常
4. 總結
本文介紹了搭建zookeeper-3.5.8集群的詳細步驟,包括先關閉swap(zk需要保證數據的一致性,寫入磁盤會破壞數據的順序,數據寫入磁盤對於zk來說是個災難),配置自動清除數據文件和日志文件,配置JMX便於日后采集metric排查問題,最后介紹了zk啟停操作和驗證服務是否正常的命令。
參考資料
- 《從Paxos到Zookeeper分布式一致性原理與實踐》
- https://zookeeper.apache.org/