日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 架構(gòu)師社區(qū)
[導(dǎo)讀]前言 話不多說進入正題 1. 并發(fā)環(huán)境下面臨的挑戰(zhàn) 2. Zookeeper的介紹 3.zookeeper的理論 finally 前言 前面幾篇以spring作為主題也是有些時日了,高并發(fā)分布式這個主題也挺大能說挺多東西的,也是再開了個坑,然后分P來慢慢跟進吧。 我和大部分人一樣是一名學(xué)



  • 前言

  • 話不多說進入正題

    • 1. 并發(fā)環(huán)境下面臨的挑戰(zhàn)

    • 2. Zookeeper的介紹

    • 3.zookeeper的理論

  • finally


前言

前面幾篇以spring作為主題也是有些時日了,高并發(fā)分布式這個主題也挺大能說挺多東西的,也是再開了個坑,然后分P來慢慢跟進吧。


我和大部分人一樣是一名學(xué)習(xí)者,不是布道者,更多的是自己的學(xué)習(xí)總結(jié)而不具有權(quán)威,進行總結(jié),盡量讓人看的簡單是我的本意,然后有錯則改,無則加勉是最好的,在此也希望大家共同進步。


高并發(fā)分布式開發(fā)技術(shù)體系已然非常的龐大,從國內(nèi)互聯(lián)網(wǎng)企業(yè)使用情況,可發(fā)現(xiàn)RPC、Dubbo、ZK是最基礎(chǔ)的技能要求。


關(guān)于Zookeeper你是不是還停留在Dubbo注冊中心的印象中呢?還有它的工作原理呢?經(jīng)典應(yīng)用場景呢?


對前面三個問題,如若回答時沒有自己的思路或者說并未了解,那么我覺得我可以幫助到你去入門,并深化這些知識,讓你在面試中更好地去回答。


話不多說進入正題

1. 并發(fā)環(huán)境下面臨的挑戰(zhàn)

回憶我們學(xué)多線程的時候,網(wǎng)上有個圖也是十分的有意思

不懂 Zookeeper?沒關(guān)系,看這篇就夠了!

其實我們把線程換成進程,相當于每臺服務(wù)上跑了一個程序,相同的應(yīng)用程序運行于多個服務(wù)器集群上,是為了解決單臺服務(wù)面對高并發(fā)處理不來的情況。而嘗試去處理這些情況,我們就會面臨很多諸如此類的問題


比如說我們現(xiàn)在是3臺服務(wù)器的一個集群, 怎么保證所有機器共享的配置信息保持一致?


有一臺機器掛掉了,其他機器如何感知到這一變化并接管任務(wù)?


用戶量突然的爆增,需要增加機器來緩解壓力,如何做到不重啟集群而完成機器的添加?


分布式系統(tǒng),怎么高效協(xié)同多臺服務(wù)對同一網(wǎng)絡(luò)文件進行寫操作(網(wǎng)絡(luò)并不是即時的,它并不可靠,存在延時)?


此時我們就需要一個類似于線程協(xié)同機制的能讓進程進行協(xié)同的工具

2. Zookeeper的介紹

① Zookeeper的名字由來

在apache上的許多開源項目都是以動物形象作為icon,比如tomcat就是一只貓,hive是只黃蜂等,zookeeper的工作就是把這些動物的行動進行協(xié)調(diào)

② Zookeeper的簡介

zookeeper就是一種用于分布式應(yīng)用程序的高性能協(xié)調(diào)服務(wù),它的特點就是數(shù)據(jù)是存于內(nèi)存中的,持久化實現(xiàn)在日志中。


它的內(nèi)存類似于樹形結(jié)構(gòu),且高吞吐低延遲,可以幫助我們實現(xiàn)分布式統(tǒng)一配置中心,服務(wù)注冊,分布式鎖等 組成ZooKeeper服務(wù)的服務(wù)器必須彼此了解。它們維護內(nèi)存中的狀態(tài)圖像,以及持久性存儲中的事務(wù)日志和快照。只要大多數(shù)服務(wù)器可用,ZooKeeper服務(wù)就可用。


客戶端連接到單個ZooKeeper服務(wù)器??蛻舳司S護TCP連接,通過該連接發(fā)送請求,獲取響應(yīng),獲取監(jiān)視事件以及發(fā)送tick。如果與服務(wù)器的TCP連接中斷,則客戶端將連接到其他服務(wù)器。

③ Zookeeper的安裝(linux下)

1.JDK版本需要在1.6以上
2.下載:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.2/zookeeper-3.5.2.tar.gz
3.解壓后的conf目錄,增加配置文件zoo.cfg
4.啟動服務(wù)端 bin/zkServer.sh start
5.測試,客戶端連接:bin/zkCli.sh -server 127.0.0.1:2181
zoo.cfg的關(guān)鍵配置有3個:
tickTime=2000:一次心跳的基本時間,
dataDir:數(shù)據(jù)與日志的存放處
clientPort:端口號

