一、部署
兩臺虛擬機(CentOS Linux 7):
192.168.190.200 master
192.168.190.201 slave1
創建兩個zookeeper服務,最好是奇數個節點,原因:
3個節點和4個節點時,允許節點宕機數目都爲1個(需保證集羣一半以上節點存活,才能正常工作),
所以從可靠性角度,3個和4個效果一樣。
注:如果只有一個節點,採用僞分佈模式(standalone),就忽略全文中關於 slave1 節點的配置即可
所有節點都執行(hadoop用戶)
1. 在 /home/hadoop/ 下創建目錄,如下結構:
zookeeper_server
|—— data
|—— logs
(**下面是很關鍵的一步)
並在 data/ 下創建 myid 文件,用於存放 zk的server_id
master 節點中的 myid 文件內容: 0
slave1 節點中的 myid 文件內容: 1 (僞分佈可不配置此項)
2. 下載 ZooKeeper 版本:zookeeper-3.4.14.tar.gz ,存放/opt/下
3. 解壓
$ cd /opt
$ tar -zxvf zookeeper-3.4.14.tar.gz
4. 複製並修改配置文件
$ cd zookeeper-3.4.14/conf
$ cp zoo_sample.cfg zoo.cfg
$ vi zoo.cfg
<如下配置:>
tickTime=2000 # 客戶端與服務端的心跳間隔(毫秒)
initLimit=10 # follower和leader服務器間初始連接的超時時間,tick倍數
syncLimit=5 # follower和leader服務器間同步時的超時時間,tick倍數
dataDir=/home/hadoop/zookeeper_server/data # 內存數據庫快照存放目錄
dataLogDir=/home/hadoop/zookeeper_server/logs # 事務日誌目錄
clientPort=2181 # 服務器向客戶端提供的連接端口號
server.0=192.168.190.200:2888:3888 # 服務器0地址
server.1=192.168.190.201:2888:3888 # 服務器1地址 (僞分佈可不配置此項)
注:server.id=host:port:port 中的後兩個端口號分別用於仲裁通訊和羣首選舉
5. 配置zk環境變量,在/etc/profile文件末尾添加如下內容:
$ su root
$ vi /etc/profile
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_HOME/bin
$ source /etc/profile
6. 啓動所有節點的zk server 進程:
hadoop@master ~]$ zkServer.sh start
hadoop@slave1 ~]$ zkServer.sh start
啓動後,如下信息:
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
7. 查看服務是否真的啓動了
$ ps -ef | grep zookeeper
8. 查看zk服務狀態(提示:leader 和 follower )
hadoop@master ~]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower
hadoop@slave1 ~]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: leader
**注:1.服務只啓動了一個(無法構成法定仲裁人數:至少 三分之二 數量);
2.或者防火牆沒有關;
3.或者server_id配置錯誤
都會如下報錯:
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
9. 相關服務操作:
$ zkServer.sh start
$ zkServer.sh status
$ zkServer.sh restart
$ zkServer.sh stop
$ zkServer.sh start-foreground (以打印日誌方式啓動,容易打印時卡住)
10. 訪問集羣
$ zkCli.sh -server master:2181
1. 創建znode節點,幷包含數據
[zk: master:2181(CONNECTED) 0] create /mynode "Hello zk !"
Created /mynode
2. 獲取znode數據
[zk: master:2181(CONNECTED) 1] get /mynode
Hello zk !
3. 刪除znode節點
[zk: master:2181(CONNECTED) 2] delete /mynode
4. 查看根節點下子節點目錄
[zk: master:2181(CONNECTED) 3] ls /
5. 更多命令查看help
[zk: master:2181(CONNECTED) 4] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
二、ZooKeeper相關概念
**ZooKeeper相關概念:
1. ZooKeeper是一個爲分佈式應用程序提供一致性協調服務的軟件。
2. 提供的服務包括:
1)域名服務:用於跟蹤一組服務器的運行狀態;
2)鎖定服務:分佈式互斥訪問共享資源,實現鎖機制;
3)同步服務:分佈式同步訪問共享資源,實現生產者-消費者模式、或是一個障礙;
4)配置管理:對集羣的分佈式系統配置進行統一的集中存儲和管理;
5)羣首選舉:針對集羣的分佈式系統存在某一節點宕機的問題,通過羣首選舉支持自動的故障轉移策略,實現主備節點切換。
3. 遵循Server-Client模型,以多機器形成集羣來提供服務。
4. 三種角色:Leader, Follower, Observer.
1)一個集羣只能有一個Leader,其它都是Follower和Observer;
2)通過Leader選舉機制產生Leader機器;
3)設定爲Observer的機器不參加Leader選舉過程。
5. 數據模型:ZNode Tree (樹形模型)
1)znode中包含了存儲的數據和ACL(Access Control List);
2)數據節點中只能存儲少量數據,最大不超過1MB;
3)原子性的數據訪問方式:
a. 數據讀取時:不允許只獲取到部分數據;要麼全部得到,要麼全部沒有得到;
b. 數據寫入時:不允許只寫入部分數據;要麼全部寫入,要麼寫入失敗;
c. 保證數據的讀取只有兩個結果:成功、失敗。
4)節點分臨時節點(Ephemeral ZNodes)和持久節點(Persistent ZNodes)
a.分佈式資源是否可用,就是通過臨時節點實現的;
通過創建臨時節點來代表佔領資源取得鎖,刪除節點代表釋放鎖。
5)如:"/Spark/Master"中,Spark和Master都爲ZNode節點,各自保存自己的數據內存、屬性信息。
6)ZooKeeper將所有數據都存在內存中。
6. 客戶端會話Session:客戶端通過TCP長連接與服務器建立聯繫。
1)默認服務端口:2181
2)會話超時時間設置:SessionTimeout參數
三、參考文章:
1. 《Spark Streaming 實時流式大數據處理實戰》5.1 ZooKeeper簡介