zookeeper 默认端口_ZooKeeper知识点汇总
一、ZooKeeper簡介
1. ZooKeeper是什么
? Apache ZooKeeper是一個(gè)開源的分布式服務(wù)框架,為分布式應(yīng)用提供協(xié)調(diào)服務(wù),用來解決分布式應(yīng)用中的數(shù)據(jù)管理問題,如:配置管理、域名服務(wù)、分布式同步、集群管理等
官網(wǎng) https://zookeeper.apache.org/
ZooKeeper視頻教程 http://edu.51cto.com/course/16190.html
2. ZooKeeper組成
? 主要包括兩部分:文件系統(tǒng)、通知機(jī)制
2.1 文件系統(tǒng)
? ZooKeeper維護(hù)一個(gè)類似Linux文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)數(shù)據(jù)
- 數(shù)據(jù)模型結(jié)構(gòu)是一種樹形結(jié)構(gòu),由許多節(jié)點(diǎn)構(gòu)成
- 每個(gè)節(jié)點(diǎn)叫做ZNode(ZooKeeper Node)
- 每個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)唯一路徑,通過該路徑來標(biāo)識(shí)節(jié)點(diǎn),如 /app1/p_2
- 每個(gè)節(jié)點(diǎn)只能存儲(chǔ)大約1M的數(shù)據(jù)
? 節(jié)點(diǎn)類型有四種:
- 持久化目錄節(jié)點(diǎn) persistent
- 客戶端與服務(wù)器斷開連接,該節(jié)點(diǎn)仍然存在
- 持久化順序編號(hào)目錄節(jié)點(diǎn) persistent_sequential
- 客戶端與服務(wù)器斷開連接,該節(jié)點(diǎn)仍然存在,此時(shí)節(jié)點(diǎn)會(huì)被順序編號(hào),如:000001、000002.....
- 臨時(shí)目錄節(jié)點(diǎn) ephemeral
- 客戶端與服務(wù)器斷開連接,該節(jié)點(diǎn)會(huì)被刪除
- 臨時(shí)順序編號(hào)目錄節(jié)點(diǎn) ephemeral_sequential
- 客戶端與服務(wù)器斷開連接,該節(jié)點(diǎn)會(huì)被刪除,此時(shí)節(jié)點(diǎn)會(huì)被順序編號(hào),如:000001、000002.....
2.2 通知機(jī)制
? ZooKeeper是一個(gè)基于觀察者模式設(shè)計(jì)的分布式服務(wù)管理框架
? 簡單來說,客戶端注冊監(jiān)聽它關(guān)心的目錄節(jié)點(diǎn),當(dāng)目錄節(jié)點(diǎn)發(fā)生變化時(shí),ZooKeeper會(huì)通知客戶端
? ZooKeeper是一個(gè)訂閱中心(注冊中心)
3. 應(yīng)用場景
3.1 配置管理
? 場景:集群環(huán)境、服務(wù)器的許多配置都是相同的,如:數(shù)據(jù)庫連接信息,當(dāng)需要修改這些配置時(shí)必須同時(shí)修改每臺(tái)服務(wù)器,很麻煩
? 解決:把這些配置全部放到ZooKeeper上,保存在ZooKeeper的某個(gè)目錄節(jié)點(diǎn)中,然后所有的應(yīng)用程序(客戶端)對(duì)這個(gè)目錄節(jié)點(diǎn)進(jìn)行監(jiān)視Watch,一旦配置信息發(fā)生變化,ZooKeeper會(huì)通知每個(gè)客戶端,然后從ZooKeeper獲取新的配置信息,并應(yīng)用到系統(tǒng)中。
3.2 集群管理
? 場景:集群環(huán)境下,如何知道有多少臺(tái)機(jī)器在工作?是否有機(jī)器退出或加入?需要選舉一個(gè)總管master,讓總管來管理集群
? 解決:在父目錄GroupMembers下為所有機(jī)器創(chuàng)建臨時(shí)目錄節(jié)點(diǎn),然后監(jiān)聽父目錄節(jié)點(diǎn)的子節(jié)點(diǎn)變化,一旦有機(jī)器掛掉,該機(jī)器與ZooKeeper的連接斷開,其所創(chuàng)建的臨時(shí)目錄節(jié)點(diǎn)被刪除,所有其他機(jī)器都會(huì)收到通知。當(dāng)有新機(jī)器加入時(shí)也是同樣的道理。
? 選舉master:為所有機(jī)器創(chuàng)建臨時(shí)順序編號(hào)目錄節(jié)點(diǎn),給每臺(tái)機(jī)器編號(hào),然后每次選取編號(hào)最小的機(jī)器作為master
3.3 負(fù)載均衡
? ZooKeeper本身是不提供負(fù)載均衡策略的,需要自己實(shí)現(xiàn),所以準(zhǔn)確的說,是在負(fù)載均衡中使用ZooKeeper來做集群的協(xié)調(diào)(也稱為軟負(fù)載均衡)
? 實(shí)現(xiàn)思路:
? 實(shí)際上利用了ZooKeeper的特性,將ZooKeeper用為服務(wù)的注冊和變更通知中心
二、ZooKeeper安裝
1. 安裝
? ZooKeeper一般都運(yùn)行在Linux平臺(tái)
? 步驟:
2. 配置文件
配置項(xiàng)含義說明tickTime=2000心跳時(shí)間維持心跳的時(shí)間間隔,單位是毫秒
在zookeeper中所有的時(shí)間都是以這個(gè)時(shí)間為基礎(chǔ)單元,進(jìn)行整數(shù)倍配置initLimit=10初始通信時(shí)限用于zookeeper集群,此時(shí)有多臺(tái)zookeeper服務(wù)器,其中一個(gè)為Leader,其他都為FollowersyncLimit=5同步通信時(shí)限在運(yùn)行時(shí)Leader通過心跳檢測與Follower進(jìn)行通信,如果超過syncLimit*tickTime時(shí)間還未收到響應(yīng),則認(rèn)為該Follower已經(jīng)宕機(jī)dataDir=../data存儲(chǔ)數(shù)據(jù)的目錄數(shù)據(jù)文件也稱為snapshot快照文件clientPort=2181端口號(hào)默認(rèn)為2181maxClientCnxns=60單個(gè)客戶端的最大連接數(shù)限制默認(rèn)為60,可以設(shè)置為0,表示沒有限制autopurge.snapRetainCount=3保留文件的數(shù)量默認(rèn)3個(gè)autopurge.purgeInterval=1自動(dòng)清理快照文件和事務(wù)日志的頻率默認(rèn)為0,表示不開啟自動(dòng)清理,單位是小時(shí)dataLogDir=存儲(chǔ)日志的目錄未指定時(shí)日志文件也存放在dataDir中,為了性能最大化,一般建議把dataDir和dataLogDir分別放到不同的磁盤上
三、客戶端操作
1. 常用命令
命令作用說明help查看幫助查看所有操作命令ls 節(jié)點(diǎn)路徑查看指定節(jié)點(diǎn)下的內(nèi)容 ls2 節(jié)點(diǎn)路徑查看指定節(jié)點(diǎn)的詳細(xì)信息查看所有子節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn)的狀態(tài)create 節(jié)點(diǎn)路徑 內(nèi)容創(chuàng)建普通節(jié)點(diǎn)如果內(nèi)容中有空格,則需要使用對(duì)雙引號(hào)引起來get 節(jié)點(diǎn)路徑獲取節(jié)點(diǎn)中的值 create -e 節(jié)點(diǎn)路徑 內(nèi)容創(chuàng)建臨時(shí)節(jié)點(diǎn)當(dāng)連接斷開后,節(jié)點(diǎn)會(huì)被自動(dòng)刪除create -s 節(jié)點(diǎn)路徑 內(nèi)容創(chuàng)建順序編號(hào)節(jié)點(diǎn)即帶序號(hào)的節(jié)點(diǎn)delete 節(jié)點(diǎn)路徑刪除節(jié)點(diǎn)只能刪除空節(jié)點(diǎn),即不能有子節(jié)點(diǎn)rmr 節(jié)點(diǎn)路徑遞歸刪除節(jié)點(diǎn)remove recursionstat 節(jié)點(diǎn)路徑查看節(jié)點(diǎn)狀態(tài) set 節(jié)點(diǎn)路徑 新值修改節(jié)點(diǎn)內(nèi)容
2. 詳解
? 查看指定節(jié)點(diǎn)的詳細(xì)信息: ls2 /
# 子節(jié)點(diǎn)名稱數(shù)組[zookeeper] # -----------節(jié)點(diǎn)的狀態(tài)信息,也稱為stat結(jié)構(gòu)體-------------------# 創(chuàng)建該znode的事務(wù)的zxid(ZooKeeper Transaction ID)# 事務(wù)ID是ZooKeeper為每次更新操作/事務(wù)操作分配一個(gè)全局唯一的id,表示zxid,值越小,表示越先執(zhí)行cZxid = 0x0 # 0x0表示十六進(jìn)制數(shù)0# 創(chuàng)建時(shí)間ctime = Thu Jan 01 08:00:00 CST 1970# 最后一次更新的zxidmZxid = 0x0# 最后一次更新的時(shí)間mtime = Thu Jan 01 08:00:00 CST 1970# 最后更新的子節(jié)點(diǎn)的zxidpZxid = 0x0# 子節(jié)點(diǎn)的變化號(hào),表示子節(jié)點(diǎn)被修改的次數(shù),-1表示從未被修改過cversion = -1# 當(dāng)前節(jié)點(diǎn)的變化號(hào),0表示從未被修改過dataVersion = 0# 訪問控制列表的變化號(hào) access control listaclVersion = 0# 如果臨時(shí)節(jié)點(diǎn),表示當(dāng)前節(jié)點(diǎn)的擁有者的sessionId# 如果不是臨時(shí)節(jié)點(diǎn),則值為0ephemeralOwner = 0x0# 數(shù)據(jù)長度dataLength = 0# 子節(jié)點(diǎn)數(shù)據(jù)numChildren = 1? 順序編號(hào)節(jié)點(diǎn):
- 順序編號(hào)會(huì)緊跟在節(jié)點(diǎn)名稱后面,節(jié)點(diǎn)最終名稱為:節(jié)點(diǎn)名+序號(hào),如/test0000000005
- 順序編號(hào)是一個(gè)遞增的計(jì)數(shù)器
- 順序編號(hào)是由父節(jié)點(diǎn)維護(hù),從已有的子節(jié)點(diǎn)個(gè)數(shù)開始(包括臨時(shí)節(jié)點(diǎn)和被刪除的節(jié)點(diǎn))
- 如果子節(jié)點(diǎn)為空,則從0000000000開始,依次遞增1
- 在分布式系統(tǒng)中,順序編號(hào)可以被用于為所有的事件進(jìn)行全局排序,這樣客戶端就可以根據(jù)序號(hào)推斷事件的順序
四、ZooKeeper集群
1. 配置集群
? 步驟:
- A表示這臺(tái)服務(wù)器的編號(hào)ID,是一個(gè)數(shù)字
- B表示服務(wù)器的IP地址或域名
- C表示這臺(tái)服務(wù)器與集群中的Leader交換信息時(shí)使用的端口
- D表示執(zhí)行選舉Leader服務(wù)器時(shí)互相通信的端口
2. 集群特性
- 一個(gè)ZooKeeper集群中,有一個(gè)領(lǐng)導(dǎo)者Leader和多個(gè)跟隨者Follower
- Leader負(fù)責(zé)進(jìn)行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài)
- Follower用于接收客戶端的請(qǐng)求并向客戶端返回結(jié)果,在選舉Leader過程中參與投票
- 半數(shù)機(jī)制:集群中只要有半數(shù)以上節(jié)點(diǎn)存活,集群就能夠正常工作,所以一般集群中的服務(wù)器個(gè)數(shù)都為奇數(shù)
- 全局?jǐn)?shù)據(jù)一致:集群中每臺(tái)服務(wù)器保存一份相同的數(shù)據(jù)副本,不論客戶端連接到哪個(gè)服務(wù)器,數(shù)據(jù)都是一致的
- 更新請(qǐng)求順序執(zhí)行:來自同一個(gè)客戶端的更新請(qǐng)求,按其發(fā)送順序依次執(zhí)行
- 數(shù)據(jù)更新的原子性:一次數(shù)據(jù)更新,要么成功,要么失敗
- 實(shí)時(shí)性:在一定的時(shí)間范圍內(nèi),客戶端能讀取到最新數(shù)據(jù)
3. 選舉機(jī)制
? ZooKeeper在提供服務(wù)時(shí)會(huì)自動(dòng)選舉一個(gè)節(jié)點(diǎn)服務(wù)器作為Leader,其他都是Follower
? 選舉流程:
? 總結(jié):
- 每個(gè)服務(wù)器在啟動(dòng)時(shí)都會(huì)選擇自己,然后將投票信息發(fā)送出去
- 服務(wù)器編號(hào)ID越大,在選擇算法中的權(quán)重越大
- 投票數(shù)必須過半,才能選出Leader
- 誰是Leader:啟動(dòng)順序的前集群數(shù)/2+1個(gè)服務(wù)器中,id值最大的會(huì)成為Leader
4. 監(jiān)聽機(jī)制
4.1 監(jiān)聽節(jié)點(diǎn)值的變化
# 在集群的A服務(wù)器,監(jiān)聽某個(gè)節(jié)點(diǎn)值的變化get /yyy watch # 在集群的B服務(wù)器,修改對(duì)應(yīng)節(jié)點(diǎn)的值set /yyy myyyy # 此時(shí)A服務(wù)器會(huì)收到事件NodeDataChangedWATCHER::WatchedEvent state:SyncConnected type:NodeDataChanged path:/yyy監(jiān)聽Watch事件是一個(gè)一次性的觸發(fā)器,當(dāng)數(shù)據(jù)改變時(shí)只會(huì)觸發(fā)一次,如果以后這個(gè)數(shù)據(jù)再發(fā)生改變,則不會(huì)再次觸發(fā)
4.2 監(jiān)聽節(jié)點(diǎn)的子節(jié)點(diǎn)變化
# 在集群的A服務(wù)器,監(jiān)聽某個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)的變化 ls /yyy watch # 在集群的B服務(wù)器,創(chuàng)建/修改/刪除對(duì)應(yīng)節(jié)點(diǎn)的子節(jié)點(diǎn)create /yyy/hello hello # 此時(shí)A服務(wù)器會(huì)收到事件NodeChildrenChangedWATCHER::WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/yyy五、Java訪問ZooKeeper
Java操作Zookeeper很簡單,只需要添加ZooKeeper客戶端的依賴即可,可以進(jìn)行節(jié)點(diǎn)信息的獲取、管理等。
? 步驟:
總結(jié)
以上是生活随笔為你收集整理的zookeeper 默认端口_ZooKeeper知识点汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: signature=800c2934bb
- 下一篇: rrt算法流程图_RRT算法移动机器人路