




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第8章ZooKeeper技術ApacheZooKeeper了解分布式協(xié)調技術概念理解ZooKeeper的主要概念和特征熟悉ZooKeeper的數據模型掌握常用的Shell操作命令掌握搭建ZooKeeper環(huán)境學習目標28/21/2024參考書分布式協(xié)調技術
分布式協(xié)調技術主要用來解決分布式環(huán)境中多個進程之間的同步控制,讓它們有序地去訪問某種臨界資源,防止產生“臟數據”。單機環(huán)境下可以利用簡單的讀寫鎖機制來實現(xiàn),問題放到分布式環(huán)境下就需要分布式鎖,這個分布式鎖也就是分布式協(xié)調技術實現(xiàn)的核心內容。在分布式計算上,不同的計算機透過信息交換,嘗試達成共識;但有時候,系統(tǒng)上協(xié)調計算機或成員計算機可能因系統(tǒng)錯誤并交換錯的信息,導致影響最終的系統(tǒng)一致性。])。如在單機環(huán)境中,進程對一個資源的獲取要么成功,要么失敗。但在分布式環(huán)境中,對一個資源的訪問或者一個服務的調用,即使返回失敗消息,但有可能實際上訪問成功或者調用成功了,也有可能是時間上不同的兩個節(jié)點對另外一個節(jié)點順序調用服務,那么調用請求一定是按照順序到達的嗎?這些都涉及網絡問題,所以分布式協(xié)調遠比在同一臺機器上對多個進程的調度要難得多,于是一種通用性好、伸縮性好、高可靠、高可用的協(xié)調機制應運而生——ZooKeeper。48/21/2024概述Zookeeper是Google的Chubby一個開源的實現(xiàn),是Hadoop的分布式協(xié)調服務它包含一個簡單的原語集,分布式應用程序可以基于它實現(xiàn)同步服務,配置維護和命名服務等58/21/2024什么是Zookeeper?8/21/20246為什么使用Zookeeper?78/21/2024大部分分布式應用需要一個主控、協(xié)調器或控制器來管理物理分布的子進程(如資源、任務分配等)目前,大部分應用需要開發(fā)私有的協(xié)調程序,缺乏一個通用的機制協(xié)調程序的反復編寫浪費,且難以形成通用、伸縮性好的協(xié)調器ZooKeeper:提供通用的分布式鎖服務,用以協(xié)調分布式應用Zookeeper能幫我們做什么?Hadoop,使用Zookeeper的事件處理確保整個集群只有一個NameNode,存儲配置信息等.HBase,使用Zookeeper的事件處理確保整個集群只有一個HMaster,察覺HRegionServer聯(lián)機和宕機,存儲訪問控制列表等.88/21/2024Zookeeper的特性Zookeeper是簡單的Zookeeper是富有表現(xiàn)力的Zookeeper具有高可用性Zookeeper采用松耦合交互方式Zookeeper是一個資源庫8/21/20249Zookeeper的安裝和配置(單機模式)下載ZooKeeper:/apache-mirror/zookeeper/zookeeper-3.4.3/zookeeper-3.4.3.tar.gz解壓:tarxzfzookeeper-3.4.3.tar.gz在conf目錄下創(chuàng)建一個配置文件zoo.cfg,tickTime=2000
dataDir=/Users/zdandljb/zookeeper/data
dataLogDir=/Users/zdandljb/zookeeper/dataLog
clientPort=2181啟動ZooKeeper的Server:shbin/zkServer.shstart,如果想要關閉,輸入:zkServer.shstop8/21/202410Zookeeper的安裝和配置118/21/2024創(chuàng)建myid文件,server1機器的內容為:1,server2機器的內容為:2,server3機器的內容為:3在conf目錄下創(chuàng)建一個配置文件zoo.cfg,tickTime=2000
dataDir=/Users/zdandljb/zookeeper/data
dataLogDir=/Users/zdandljb/zookeeper/dataLogclientPort=2181 initLimit=5 syncLimit=2 server.1=server1:2888:3888 server.2=server2:2888:3888server.3=server3:2888:3888Zookeeper的安裝和配置128/21/2024建了3個文件夾,server1server2server3,然后每個文件夾里面解壓一個zookeeper的下載包進入data目錄,創(chuàng)建一個myid的文件,里面寫入一個數字,server1,就寫一個1,server2對應myid文件就寫入2,server3對應myid文件就寫個3Zookeeper的安裝和配置138/21/2024在conf目錄下創(chuàng)建一個配置文件zoo.cfg,tickTime=2000
dataDir=/Users/zdandljb/zookeeper/data
dataLogDir=xxx/zookeeper/server1/clientPort=2181 initLimit=5 syncLimit=2 server.1=server1:2888:3888 server.2=server2:2888:3888 server.3=server3:2888:3888Zookeeper的數據模型層次化的目錄結構,命名符合常規(guī)文件系統(tǒng)規(guī)范每個節(jié)點在zookeeper中叫做znode,并且其有一個唯一的路徑標識節(jié)點Znode可以包含數據和子節(jié)點,但是EPHEMERAL類型的節(jié)點不能有子節(jié)點Znode中的數據可以有多個版本,比如某一個路徑下存有多個數據版本,那么查詢這個路徑下的數據就需要帶上版本客戶端應用可以在節(jié)點上設置監(jiān)視器節(jié)點不支持部分讀寫,而是一次性完整讀寫8/21/202414Zookeeper的節(jié)點Znode有兩種類型,短暫的(ephemeral)和持久的(persistent)Znode的類型在創(chuàng)建時確定并且之后不能再修改短暫znode的客戶端會話結束時,zookeeper會將該短暫znode刪除,短暫znode不可以有子節(jié)點持久znode不依賴于客戶端會話,只有當客戶端明確要刪除該持久znode時才會被刪除Znode有四種形式的目錄節(jié)點,PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、EPHEMERAL_SEQUENTIAL8/21/202415Zookeeper的角色領導者(leader),負責進行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài)學習者(learner),包括跟隨者(follower)和觀察者(observer),follower用于接受客戶端請求并想客戶端返回結果,在選主過程中參與投票O(jiān)bserver可以接受客戶端連接,將寫請求轉發(fā)給leader,但observer不參加投票過程,只同步leader的狀態(tài),observer的目的是為了擴展系統(tǒng),提高讀取速度客戶端(client),請求發(fā)起方8/21/202416Zookeeper的角色8/21/202417Zookeeper的順序號創(chuàng)建znode時設置順序標識,znode名稱后會附加一個值順序號是一個單調遞增的計數器,由父節(jié)點維護在分布式系統(tǒng)中,順序號可以被用于為所有的事件進行全局排序,這樣客戶端可以通過順序號推斷事件的順序8/21/202418Zookeeper的讀寫機制Zookeeper是一個由多個server組成的集群一個leader,多個follower每個server保存一份數據副本全局數據一致分布式讀寫更新請求轉發(fā),由leader實施8/21/202419Zookeeper的保證更新請求順序進行,來自同一個client的更新請求按其發(fā)送順序依次執(zhí)行數據更新原子性,一次數據更新要么成功,要么失敗全局唯一數據視圖,client無論連接到哪個server,數據視圖都是一致的實時性,在一定事件范圍內,client能讀到最新數據8/21/202420Zookeeper的API接口String
create(String
path,byte[]
data,List<ACL>
acl,CreateMode
createMode)Stat
exists(String
path,boolean
watch)voiddelete(String
path,int
version)List<String>getChildren(String
path,boolean
watch)List<String>getChildren(String
path,boolean
watch)8/21/202421Zookeeper的API接口Stat
setData(String
path,byte[]
data,int
version)byte[]getData(String
path,boolean
watch,Stat
stat)voidaddAuthInfo(String
scheme,byte[]
auth)Stat
setACL(String
path,List<ACL>
acl,int
version)List<ACL>getACL(String
path,Stat
stat)8/21/202422觀察(watcher)Watcher在ZooKeeper是一個核心功能,Watcher可以監(jiān)控目錄節(jié)點的數據變化以及子目錄的變化,一旦這些狀態(tài)發(fā)生變化,服務器就會通知所有設置在這個目錄節(jié)點上的Watcher,從而每個客戶端都很快知道它所關注的目錄節(jié)點的狀態(tài)發(fā)生變化,而做出相應的反應可以設置觀察的操作:exists,getChildren,getData可以觸發(fā)觀察的操作:create,delete,setData8/21/202423寫操作與zookeeper內部事件的對應關系8/21/202424zookeeper內部事件與watcher的對應關系8/21/202425寫操作與watcher的對應關系8/21/202426ACL每個znode被創(chuàng)建時都會帶有一個ACL列表,用于決定誰可以對它執(zhí)行何種操作8/21/202427ACL身份驗證模式有三種:digest:用戶名,密碼host:通過客戶端的主機名來識別客戶端ip:
通過客戶端的ip來識別客戶端newACL(Perms.READ,newId("host",""));
這個ACL對應的身份驗證模式是host,符合該模式的
身份是,權限的組合是:READ8/21/202428Znode的節(jié)點狀態(tài)8/21/202429Zookeeper工作原理Zookeeper的核心是原子廣播,這個機制保證了各個server之間的同步。實現(xiàn)這個機制的協(xié)議叫做Zab協(xié)議。Zab協(xié)議有兩種模式,它們分別是恢復模式和廣播模式。當服務啟動或者在領導者崩潰后,Zab就進入了恢復模式,當領導者被選舉出來,且大多數server的完成了和leader的狀態(tài)同步以后,恢復模式就結束了。狀態(tài)同步保證了leader和server具有相同的系統(tǒng)狀態(tài)。8/21/202430Zookeeper工作原理一旦leader已經和多數的follower進行了狀態(tài)同步后,他就可以開始廣播消息了,即進入廣播狀態(tài)。這時候當一個server加入zookeeper服務中,它會在恢復模式下啟動,發(fā)現(xiàn)leader,并和leader進行狀態(tài)同步。待到同步結束,它也參與消息廣播。Zookeeper服務一直維持在Broadcast狀態(tài),直到leader崩潰了或者leader失去了大部分的followers支持。8/21/202431Zookeeper工作原理廣播模式需要保證proposal被按順序處理,因此zk采用了遞增的事務id號(zxid)來保證。所有的提議(proposal)都在被提出的時候加上了zxid。實現(xiàn)中zxid是一個64為的數字,它高32位是epoch用來標識leader關系是否改變,每次一個leader被選出來,它都會有一個新的epoch。低32位是個遞增計數。當leader崩潰或者leader失去大多數的follower,這時候zk進入恢復模式,恢復模式需要重新選舉出一個新的leader,讓所有的server都恢復到一個正確的狀態(tài)。8/21/202432Leader選舉每個Server啟動以后都詢問其它的Server它要投票給誰。對于其他server的詢問,server每次根據自己的狀態(tài)都回復自己推薦的leader的id和上一次處理事務的zxid(系統(tǒng)啟動時每個server都會推薦自己)收到所有Server回復以后,就計算出zxid最大的哪個Server,并將這個Server相關信息設置成下一次要投票的Server。計算這過程中獲得票數最多的的sever為獲勝者,如果獲勝者的票數超過半數,則改server被選為leader。否則,繼續(xù)這個過程,直到leader被選舉出來。8/21/202433Leader選舉leader就會開始等待server連接Follower連接leader,將最大的zxid發(fā)送給leaderLeader根據follower的zxid確定同步點完成同步后通知follower已經成為uptodate狀態(tài)Follower收到uptodate消息后,又可以重新接受client的請求進行服務了8/21/202434Leader選舉8/21/202435Leader選舉8/21/202436Zookeeper示例代碼8/21/202437Zookeeper示例代碼8/21/202438Zookeeper示例代碼輸出的結果如下:已經觸發(fā)了None事件!testRootData [testChildPathOne]目錄節(jié)點狀態(tài):[5,5,1281804532336,1281804532336,0,1,0,0,12,1,6]已經觸發(fā)了NodeChildrenChanged事件!testChildDataTwo已經觸發(fā)了NodeDeleted事件!已經觸發(fā)了NodeDeleted事件!8/21/202439應用場景1-統(tǒng)一命名服務分布式應用中,通常需要有一套完整的命名規(guī)則,既能夠產生唯一的名稱又便于人識別和記住,通常情況下用樹形的名稱結構是一個理想的選擇,樹形的名稱結構是一個有層次的目錄結構,既對人友好又不會重復。NameService是Zookeeper內置的功能,只要調用Zookeeper的API就能實現(xiàn)8/21/202440應用場景2-配置管理配置的管理在分布式應用環(huán)境中很常見,例如同一個應用系統(tǒng)需要多臺PCServer運行,但是它們運行的應用系統(tǒng)的某些配置項是相同的,如果要修改這些相同的配置項,那么就必須同時修改每臺運行這個應用系統(tǒng)的PCServer,這樣非常麻煩而且容易出錯。將配置信息保存在Zookeeper的某個目錄節(jié)點中,然后將所有需要修改的應用機器監(jiān)控配置信息的狀態(tài),一旦配置信息發(fā)生變化,每臺應用機器就會收到Zookeeper的通知,然后從Zookeeper獲取新的配置信息應用到系統(tǒng)中。8/21/202441應用場景2-配置管理8/21/202442應用場景3-集群管理Zookeeper能夠很容易的實現(xiàn)集群管理的功能,如有多臺Server組成一個服務集群,那么必須要一個“總管”知道當前集群中每臺機器的服務狀態(tài),一旦有機器不能提供服務,集群中其它集群必須知道,從而做出調整重新分配服務策略。同樣當增加集群的服務能力時,就會增加一臺或多臺Server,同樣也必須讓“總管”知道。Zookeeper不僅能夠維護當前的集群中機器的服務狀態(tài),而且能夠選出一個“總管”,讓這個總管來管理集群,這就是Zookeeper的另一個功能LeaderElection。8/21/202443應用場景3-集群管理8/21/202444應用場景3-集群管理zk.create("/testRootPath/testChildPath1","1".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);zk.create(“/testRootPath/testChildPath2”,“2”.getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);zk.create("/testRootPath/testChildPath3","3".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);8/21/202445應用場景3-集群管理zk.create("/testRootPath/testChildPath4","4".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(zk.getChildren("/testRootPath",false));打印結果:[testChildPath10000000000,testChildPath20000000001,testChildPath40000000003,testChildPath30000000002]8/21/202446應用場景3-集群管理規(guī)定編號最小的為master,所以當我們對SERVERS節(jié)點做監(jiān)控的時候,得到服務器列表,只要所有集群機器邏輯認為最小編號節(jié)點為master,那么master就被選出,而這個master宕機的時候,相應的znode會消失,然后新的服務器列表就被推送到客戶端,然后每個節(jié)點邏輯認為最小編號節(jié)點為master,這樣就做到動態(tài)master選舉。8/21/202447應用場景4-共享鎖共享鎖在同一個進程中很容易實現(xiàn),但是在跨進程或者在不同Server之間就不好實現(xiàn)了。Zookeeper卻很容易實現(xiàn)這個功能,實現(xiàn)方式也是需要獲得鎖的Server
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國投影機箱市場調查研究報告
- 2025年中國打繩機市場調查研究報告
- 2025年中國手動水封閘閥數據監(jiān)測報告
- 2025年中國快速沖擊夯數據監(jiān)測報告
- 人教版(2024)八年級下冊第14課 海峽兩岸的交往教案
- 2025年中國彩色餐巾紙數據監(jiān)測研究報告
- 2025年中國彩棉背心市場調查研究報告
- 大數據背景下的智慧交通考試試題及答案
- 2024年質量工程師考試答題技巧分析試題及答案
- 2025年中國并聯(lián)電容補償成套裝置市場調查研究報告
- 亞低溫的治療與護理
- 危險化學品企業(yè)設備完整性 第2部分 技術實施指南 編制說明
- 防高墜自查自糾臺賬
- GB/T 4437.1-2023鋁及鋁合金熱擠壓管第1部分:無縫圓管
- 市政工程消耗量定額 zya1-31-2015
- 《高等數學下冊》(資料全集)
- 奢侈品買賣協(xié)議書范本
- 抖音賬號運營服務投標方案
- 《新大學英語·跨文化交際閱讀》Values Behind Sayings
- 風電項目開發(fā)前期工作流程
- 勞動保障部《關于勞動合同制職工工齡計算問題的復函》
評論
0/150
提交評論