从使用角度看何为zookeeper
生活随笔
收集整理的這篇文章主要介紹了
从使用角度看何为zookeeper
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Zookeeper
zookeeper作用
作用:
- 中間件,提供協(xié)調(diào)服務(wù),提供協(xié)助運(yùn)算,協(xié)助管理存儲等功能
- 作用于分布式系統(tǒng),發(fā)揮其優(yōu)勢,可以為大數(shù)據(jù)服務(wù)
- 支持java,提供java和c語言的客戶端Api
特性:
- 一致性:數(shù)據(jù)一致性,數(shù)據(jù)按照順序分批次入庫
- 原子性:事務(wù)要么成功要么失敗,不會局部化
- 單一視圖:客戶端鏈接集群中的任一節(jié)點(diǎn),數(shù)據(jù)都是一致的
- 可靠性:每次對zk的操作狀態(tài)都會保存在服務(wù)端
- 實(shí)時性:客戶端可以讀取到zk服務(wù)端的最新數(shù)據(jù)
作用體現(xiàn):
- Master節(jié)點(diǎn)選舉,主節(jié)點(diǎn)掛了之以后,從節(jié)點(diǎn)就會接手工作,并且保證這個節(jié)點(diǎn)是唯一的,這也是所謂首腦模式,從而保證集群是高可用的。
- 統(tǒng)一配置文件管理,即只需要部署一臺服務(wù)器,則可以把相同的配置文件同步更新到其他所有服務(wù)器,此操作在云計(jì)算中用的特別多
- 發(fā)布和訂閱,類似消息隊(duì)列MQ(amq, rmq…),dubbo發(fā)布者把數(shù)據(jù)存儲到znode上,訂閱者會讀取到這個數(shù)據(jù)。
- 提供分布式鎖,分布式環(huán)境中不同進(jìn)程之間爭奪資源,類似多線程之間的鎖
- 集群管理,集群中保證數(shù)據(jù)的強(qiáng)一致性
什么是分布式系統(tǒng)
- 很多臺計(jì)算機(jī)組成一個整體,一個整體一致對外并處理同一請求
- 內(nèi)部每臺計(jì)算機(jī)都可以相互通信
- 客戶端到服務(wù)端的一次請求到響應(yīng)結(jié)束會經(jīng)歷很臺計(jì)算機(jī)
發(fā)布包文件列表
# 可執(zhí)行文件 drwxr-xr-x 2 andrew andrew 4096 3月 17 2021 bin # 配置文件 drwxr-xr-x 2 andrew andrew 4096 1月 1 18:18 conf # 文檔路徑 drwxr-xr-x 5 andrew andrew 4096 3月 17 2021 docs # 依賴的jar包 drwxrwxr-x 2 andrew andrew 4096 1月 1 18:07 lib -rw-r--r-- 1 andrew andrew 11358 3月 17 2021 LICENSE.txt drwxrwxr-x 2 andrew andrew 4096 1月 1 18:20 logs -rw-r--r-- 1 andrew andrew 432 3月 17 2021 NOTICE.txt -rw-r--r-- 1 andrew andrew 2214 3月 17 2021 README.md -rw-r--r-- 1 andrew andrew 3570 3月 17 2021 README_packaging.md配置文件zoo_sample.cfg
# The number of milliseconds of each tick # 用于計(jì)算的時間單元。比如session超時 N*tickTime tickTime=2000 # The number of ticks that the initial # synchronization phase can take # 用于集群,允許從節(jié)點(diǎn)連接并同步到master節(jié)點(diǎn)的初始化時間,以tickTime的倍數(shù)來表示 initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement # 用于集群,master主節(jié)點(diǎn)與從節(jié)點(diǎn)之間發(fā)送消息,請求和應(yīng)答時間的長度。 syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. # 默認(rèn)數(shù)據(jù)保存位置,最后從新定義 dataDir=/tmp/zookeeper # 如果不定義默認(rèn)的位置和dataDir的位置是一致的 dataLogDir=/tmp/zookeeper # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1## Metrics Providers # # https://prometheus.io Metrics Exporter #metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider #metricsProvider.httpPort=7000 #metricsProvider.exportJvmInfo=true啟動和停止zk服務(wù)
# 配置文件 # 將conf中zoo_sample.cfg 修改為zoo.cfg,并修改配置文件 # 啟動zk ./zkServer.sh start # 停止zk ./zkServer.sh stop啟動和停止zk客戶端
# 通過/zkCli.sh 啟動zk客戶端zookeeper基本數(shù)據(jù)模型
- 是一個樹形結(jié)構(gòu),類似于前端開發(fā)的tree.js組件
- 可以理解為Linux的目錄結(jié)構(gòu)
- 每一個節(jié)點(diǎn)都稱之為znode,他可以有子節(jié)點(diǎn),也可以有數(shù)據(jù)
- 每個節(jié)點(diǎn)分為臨時節(jié)點(diǎn)和永久節(jié)點(diǎn),臨時節(jié)點(diǎn)在客戶端斷開連接之后消失
- 每個zk節(jié)點(diǎn)都有各自的版本號,可以通過命令行來顯示節(jié)點(diǎn)信息
- 每當(dāng)節(jié)點(diǎn)數(shù)據(jù)發(fā)生變化,那么該節(jié)點(diǎn)的版本號會累加(樂觀鎖)
- 刪除/修改過時節(jié)點(diǎn),版本號不匹配則會報錯
- 每個zk節(jié)點(diǎn)存儲的數(shù)據(jù)不宜過大,幾k即可
- 節(jié)點(diǎn)可以設(shè)置權(quán)限acl,可以通過權(quán)限來限制用戶的訪問
zk特性原理
Session 基本原理
- 客戶端與服務(wù)端之間的連接存在會話
- 每個會話都可以設(shè)置一個超時時間
- 心跳結(jié)束,session則過期
- session過期,則臨時節(jié)點(diǎn)失效
Watcher機(jī)制
- 針對每個節(jié)點(diǎn)操作,都會有一個監(jiān)督者->watcher
- 當(dāng)監(jiān)控的某個對象(znode)發(fā)生了變化,則觸發(fā)watcher事件
- Zk 的watcher是一次性的,觸發(fā)后立即銷毀
- 父節(jié)點(diǎn)、子節(jié)點(diǎn)增刪改查都能夠觸發(fā)其watcher事件
- 針對不同類型的操作,觸發(fā)的watcher事件也不同
ACL的構(gòu)成
- 當(dāng)設(shè)置為IP指定的IP地址,此時限制IP進(jìn)行訪問,比如IP:192.168.1.1:[permissions]
- super:代表超級管理員,擁有所有的權(quán)限
zk客戶端命令
客戶端連接
# 默認(rèn)本地鏈接127.0.0.1 ./zkCli.sh查看znode節(jié)點(diǎn)
# ls + path 查看對應(yīng)目錄下內(nèi)容 [zk: localhost:2181(CONNECTED) 4] ls / [zookeeper] # get, stat命令 # ls2 ==> ls + stat [zk: localhost:2181(CONNECTED) 8] ls -s / [zookeeper] cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x0 cversion = -1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1 # stat命令查看對應(yīng)路徑狀態(tài)信息 [zk: localhost:2181(CONNECTED) 9] stat / cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x0 cversion = -1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1 # get湖獲取節(jié)點(diǎn)內(nèi)容信息關(guān)閉客戶端連接
直接Ctrl+C進(jìn)行退出即可
設(shè)置set命令
可以通過在數(shù)據(jù)后面跟上版本號來實(shí)現(xiàn)樂觀鎖控制,只有版本號給對的人才能設(shè)置成功
# 設(shè)置更改一個節(jié)點(diǎn) [zk: localhost:2181(CONNECTED) 6] set /data/name # 使用樂觀鎖的方式設(shè)置一個節(jié)點(diǎn)的值 [zk: localhost:2181(CONNECTED) 22] get -s /data/name 123 cZxid = 0x7 ctime = Mon Jan 03 23:25:59 CST 2022 mZxid = 0x1a mtime = Wed Jan 05 21:48:36 CST 2022 pZxid = 0x7 cversion = 0 dataVersion = 15 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 0 # 指定版本必須和當(dāng)前的版本保持一致,若是不一致會報錯 [zk: localhost:2181(CONNECTED) 23] set /data/name 123 -v 15 # 上步執(zhí)行之后,這里的version會變成16再按照15進(jìn)行設(shè)置肯定會設(shè)置失敗 [zk: localhost:2181(CONNECTED) 24] set /data/name 123 -v 15 version No is not valid : /data/name刪除節(jié)點(diǎn)delete命令
[zk: localhost:2181(CONNECTED) 25] delete /data/name [zk: localhost:2181(CONNECTED) 26] get /date/name org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /date/name總結(jié)
以上是生活随笔為你收集整理的从使用角度看何为zookeeper的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【2016年第1期】CCF大专委2016
- 下一篇: 【计算机组成原理】双端口RAM和多模块存