目錄
簡介
zookeeper是一個為分布式應用所設計的分布式的、開源的協調服務。它提供了一項基本服務:分布式鎖服務,同時也提供了分布式應用數據的維護和管理機制,包括統一命名服務、狀態同步服務、集群管理、分布式消息隊列、分布式應用配置項的管理等。zookeeper支持獨立安裝以及集群部署。
zookeeper官方網站:http://zookeeper.apache.org/
zookeeper下載地址:https://www.apache.org/dyn/closer.cgi/zookeeper/
架構
Zookeeper集群主要角色有Server和Client,其中Server分為Leader、Follower和Observer三個角色:
- Leader:領導者角色,主要負責投票的發起和決議,以及更新系統狀態
- Follower:跟隨者角色,用於接收客戶請求並向客戶端返回結果,在選主過程中參與投票
- Observer:Observer可以接收客戶端連接,將寫請求轉發給leader。但observer不參加投票,只同步leader狀態。observer的目的是為了擴展系統,提高讀取速度。
- Client:客戶端,用於向zk發起請求。
zk集群中每個server在內存中存儲一份數據。在zk啟動時,將從實例中選舉一個server作為leader,leader負責處理數據更新等操作,當且僅當大多數server在內存中成功修改數據,才認為數據修改成功。
zk寫的流程:
- 客戶端首先和一個server或者observer通信,發起寫請求
- server將寫請求轉發給leader
- leader再將寫請求轉發給其他server,其他server在接收到寫請求后寫入數據並響應leader
- leader在接收到大多數寫成功回應后,認為數據寫成功
- server響應client,完成一次寫操作
安裝
StandAlone模式
1. 安裝
tar xf zookeeper-3.4.14.tar.gz -C /usr/local/
cd /usr/local/
ln -s zookeeper-3.4.14 zookeeper
# 創建數據目錄和日志目錄
mkdir /usr/local/zookeeper/{data,logs}
注: zk的安裝依賴java,所以需要先安裝jdk
2. 修改配置
cd /usr/local/zookeeper/conf
cp zoo_sample.conf zoo.conf
#vim zoo.conf
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs
clientPort=2181
配置項說明:
- tickTime: zk中使用的基本時間單元,單位為毫秒,用於控制心跳和超時。更低的tickTime值可以更快的發現超時問題
- initLimit:zk集群中follower初始化連接到leader時,最長能忍受多少個tickTime,默認值為10,即為20s
- syncLimit:用於配置leader和follower間進行心跳檢測的最大超時時間。如果在設置的時間內followers無法與leader進行通信,那么follower將會被丟棄。默認值為5,即10s
- dataDir:zk用於存儲內存數據庫快照的目錄。如果不指定dataLogDir參數,則數據庫更新的事務日志也將會存儲在該目錄下
- dataLogDir:指定zk事務日志的存儲目錄
- clientPort:服務器監聽客戶端連接的端口,默認值為2181
- maxClientCnxns:限制單個客戶端與單台服務之間的並發連接數,默認值為60,設置為0則不限制
- autopurge.snapRetainCount:配置zk在自動清理的時候需要保存的數據文件快照的數量和對應的事務日志文件,默認為3
- autopurge.purgeInterval:和autopurge.snapRetainCount配置使用,用於配置zk自動清理文件的頻率,默認為1小時,即默認開啟自動清理功能,設置為0,則表示禁用清理功能
3. 啟動
/usr/local/zookeeper/zkServer.sh start
4. 驗證
[root@app conf]# telnet 127.0.0.1 2181
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stat
Zookeeper version: 3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT
Clients:
/127.0.0.1:42638[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: standalone
Node count: 4
5. 基本用法
[root@app conf]# /usr/local/zookeeper/bin/zkCli.sh -server localhost:2181
Connecting to localhost:2181
...
[zk: localhost:2181(CONNECTED) 0] 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
[zk: localhost:2181(CONNECTED) 1]
Distributed模式
1. 配置hosts
#vim /etc/hosts
zk1 192.168.0.101
zk2 192.168.0.102
zk3 192.168.0.103
2. 配置zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs
clientPort=2181
server.1=192.168.0.101:2888:3888
server.2=192.168.0.102:2888:3888
server.3=192.168.0.103:2888:3888
配置項說明:
- 集群模式中,集群中的每台機器都需要感知其它機器,在zoo.cfg配置文件中,可以按照如下格式進行配置:
server.id=host:port:port
,其中id即server id,用於標識服務器在集群中的序號。每台zk服務器上,都需要在數據目錄下創建一個myid文件,該文件中只有一行內容,即對應於每台服務器的server id。 - zk集群中,每台服務器上的zoo.cfg配置文件內容一致
3. 創建myid文件
# 每個服務器上的myid內容都不同,且需要保證和自己的zoo.cfg配置文件中"server.id=host:port:port"的id值一致
# id的范圍是1~255
echo "1" > /usr/local/zookeeper/data/myid
4. 啟動服務
/usr/local/zookeeper/zkServer.sh start
5. 驗證
[root@app conf]# telnet 127.0.0.1 2181
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stat
Zookeeper version: 3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT
Clients:
/127.0.0.1:41142[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000000
Mode: leader
Node count: 4
Proposal sizes last/min/max: -1/-1/-1
Connection closed by foreign host.
6. 查詢狀態
[root@app conf]# ../bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader