原文鏈接: http://gudaoyufu.com/?p=1395
zookeeper工作方式
ZooKeeper 是一個開源的分布式協調服務,由雅虎創建,是 Google Chubby 的開源實現。 分布式應用程序可以基于 ZooKeeper 實現諸如數據發布/訂閱、負載均衡、命名服務、分布式協 調/通知、集群管理、Master 選舉、分布式鎖和分布式隊列 等功能。
在使用中,通常以集群的方式部署,Zookeeper節點部署越多,服務的可靠性越高,建議部署奇數個節點,因為zookeeper集群是以宕機個數過半才會讓整個集群宕機的,集群節點數為奇數最佳。
zookeeper也可以以單實例或偽集群的方式運行,只不過這種方式不適用高并發的環境。下面記錄一下部署zookeeper的過程,包括單實例和偽集群,分布式集群的部署。
安裝JDK
zookeeper是由JAVA開發,運行需要有JAVA環境,安裝前先安裝JDK。
JDK下載:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下載完成后直接yum安裝即可
單機實例部署
- 下載
各版本可以在官方網站下載 : https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/
這里下載的版本是 3.4.12
- 解壓至指定路徑
[root@zookeeper ~]# tar zxf zookeeper-3.4.12.tar.gz -C /data/
- 修改解壓目錄名稱,做偽集群或分布式集群最好將目錄標明白,容易看清
[root@zookeeper ~]# mv /data/zookeeper-3.4.12/ /data/zookeeper1
- 修改配置文件
[root@zookeeper ~]# cd /data/zookeeper1/conf/
[root@zookeeper conf]# mv zoo_sample.cfg zoo.cfg
- 單機實例部署配置如下
[root@zookeeper conf]# vim zoo.cfg
tickTime=2000 #2000毫秒=2秒
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/datadir
dataLogDir=/opt/zookeeper/logdir
clientPort=2181
- 創建數據目錄
[root@zookeeper conf]# mkdir -pv /opt/zookeeper/{datadir,logdata}
mkdir: 已創建目錄 "/opt/zookeeper"
mkdir: 已創建目錄 "/opt/zookeeper/datadir"
mkdir: 已創建目錄 "/opt/zookeeper/logdata"
配置參數說明
ickTime這個時間是作為zookeeper服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是說每個tickTime時間就會發送一個心跳。
initLimit : 配置項是用來配置zookeeper接受客戶端(這里所說的客戶端不是用戶連接zookeeper服務器的客戶端,而是zookeeper服務器集群中連接到leader的follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過10個心跳的時間(也就是tickTime)長度后 zookeeper 服務器還沒有收到客戶端的返回信息,那么表明這個客戶端連接失敗。總的時間長度就是 102000=20秒。- syncLimit :配置項標識leader與follower之間發送消息,請求和應答時間長度,最長不能超過多少個tickTime的時間長度,總的時間長度就是5*2000=10秒。
- dataDir :是zookeeper保存數據的目錄,默認情況下如果不定義dataLogDir,zookeeper將寫數據的日志文件也保存在這個目錄里,最好分開定義
- clientPort : 客戶端連接Zookeeper服務器的端口,Zookeeper會監聽這個端口接受客戶端的訪問請求;
server.n=ipA:B:C :定義集群節點號,ip,監聽端口,選舉通信端口,n是一個數字,表示這個是第幾號服務器,A是這個服務器的IP地址,B第一個端口用來集群成員的信息交換,表示這個服務器與集群中的leader服務器交換信息的端口,C是在leader掛掉時專門用來進行選舉leader所用的端口。
啟動zookeeper
[root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh startZooKeeper JMX enabled by default
Using config: /data/zookeeper1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
- 查看狀態
[root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/zookeeper1/bin/../conf/zoo.cfg
Mode: standalone #單機模式
- 查看端口 2181已經啟動
zookeeper指令
zookeeper啟動后,可以先連接測試是否正常
[root@zookeeper ~]# cd /data/zookeeper1/bin/
[root@zookeeper bin]# ./zkCli.sh -server 127.0.0.1WATCHER::WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1(CONNECTED) 0] #登錄成功
zookeeper啟動后會在當前用戶的家目錄生成狀態日志zookeeper.out,平時服務狀態出現問題可以從里面找到問題所在
連接上zk后,隨意輸入一個字符,通常是?號,會給出zookeeper的指令幫助
[zk: 127.0.0.1(CONNECTED) 0] ?
ZooKeeper -server host:port cmd argsstat path [watch]set path data [version]ls path [watch] #查看節點delquota [-n|-b] pathls2 path [watch]setAcl path aclsetquota -n|-b val pathhistory redo cmdnoprintwatches on|offdelete path [version]sync pathlistquota pathrmr pathget path [watch]create [-s] [-e] path data acl #創建節點addauth scheme authquit getAcl pathclose connect host:port #連接指令
- 創建節點
[zk: 127.0.0.1(CONNECTED) 1] create /test "test"
Created /test
[zk: 127.0.0.1(CONNECTED) 2] ls /
[zookeeper, test]
- 獲取節點內容
[zk: 127.0.0.1(CONNECTED) 3] get /test
test
cZxid = 0x8 :該節點是由哪個事務ID產生
ctime = Sat Sep 01 21:41:06 CST 2018
mZxid = 0x8 :最近更新了該節點的事務ID
mtime = Sat Sep 01 21:41:06 CST 2018
pZxid = 0x8 :該節點的子節點列表被修改的事務ID
cversion = 0 :子節點版本號
dataVersion = 0 : 數據版本號
aclVersion = 0 : ACL版本號
ephemeralOwner = 0x0
dataLength = 4 : 數據長度
numChildren = 0 : 子節點個數
樂觀并發訪問控制和悲觀并發訪問控制 —延伸
- 更新節點
[zk: 127.0.0.1(CONNECTED) 4] set /test "test path"
- 刪除節點
[zk: 127.0.0.1(CONNECTED) 6] delete /test
[zk: 127.0.0.1(CONNECTED) 7] ls /test
Node does not exist: /test
#如果刪除有子目錄的節點,使用rmr指令
臨時節點不能有子節點
ookeeper四字命令
使用telnet可以連接zookeeper發送4個字符的命令。
[root@zookeeper bin]# telnet 127.0.0.1 2181
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
ruok #探測是否存活
imokConnection closed by foreign host.
[root@zookeeper bin]# telnet 127.0.0.1 2181
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stat #查看zk版本信息
Zookeeper version: 3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMT
Clients:/127.0.0.1:52636[0](queued=0,recved=1,sent=0)Latency min/avg/max: 0/2/308
Received: 248
Sent: 247
Connections: 1
Outstanding: 0
Zxid: 0xc
Mode: standalone
Node count: 5
Connection closed by foreign host.
[root@zookeeper bin]# telnet 127.0.0.1 2181
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
conf #查看節點配置信息
clientPort=2181
dataDir=/opt/zookeeper/datadir/version-2
dataLogDir=/opt/zookeeper/logdir/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=0
Connection closed by foreign host.
zookeeper偽集群部署
zookeeper偽集群是部署在一臺服務器上,通過創建多個工作目錄配置項等,實現多實例的運行
在上面的基礎上,再添加兩個實例
- 將原來/data/zookeeper1目錄復制
[root@zookeeper ~]# cp -ar /data/zookeeper1/ /data/zookeeper2
[root@zookeeper ~]# cp -ar /data/zookeeper1/ /data/zookeeper3
[root@zookeeper ~]# ls /data/
zookeeper1 zookeeper2 zookeeper3
- 修改zookeeper1配置文件
[root@zookeeper ~]# vim /data/zookeeper1/conf/zoo.cfg dataDir=/opt/zookeeper/datadir #各偽節點目錄不能相同
dataLogDir=/opt/zookeeper/logdir
clientPort=2181 #各偽節點端口不能相同#下面的節點定義各偽節點要相同
server.1=192.168.214.171:2888:3888
server.2=192.168.214.171:2889:3889
server.3=192.168.214.171:2890:3890
- 修改zookeeper2配置文件
[root@zookeeper ~]# vim /data/zookeeper2/conf/zoo.cfg dataDir=/opt/zookeeper2/datadir
dataLogDir=/opt/zookeeper2/logdir
clientPort=2182
server.1=192.168.214.171:2888:3888
server.2=192.168.214.171:2889:3889
server.3=192.168.214.171:2890:3890
- 修改zookeeper3配置文件
dataDir=/opt/zookeeper3/datadir
dataLogDir=/opt/zookeeper3/logdir
clientPort=2183
server.1=192.168.214.171:2888:3888
server.2=192.168.214.171:2889:3889
server.3=192.168.214.171:2890:3890
- 創建數據存放目錄
[root@zookeeper ~]# mkdir -pv /opt/zookeeper{2,3}/{datadir,logdir}
mkdir: 已創建目錄 "/opt/zookeeper2"
mkdir: 已創建目錄 "/opt/zookeeper2/datadir"
mkdir: 已創建目錄 "/opt/zookeeper2/logdir"
mkdir: 已創建目錄 "/opt/zookeeper3"
mkdir: 已創建目錄 "/opt/zookeeper3/datadir"
mkdir: 已創建目錄 "/opt/zookeeper3/logdir"
- 為每個節點設置節點ID號
[root@zookeeper ~]# echo 1 > /opt/zookeeper/datadir/myid
[root@zookeeper ~]# echo 2 > /opt/zookeeper2/datadir/myid
[root@zookeeper ~]# echo 3 > /opt/zookeeper3/datadir/myid[root@zookeeper ~]# cat /opt/zookeeper/datadir/
myid version-2/
[root@zookeeper ~]# cat /opt/zookeeper/datadir/myid
1
[root@zookeeper ~]# cat /opt/zookeeper2/datadir/myid
2
[root@zookeeper ~]# cat /opt/zookeeper3/datadir/myid
3
- 啟動集群
[root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /data/zookeeper1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED[root@zookeeper ~]# /data/zookeeper2/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /data/zookeeper2/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED[root@zookeeper ~]# /data/zookeeper3/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /data/zookeeper3/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
- 查看狀態
[root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/zookeeper1/bin/../conf/zoo.cfg
Mode: leader[root@zookeeper ~]# /data/zookeeper2/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/zookeeper2/bin/../conf/zoo.cfg
Mode: follower[root@zookeeper ~]# /data/zookeeper3/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/zookeeper3/bin/../conf/zoo.cfg
Mode: follower
- 測試master切換
關閉leader節點
[root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /data/zookeeper1/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED#zookeeper2節點立即變成了leader[root@zookeeper ~]# /data/zookeeper2/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/zookeeper2/bin/../conf/zoo.cfg
Mode: leader
- 再啟動zookeeper1節點,會以follower角色工作
[root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /data/zookeeper1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@zookeeper ~]# /data/zookeeper1/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/zookeeper1/bin/../conf/zoo.cfg
Mode: follower
關于zookeeper的單機模式和偽集群就寫到這,分布式集群部署點擊閱讀