④ Zookeeper的特點

1.數(shù)據(jù)結(jié)構(gòu)簡單

類似于Unix文件系統(tǒng)樹形結(jié)構(gòu),每個目錄成為Znode節(jié)點,但它不同于文件系統(tǒng),它既可以視為文件夾,也可以視為文件來存放數(shù)據(jù),但是我們平時還是得叫它節(jié)點,別叫文件夾這么掉價。


需要注意:同一個節(jié)點下的子節(jié)點名稱不能相同,且命名是有規(guī)范的,它的路徑是沒有相對路徑的概念的,都是絕對路徑,任何開始都以"/"開始,最后就是,它存放數(shù)據(jù)的大小是有限制的


2.數(shù)據(jù)模型特點

層次命名空間:就是上面已經(jīng)提到的,類似于unix的文件系統(tǒng),以"/"為根,節(jié)點可以包含關(guān)聯(lián)數(shù)據(jù)和子節(jié)點,絕對路徑 Znode:名稱唯一,命名有規(guī)范,類型分4種:持久,順序,臨時,臨時順序,節(jié)點的數(shù)據(jù)構(gòu)成之后再提


3.命名規(guī)范

節(jié)點名稱除下列限制外,可以使用任何unicode字符:

1. null字符(\u0000)不能作為路徑名的一部分;

2. 以下字符不能使用,因為它們不能很好地顯示,或者以令人困惑的方式呈現(xiàn):\u0001 - \u0019和\u007F - \u009F。

3. 不允許使用以下字符:\ud800 - uf8fff, \uFFF0 - uFFFF。

4. “.”字符可以用作另一個名稱的一部分,但是“.”和“..”不能單獨用于指示路徑上的節(jié)點,因為ZooKeeper不使用相對路徑。

下列內(nèi)容無效:“/a/b/. / c”或“c / a / b / . . /”。

5. “zookeeper”是保留節(jié)點名。

4.一些命令

因為我的電腦是window系統(tǒng)的,所以我找了一個window版本的zookeeper來進行演示


先大致解釋一下各個目錄的內(nèi)容

bin ---> 包括了linux和window的運行程序的運行目錄
conf ---> zookeeper的配置zoo.cfg
contrib ---> 其他一些組件和發(fā)行版本
dist-maven ---> maven發(fā)布下的一些jar包
docs ---> 文檔
lib ---> 庫
recipe ---> 一些應(yīng)用實例
src ---> zookeeper的源碼,因為zookeeper是java寫出來的

啟動bin目錄下的zkServer.cmd,再啟動zkClient.cmd即可,在我根本不知道該如何進行學(xué)習(xí)的時候,一般來說輸入help,-help,-h這些指令就可以獲取到幫助,下圖我就是在客戶端輸入了-help指令

不懂 Zookeeper?沒關(guān)系,看這篇就夠了!

因為命令都相對簡單所以也不進行演示了,唯一需要注意的是要注意路徑"/"的問題


比如 ls / 就是根目錄,create /zk 123,還有各個命令的依托條件,比如create必須要提供父節(jié)點,delete節(jié)點時次節(jié)點不能有子節(jié)點等···


5.Zookeeper的重要特點---有序

