前言:ZooKeeper是一個分散式協調服務,它為分散式應用提供一致性服務,是Apache Hadoop的子專案。它被設計為易於程式設計,同時具有高效能和高可靠性。ZooKeeper提供了一個簡單的介面和一些基本的檔案系統操作,使得開發者能夠快速地構建分散式應用。
以下是ZooKeeper的一些關鍵特性和概念:
-
一致性:ZooKeeper保證了分散式環境中資料的一致性。它使用原子操作來確保在分散式系統中資料的一致性。
-
可靠性:ZooKeeper透過資料複製和容錯機制來保證服務的可靠性。即使部分伺服器出現故障,ZooKeeper也能繼續提供服務。
-
有序性:ZooKeeper能夠保證操作的順序性,即使在分散式環境中,也能確保操作按照特定的順序執行。
-
實時性:ZooKeeper提供了實時的資料更新和監控機制,客戶端可以實時獲取到資料的變化。
-
層次名稱空間:ZooKeeper使用層次化的名稱空間(類似於檔案系統的路徑),這使得資料的組織和管理更加直觀和方便。
-
資料模型:ZooKeeper的資料模型類似於檔案系統,但它的資料節點(ZNodes)可以儲存少量的資料(預設不超過1MB)。
-
會話管理:客戶端與ZooKeeper伺服器之間建立的會話可以保持一段時間,期間客戶端可以執行各種操作。
-
ACL(訪問控制列表):ZooKeeper支援細粒度的許可權控制,可以對不同的ZNode設定不同的訪問許可權。
-
分散式同步:ZooKeeper提供了分散式鎖、佇列等同步原語,幫助分散式系統中的節點協調操作。
-
Watcher機制:ZooKeeper允許客戶端註冊Watcher來監聽ZNode的變化,當ZNode發生變化時,ZooKeeper會通知客戶端。
ZooKeeper的應用場景非常廣泛,包括但不限於:
- 配置管理:在分散式系統中動態地管理配置資訊。
- 命名服務:為分散式系統中的服務提供命名和發現機制。
- 分散式鎖:在分散式系統中實現鎖的功能,以避免多個節點同時執行相同的操作。
- 叢集管理:管理叢集中的節點狀態,如選舉主節點等。
- 佇列管理:實現分散式佇列,用於任務分發和負載均衡。
ZooKeeper通常作為大型分散式系統的基礎設施之一,為系統提供必要的協調和同步服務。
部署zk3.9.2單機:
安裝zk,需要jdk環境,參考部落格xc安裝jdk篇
第一步:上傳apache-zookeeper-3.9.2-bin.tar.gz包
使用ssh終端工具登入到Zookeeper伺服器上。本例中安裝在/mpjava目錄下
第二步:配置zookeeper
1、根據zookeeper伺服器在zookeeper叢集的順序,建立zookeeper例項目錄。(zookeeper叢集必須是奇數臺)
例如:zookeeper叢集有三臺伺服器,本伺服器是第1臺伺服器,則在/mpjava目錄下建立目錄zookeeper-3.9.2,依次類推。
命令:mkdir /mpjava/zookeeper-3.9.2
2、在zookeeper-3.9.2例項目錄下建立data、dataLog
命令:mkdir data dataLog
3、在data目錄下建立myid檔案,填入服務例項的順序
例如本伺服器是第1臺伺服器,則在myid中填入1,依次類推。
4、將zookeeper-3.9.2-bin.tar.gz解壓到zookeeper-3.9.2目錄下面
命令:tar -zxvf zookeeper-3.9.2-bin.tar.gz
5、將/mpjava/zookeeper-3.9.2/apache-zookeeper-3.9.2-bin/conf/zoo_sample.cfg檔案複製為zoo.cfg檔案
命令:cd /mpjava/zookeeper-3.9.2/apache-zookeeper-3.9.2-bin/conf/ && cp zoo_sample.cfg zoo.cfg
6、按照下面的說明,編輯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.
dataDir=/mpjava/zookeeper-3.9.2/data
dataLogDir=/mpjava/zookeeper-3.9.2/dataLog
maxClientCnxns=5000
4lw.commands.whitelist=*
# the port at which the clients will connect
clientPort=2181 (建議預設埠)
server.1=10.0.0.8:2888:3888
註釋:
dataDir目錄為本zookeeper例項的data目錄
dataLogDir目錄為本zookeeper例項的dataLogDir目錄
clientPort為客戶端連線埠,保持為2181不改變。
server.1中的1為例項順序,根據zookeeper例項序號,ip、port保持為127.0.0.1:2888:3888。
第三步:輸入下面命令,執行zookeeper目錄bin/zkServer.sh,啟動zookeeper
命令:./zkServer.sh start
命令:jps
啟動成功!
參考命令:
停止 ZooKeeper: ./zkServer.sh stop
檢視 ZooKeeper狀態: ./zkServer.sh status
檢視 ZooKeeper 伺服器的日誌: tail -f $ZOOKEEPER_HOME/logs/zookeeper.log
配置單節點開機自啟:
命令:vim /etc/rc.d/rc.local
新增:
export JAVA_HOME=/usr/java/jdk1.8.0_421
export PATH=$JAVA_HOME/bin:$PATH
touch /var/lock/subsys/local
/mpjava/zookeeper-3.9.2/apache-zookeeper-3.9.2-bin/bin/./zkServer.sh start
啟動 rc-local:
命令:systemctl restart rc-local
命令:systemctl status rc-local
測試:export JAVA_HOME=""
命令:/etc/rc.d/rc.local start
然後reboot
部署zk3.9.2叢集:
安裝zk,需要jdk環境,參考部落格xc安裝jdk篇
部署準備工作:
第一步:修改 /etc/hosts檔案
三節點:vim /etc/hosts
新增:
10.0.0.1 GH-PROD-MP-1
10.0.0.2 GH-PROD-MP-3
10.0.0.3 GH-PROD-MP-2
第二步:安裝ntpdate並配置時鐘同步
sudo yum update
sudo yum install ntpdate
時鐘同步命令:ntpdate pool.ntp.org
第三步:關閉防火牆
修改vim /etc/sysconfig/selinux
原檔案:SELINUX=permissive
修改設定 SELINUX=disabled
命令:systemctl disable firewalld
命令:systemctl stop firewalld
**第四步:將部署元件解壓縮分發到各個節點 **
命令: mkdir /usr/lib/hadoop
命令: tar -zxvf apache-zookeeper-3.9.2-bin.tar.gz
命令: mv apache-zookeeper-3.9.2-bin zookeeper-3.9.2
第六步:修改環境變數(即在檔案~/.bash_profile尾部追加下面的宣告語句)
命令:vim ~/.bash_profile
export ZOOKEEPER_HOME=/usr/lib/hadoop/zookeeper-3.9.2
export PATH=$PATH:$ZOOKEEPER_HOME/bin
export ZOO_LOG_DIR=/var/hadoop/zk/logs
第六步:重啟伺服器
命令:reboot
部署zookeeper 叢集 :
第一步:建立目錄
1、建立臨時目錄/var/hadoop/zk/tmp(每個節點都需要配置)
2、建立日誌目錄/var/hadoop/zk/logs(每個節點都需要配置)
3、建立資料節點目錄/var/hadoop/zk/data (每個節點都需要配置)
命令:mkdir -p /var/hadoop/zk/tmp /var/hadoop/zk/logs /var/hadoop/zk/data
第二步:修改$ZOOKEEPER_HOME/conf/zoo.cfg(在 GH-PROD-MP-1)
從模板zook_sample.cfg 複製一份配置檔案zoo.cfg
命令:cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg
修改配置檔案:
tickTime=6000
dataDir=/var/hadoop/zk/data #資料儲存路徑
dataLogDir=/var/hadoop/zk/logs #日誌路徑
autopurge.purgeInterval=1 #快照自動清理頻率,單位:小時
autopurge.snapRetainCount=3 #儲存快照數量
server.0=GH-PROD-MP-1:2888:3888
server.1=GH-PROD-MP-2:2888:3888
server.2=GH-PROD-MP-3:2888:3888
第三步:編輯myid
GH-PROD-MP-1執行:echo 0 > /var/hadoop/zk/data/myid
GH-PROD-MP-2執行:echo 1 > /var/hadoop/zk/data/myid
GH-PROD-MP-3執行:echo 2 > /var/hadoop/zk/data/myid
第五步:同步配置檔案到叢集到其他節點(在 GH-PROD-MP-1)
命令:tar -czf conf.tar.gz conf/
命令:scp -r $ZOOKEEPER_HOME/conf.tar.gz GH-PROD-MP-2:$ZOOKEEPER_HOME/
命令:scp -r $ZOOKEEPER_HOME/conf.tar.gz GH-PROD-MP-3:$ZOOKEEPER_HOME/
第六步:啟動zookeeper叢集
1、在GH-PROD-MP-1,GH-PROD-MP-2,GH-PROD-MP-3分別執行啟動命令:zkServer.sh start
2、驗證叢集啟動成功,分別輸入:jps
GH-PROD-MP-1
GH-PROD-MP-2
GH-PROD-MP-3
配置開機自動:
這裡推薦幾種不同方法(這裡一和二不寫具體配置了,優先推薦方法二,便於運維管理),如果無法生效就用方法三:
方法一:crontab -e
方法二:/etc/systemd/system/zookeeper.service
方法三:
命令:vim /etc/rc.d/rc.local
新增:
export JAVA_HOME=/usr/java/jdk1.8.0_421
export PATH=$JAVA_HOME/bin:$PATH
touch /var/lock/subsys/local
#!/bin/sh -e
if ! pgrep -x "zkServer.sh" > /dev/null
then
/usr/lib/hadoop/zookeeper-3.9.2/bin/zkServer.sh start
fi
exit 0
加執行許可權: chmod +x /etc/rc.d/rc.local
參考命令,啟動rc-local:systemctl restart rc-local
檢視 rc-local狀態:systemctl status rc-local
然後reboot
驗證