ZooKeeper作為頂級分布式開源項目,應(yīng)用非常廣泛,Dubbo和Kafka這些知名的開源項目都在使用。之前只是聽說過它,并沒有仔細(xì)研究過。今天帶大家來學(xué)習(xí)下ZooKeeper,主要從ZooKeeper的安裝、可視化工具、應(yīng)用三方面來介紹,希望對大家有所幫助!
簡介
ZooKeeper是一款分布式協(xié)調(diào)框架,它可以為分布式系統(tǒng)提供一致性服務(wù)。ZooKeeper最初由Yahoo開發(fā),后來捐獻(xiàn)給了Apache基金會,現(xiàn)已成功Apache的頂級項目,目前在Github上有9.5k+Star。
分布式協(xié)調(diào)
要理解ZooKeeper我們首先需要了解下什么是分布式協(xié)調(diào)
?這里拿Spring Cloud中注冊中心的例子來說吧。
微服務(wù)(分布式)系統(tǒng)中有很多服務(wù),相同的服務(wù)又有多個實例,我們在應(yīng)用中可以通過服務(wù)名來負(fù)載均衡地調(diào)用服務(wù),而這些服務(wù)有可能會掛掉,也有可能會有新的實例加入。此時我們就需要一個東西來做協(xié)調(diào),保存好服務(wù)名稱和可用實例調(diào)用IP的對應(yīng)關(guān)系,此時注冊中心就是一個分布式協(xié)調(diào)者的角色,而ZooKeeper就可以用來充當(dāng)這個協(xié)調(diào)者。
安裝
ZooKeeper的安裝無論是Windows還是Linux都是很方便的,我們先來學(xué)習(xí)下它的安裝。
Windows安裝
- 首先下載ZooKeeper安裝包,下載地址:https://www./dyn/closer.lua/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
- 解壓到指定目錄,解壓完成后目錄結(jié)構(gòu)如下;
- 在
conf
目錄下創(chuàng)建配置文件zoo.cfg
,內(nèi)容如下;
# 設(shè)置心跳時間,單位毫秒
tickTime=2000
# 存儲內(nèi)存數(shù)據(jù)庫快照的文件夾
dataDir=I:/developer/env/apache-zookeeper-3.7.0-bin/data
# 監(jiān)聽客戶端連接的端口
clientPort=2181
- 進(jìn)入
bin
目錄,啟動ZooKeeper服務(wù);
zkServer.cmd
Linux安裝
- 使用Docker安裝ZooKeeper無疑是最方便的,首先我們下載它的Docker鏡像;
docker pull zookeeper:3.7.0
- 創(chuàng)建好ZooKeeper的配置文件目錄,并切換到該目錄創(chuàng)建配置文件
zoo.cfg
;
mkdir /mydata/zookeeper/conf/ -p
cd /mydata/zookeeper/conf/
touch zoo.cfg
- 配置文件
zoo.cfg
內(nèi)容如下,直接使用VIM編輯即可;
# 設(shè)置心跳時間,單位毫秒
tickTime=2000
# 存儲內(nèi)存數(shù)據(jù)庫快照的文件夾
dataDir=/tmp/zookeeper
# 監(jiān)聽客戶端連接的端口
clientPort=2181
docker run -p 2181:2181 --name zookeeper \
-v /mydata/zookeeper/conf/zoo.cfg:/conf/zoo.cfg \
-d zookeeper:3.7.0
命令行操作
接下來我們用命令行來操作下ZooKeeper,熟悉下ZooKeeper的使用。
- 首先使用
zkCli
命令行工具連接到ZooKeeper;
zkCli.cmd -server 127.0.0.1:2181
- 通過
help
可以命令查看ZooKeeper的常用命令;
[zk: 127.0.0.1:2181(CONNECTED) 0] help
ZooKeeper -server host:port -client-configuration properties-file cmd args
addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
addauth scheme auth
close
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path [-b batch size]
delquota [-n|-b|-N|-B] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
printwatches on|off
quit
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b|-N|-B val path
stat [-w] path
sync path
version
whoami
- 大家都知道Redis是通過
key-value
的形式存儲數(shù)據(jù)的,而ZooKeeper是通過znode-value
的形式存儲數(shù)據(jù)的,znode有點像目錄,而/
目錄就是ZooKeeper中的根目錄,通過如下命令可以查看所有znode;
[zk: 127.0.0.1:2181(CONNECTED) 1] ls /
[zookeeper]
- 創(chuàng)建一個znode叫做
/zk_test
,存儲字符串my_data
,這用起來有點像Redis;
[zk: 127.0.0.1:2181(CONNECTED) 2] create /zk_test my_data
Created /zk_test
- 查看所有znode,可以看到
zk_test
這個znode;
[zk: 127.0.0.1:2181(CONNECTED) 3] ls /
[zk_test, zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 4] get /zk_test
my_data
[zk: 127.0.0.1:2181(CONNECTED) 5] set /zk_test test_data
[zk: 127.0.0.1:2181(CONNECTED) 6] get /zk_test
test_data
[zk: 127.0.0.1:2181(CONNECTED) 7] delete /zk_test
[zk: 127.0.0.1:2181(CONNECTED) 8] ls /
[zookeeper]
可視化管理
PrettyZoo
是一款基于 Apache Curator 和 JavaFX 實現(xiàn)的 Zookeeper 圖形化管理客戶端。顏值很高,推薦使用。
- 首先下載
PrettyZoo
的安裝包,下載地址:https://github.com/vran-dev/PrettyZoo/releases
- 我們需要創(chuàng)建一個連接,連接到ZooKeeper,可以發(fā)現(xiàn)
PrettyZoo
是支持通過SSH通道連接的;
- 雙擊連接,我們可以查看到ZooKeeper中存儲的數(shù)據(jù),很清楚的發(fā)現(xiàn),ZooKeeper是按目錄結(jié)構(gòu)存儲數(shù)據(jù)的;
- 右鍵目錄,我們可以創(chuàng)建和刪除znode,有了這個工具,基本上可以和命令行操作說再見了;
- 如果你還是覺得命令行比較炫酷的話,
PrettyZoo
也實現(xiàn)了命令行功能,打開命令行標(biāo)簽就可以愉快地敲命令了。
節(jié)點類型
ZooKeeper中的節(jié)點(znode)是有生命周期的,這取決于節(jié)點的類型。類型有主要有下面四種:
- 持久節(jié)點(Persistent):默認(rèn)節(jié)點類型,節(jié)點創(chuàng)建后,會一直存在。
- 持久順序節(jié)點(Persistent Sequential):具有持久節(jié)點特性,節(jié)點名稱后會增加自增數(shù)字后綴。
- 臨時節(jié)點(Ephemeral):臨時存在,當(dāng)創(chuàng)建節(jié)點的會話關(guān)閉時,節(jié)點被刪除。
- 臨時順序節(jié)點(Ephemeral Sequential):具有臨時節(jié)點特性,節(jié)點名稱后會增加自增數(shù)字后綴。
如果你用命令行創(chuàng)建節(jié)點的話,順序特性對應(yīng)-s
選項,臨時特性對應(yīng)-e
選項,比如如下命令:
# 創(chuàng)建持久順序節(jié)點
create -s /test/seq segText
# 創(chuàng)建臨時節(jié)點
create -e /test/tmp tmpText
# 創(chuàng)建臨時順序節(jié)點
create -s -e /test/seqTmp setTmpText
創(chuàng)建成功后顯示如下:
如果你用PrettyZoo
來創(chuàng)建的話,只要勾選一個選項即可。
作為注冊中心使用
CAP是分布式架構(gòu)中的重要理論,其包括一致性(Consistency)、可用性(Availability)和分區(qū)容忍性(Partition tolerance)。我們經(jīng)常使用的Eureka支持AP,而ZooKeeper支持CP。接下來我們學(xué)習(xí)下ZooKeeper在Spring Cloud中作為注冊中心的應(yīng)用。
- ZooKeeper作為注冊中心使用,用法基本和Eureka和Consul相同,首先我們需要在
pom.xml
中添加ZooKeeper的服務(wù)發(fā)現(xiàn)組件;
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
- 之后修改配置文件
application.yml
,添加ZooKeeper相關(guān)配置;
spring:
cloud:
zookeeper:
# zookeeper連接地址
connect-string: localhost:2181
discovery:
# 作為服務(wù)注冊
register: true
# 注冊時使用IP地址而不是hostname
prefer-ip-address: true
- 這里還是使用《Spring Cloud學(xué)習(xí)教程》中的例子,有兩個服務(wù)
zookeeper-ribbon-service
和zookeeper-user-service
,前者通過Ribbon遠(yuǎn)程調(diào)用后者;
- 分別啟動兩個服務(wù),我們通過
PrettyZoo
可以發(fā)現(xiàn),當(dāng)ZooKeeper作為注冊中心時,注冊服務(wù)的名稱、IP、端口都被存儲到了里面;
- 我們調(diào)用
zookeeper-ribbon-service
中的接口測試下,發(fā)現(xiàn)可以正常訪問,接口地址:http://localhost:8301/user/1
- 如果這時候我們把
zookeeper-user-service
服務(wù)關(guān)掉的話,我們可以發(fā)現(xiàn)ZooKeeper會自動刪除存儲的數(shù)據(jù);
- 由此可以看出,ZooKeeper作為微服務(wù)的注冊中心是通過臨時節(jié)點來實現(xiàn)的,當(dāng)服務(wù)上線時會向ZooKeeper中注冊,當(dāng)服務(wù)下線時會被ZooKeeper刪除,保障了微服務(wù)的高可用。
總結(jié)
今天我們學(xué)習(xí)了下ZooKeeper的安裝、可視化工具PrettyZoo的使用以及ZooKeeper在Spring Cloud中作為注冊中心的應(yīng)用。其實ZooKeeper在分布式系統(tǒng)中還有很多應(yīng)用,比如說做分布式鎖、實現(xiàn)選主功能、取代UUID來生成唯一ID,大家感興趣的話可以深入研究下!
參考資料
官方文檔:https://zookeeper./doc/current/zookeeperStarted.html
項目源碼地址
https://github.com/macrozheng/springcloud-learning
微信8.0將好友放開到了一萬,小伙伴可以加我大號了,先到先得,再滿就真沒了