提供多種方式跟蹤時間,ZooKeeper給每個更新貼上一個數(shù)字,這個數(shù)字反映了所有ZooKeeper事務(wù)的順序,嚴格的順序意味著可以在客戶機上實現(xiàn)復(fù)雜的同步原語 解釋czxid、version、zoo.cfg中ticks配置


  • Zxid :Zookeeper中每次寫請求都對應(yīng)一個唯一的事務(wù)id,稱為 Zxid,它是全局的且有序的,如果 Zxid1 小于 Zxid2,那 Zxid1 就一定是發(fā)生在 Zxid2 前


  • version numbers :版本號,對節(jié)點的寫請求都會導(dǎo)致該節(jié)點的3種版本號增加(其實套路和樂觀鎖差不多),dataVersion(對znode數(shù)據(jù)的更改次數(shù)),cversion(對znode子節(jié)點的更改次數(shù)),aclVersion(對znode ACL的更改次數(shù)


  • ticks :當使用多服務(wù)器Zookeeper時,服務(wù)器使用一個“滴答”來定義事件的時間,如狀態(tài)上傳,會話超時等,它通過最小會話超時(默認是滴答時間x2)間接公開,如果客戶端請求超過這個時間,那客戶端就不再能連接上服務(wù)器端


  • real time:Zookeeper并不使用真實時間


你可以使用stat path或者ls2來查看這些信息

不懂 Zookeeper?沒關(guān)系,看這篇就夠了!
cZxid:創(chuàng)建該節(jié)點的zxid
ctime:該節(jié)點的創(chuàng)建時間
mZxid:該節(jié)點的最后修改zxid
mtime:該節(jié)點的最后修改時間
pZxid:該節(jié)點的最后子節(jié)點修改zxid
cversion:該節(jié)點的子節(jié)點變更次數(shù)
dataVersion:該節(jié)點數(shù)據(jù)被修改的次數(shù)
aclVersion:該節(jié)點的ACL變更次數(shù)
aphemeraOwner:臨時節(jié)點所有者會話id,非臨時的為0
dataLength:該節(jié)點數(shù)據(jù)長度
numChildren:子節(jié)點數(shù)

這些數(shù)據(jù)都在從側(cè)面告訴我們,zookeeper是一個協(xié)調(diào)者


6.zookeeper的第二個特點---可復(fù)制

數(shù)據(jù)可復(fù)制,可備份。zookeeper可以快速地搭建一個集群,內(nèi)部自帶了這樣的一些工具與機制,我們只需要設(shè)置一些配置即可,保證服務(wù)可靠,不會成為單點故障

不懂 Zookeeper?沒關(guān)系,看這篇就夠了!


7.zookeeper的第三個特點---迅速

zookeeper的一些特點可以應(yīng)用于大型分布式系統(tǒng)


不懂 Zookeeper?沒關(guān)系,看這篇就夠了!


3.zookeeper的理論

① zookeeper的會話機制

不懂 Zookeeper?沒關(guān)系,看這篇就夠了!

Session會話

1.一個客戶端連接一個會話,由zookeeper分配唯一會話id
2.客戶端以特定的時間間隔發(fā)送心跳以保持會話有效,
3.超過會話超時時間未收到客戶端的心跳,則判斷客戶端無效(默認2倍tickTime)
4.會話中額請求是FIFO(先進先出原則)的順序執(zhí)行

② znode的數(shù)據(jù)構(gòu)成

節(jié)點數(shù)據(jù):存儲的基本信息(狀態(tài),配置,位置等)
節(jié)點元數(shù)據(jù):stat命令下的一些數(shù)據(jù)
數(shù)據(jù)大?。合拗?span style="line-height: 1.6 !important;">1M

③ znode的節(jié)點類型

1.持久節(jié)點:直接通過create path value所創(chuàng)建
2.臨時節(jié)點:create -e path value
3.順序節(jié)點:create -s path value

注意
1.session會話失效時,臨時節(jié)點就會被刪除
2.順序節(jié)點的創(chuàng)建,后為10位十進制序號,每個父節(jié)點擁有一個計數(shù)器,這個計數(shù)器也是有限制的,到2147483647之后將溢出
3.順序節(jié)點在會話結(jié)束仍然存在

④ Watch監(jiān)聽機制

客戶端能在znodes上設(shè)置watch,監(jiān)聽znode的變化,包括增刪改查,通過stat path ,ls2 path get path皆可查看


觸發(fā)watch事件的條件有4種,create,delete,change,child(子節(jié)點事件)


watch的重要特性

1.僅一次性:watch觸發(fā)后會立即刪除,要持續(xù)監(jiān)聽變化的話就要持續(xù)提供設(shè)置watch,這也是watch的注意事項

2.有序性:客戶端先得到watch通知才可查看變化結(jié)果

watch的注意事項

1.剛剛提及到的它的僅一次性

2.獲取事件和發(fā)送watch,獲取watch,這些請求有可能存在延時,所以不能絕對可靠得到每個節(jié)點發(fā)生的每個更改

3.一個watch對象只會被通知一次,如果一個watch同時注冊了多個接口(exists,getData),如果此時刪除節(jié)點,雖然這個事件對exists和getData都有效,但是watch只會被調(diào)用一次

阻塞線程喚醒機制—客戶端可以被動接受其他客戶端進程狀態(tài)通知

⑤ zookeeper的特性

 1.順序一致性(Sequential Consistency),保證客戶端操作是按順序生效的;

2.原子性(Atomicity),更新成功或失敗。沒有部分結(jié)果。

3.單個系統(tǒng)映像,無論連接到哪個服務(wù)器,客戶端都將看到相同的內(nèi)容

4.可靠性,數(shù)據(jù)的變更不會丟失,除非被客戶端覆蓋修改。

5.及時性,保證系統(tǒng)的客戶端當時讀取到的數(shù)據(jù)是最新的。

finally

通過上面的闡述應(yīng)該我們對于zookeeper有了一個初步的認識,之后會陸續(xù)說說分布式鎖,集群還有一些場景的應(yīng)用

End

作者:說出你的愿望吧~,本文版權(quán)歸作者所有

juejin.im/post/5d0bd358e51d45105e0212db

特別推薦一個分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:

不懂 Zookeeper?沒關(guān)系,看這篇就夠了!

不懂 Zookeeper?沒關(guān)系,看這篇就夠了!

不懂 Zookeeper?沒關(guān)系,看這篇就夠了!

長按訂閱更多精彩▼

不懂 Zookeeper?沒關(guān)系,看這篇就夠了!

如有收獲,點個在看,誠摯感謝

免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