首先確認Zookeeper服務是否正在運行。在CentOS/RHEL系統中,可使用systemctl
命令:
sudo systemctl status zookeeper
若服務未運行,啟動服務并設置開機自啟:
sudo systemctl start zookeeper
sudo systemctl enable zookeeper
在非systemd系統中,可通過zkServer.sh
腳本管理:
./bin/zkServer.sh status # 查看狀態
./bin/zkServer.sh start # 啟動服務
通過狀態信息可快速判斷服務是否正常啟動。
日志是故障排查的核心依據,Zookeeper日志默認存儲在/var/log/zookeeper/
目錄(或dataLogDir
配置的路徑),主日志文件通常為zookeeper.out
。使用以下命令查看日志:
tail -f /var/log/zookeeper/zookeeper.out # 實時查看最新日志
grep 'ERROR' /var/log/zookeeper/zookeeper.out # 過濾錯誤信息
也可通過zkServer.sh
命令獲取特定日期或服務器的日志:
./bin/zkServer.sh get-logs --date 2025-10-12 # 查看指定日期日志
./bin/zkServer.sh get-logs --server server1 # 查看指定服務器日志
重點關注FATAL
(致命錯誤)、ERROR
(錯誤)級別的日志,如java.lang.OutOfMemoryError
(內存不足)、Connection refused
(連接拒絕)等。
Zookeeper的主配置文件為zoo.cfg
(通常位于conf/
目錄),需檢查以下關鍵參數:
dataDir
:數據存儲目錄是否存在且具備讀寫權限(如/tmp/zookeeper
);clientPort
:客戶端連接端口(默認2181)是否未被占用;server.X
:集群節點配置是否正確(格式為server.id=host:port1:port2
,如server.1=node1:2888:3888
)。sudo systemctl restart zookeeper
確保所有節點的myid
文件(位于dataDir
目錄)內容與server.X
中的id
一致。
Zookeeper依賴Java 8及以上版本,需確認Java環境是否正確配置:
java -version # 查看Java版本
echo $JAVA_HOME # 查看JAVA_HOME環境變量
若未安裝Java,使用以下命令安裝OpenJDK 8(CentOS為例):
sudo yum install java-1.8.0-openjdk-devel -y
若未設置JAVA_HOME
,可編輯~/.bash_profile
文件添加:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
source ~/.bash_profile
Java版本不兼容(如Java 17)或環境變量未設置會導致啟動失敗。
Zookeeper默認使用2181端口(客戶端連接)、2888端口(Follower與Leader通信)、3888端口(Leader選舉)。使用以下命令檢查端口占用情況:
netstat -tulnp | grep 2181 # 查看2181端口占用
ss -tuln | grep 2181 # 更現代的端口查看命令
若端口被占用,可殺掉占用進程(kill -9 <PID>
)或修改zoo.cfg
中的clientPort
為新端口(如2182),并重啟服務。
Zookeeper集群要求節點間網絡互通,使用ping
命令測試節點間連通性:
ping node2 # 測試與node2的連通性
使用telnet
命令測試端口是否可達(如2181端口):
telnet node2 2181 # 測試node2的2181端口
若無法連通,需檢查防火墻設置或網絡配置。
Zookeeper是內存密集型應用,需確保系統有足夠的資源:
free -m
查看內存使用情況,若內存不足,可調整zoo.cfg
中的maxClientCnxns
(最大客戶端連接數)或增加系統內存;df -h
查看磁盤空間,若dataDir
所在分區空間不足(如小于1GB),需清理磁盤或更換存儲路徑;top
查看CPU使用率,若CPU占用過高(如超過80%),需優化Zookeeper參數(如調整tickTime
)或升級硬件。Zookeeper提供了一系列四字命令(需在zoo.cfg
中開啟4lw.commands.whitelist
參數,默認允許常用命令),用于監控集群狀態:
stat
:查看服務器運行狀態(角色、連接數、zxid等);ruok
:檢查服務器是否運行(返回imok
表示正常);mntr
:查看集群詳細指標(Leader/Follower狀態、事務處理數量等);cons
:查看客戶端連接詳情(IP、延遲、請求隊列)。nc
命令執行四字命令(如localhost
為本地服務器):echo stat | nc localhost 2181 # 查看服務器狀態
echo mntr | nc localhost 2181 # 查看集群指標
通過四字命令可快速判斷集群是否正常運行(如ruok
返回imok
表示服務正常)。
集群腦裂(多個Leader節點)會導致數據不一致,常見原因包括:
myid
文件配置錯誤(節點ID與server.X
不匹配);myid
文件(位于dataDir
目錄),確保內容與zoo.cfg
中的server.X
一致;mntr
命令查看集群狀態,確認Leader節點是否唯一。若以上步驟均無法解決問題,可嘗試重啟Zookeeper服務:
sudo systemctl restart zookeeper
若重啟后仍無法啟動,需清除數據目錄(dataDir
)和日志目錄(dataLogDir
)中的數據(注意:需提前備份重要數據),然后重新啟動:
rm -rf /tmp/zookeeper/* # 清除數據目錄(默認/tmp/zookeeper)
./bin/zkServer.sh start # 重啟服務
清除數據可解決數據損壞或事務日志異常導致的問題。