日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

5分钟让你了解 ZooKeeper 的功能和原理

發(fā)布時(shí)間:2024/2/28 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5分钟让你了解 ZooKeeper 的功能和原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

個(gè)人分類:?分布式服務(wù)

目錄?
  一 .Zookeeper功能簡(jiǎn)介?
  二 . ZooKeeper基本概念?
    2.1  集群角色?
    2.2 集群節(jié)點(diǎn)分工?
    2.3  session?
    2.4 數(shù)據(jù)節(jié)點(diǎn)?
    2.5 狀態(tài)信息?
    2.6 事物操作?
    2.7  Watcher(事件監(jiān)聽器)?
  三 .zookeeper應(yīng)用的典型場(chǎng)景?
    3.1 數(shù)據(jù)發(fā)布與訂閱(配置中心)?
    3.2 命名服務(wù)?
    3.3 分布式協(xié)調(diào)服務(wù)/通知?
    3.4 Master選舉?
    3.5 分布式鎖?
  四 .總結(jié)

一 .Zookeeper功能簡(jiǎn)介

<span style="color:#000000"><code> ZooKeeper 是一個(gè)開源的分布式協(xié)調(diào)服務(wù),由雅虎創(chuàng)建,是 Google Chubby 的開源實(shí)現(xiàn)。 分布式應(yīng)用程序可以基于 ZooKeeper 實(shí)現(xiàn)諸如數(shù)據(jù)發(fā)布/訂閱、負(fù)載均衡、命名服務(wù)、分布式協(xié) 調(diào)/通知、集群管理、Master 選舉、配置維護(hù),名字服務(wù)、分布式同步、分布式鎖和分布式隊(duì)列 等功能。 </code></span>

二 .?ZooKeeper基本概念


本節(jié)將介紹 ZooKeeper 的幾個(gè)核心概念?
因此有必要預(yù)先了解這些概念。

  • 集群角色
  • 一個(gè) ZooKeeper 集群同一時(shí)刻只會(huì)有一個(gè) Leader,其他都是 Follower 或 Observer。

    ZooKeeper 配置很簡(jiǎn)單,每個(gè)節(jié)點(diǎn)的配置文件(zoo.cfg)都是一樣的,只有 myid 文件不一樣。myid 的值必須是 zoo.cfg中server.{數(shù)值} 的{數(shù)值}部分。

    zoo.cfg配置文件示例?

    <span style="color:#000000"><code> 在裝有 ZooKeeper 的機(jī)器的終端執(zhí)行 zookeeper-server status 可以看當(dāng)前節(jié)點(diǎn)的 ZooKeeper是什么角色(Leader or Follower)。 </code></span>

    ZooKeeper 默認(rèn)只有 Leader 和 Follower 兩種角色,沒有 Observer 角色。為了使用 Observer 模式,在任何想變成Observer的節(jié)點(diǎn)的配置文件中加入:peerType=observer 并在所有 server 的配置文件中,配置成 observer 模式的 server 的那行配置追加 :observer

    2 .?節(jié)點(diǎn)讀寫服務(wù)分工

    <span style="color:#000000"><code> 1.ZooKeeper 集群的所有機(jī)器通過一個(gè) Leader 選舉過程來選定一臺(tái)被稱為『Leader』的機(jī)器,Leader服務(wù)器為客戶端提供讀和寫服務(wù)。2.Follower 和 Observer 都能提供讀服務(wù),不能提供寫服務(wù)。兩者唯一的區(qū)別在于,Observer機(jī)器不參與 Leader 選舉過程,也不參與寫操作的『過半寫成功』策略,因此 Observer 可以在不影響寫性能的情況下提升集群的讀性能。 </code></span>

    3 .?Session

    <span style="color:#000000"><code> Session 是指客戶端會(huì)話,在講解客戶端會(huì)話之前,我們先來了解下客戶端連接。在ZooKeeper 中,一個(gè)客戶端連接是指客戶端和 ZooKeeper 服務(wù)器之間的TCP長連接。ZooKeeper 對(duì)外的服務(wù)端口默認(rèn)是2181,客戶端啟動(dòng)時(shí),首先會(huì)與服務(wù)器建立一個(gè)TCP連接,從第一次連接建立開始,客戶端會(huì)話的生命周期也開始了,通過這個(gè)連接,客戶端能夠通過心跳檢測(cè)和服務(wù)器保持有效的會(huì)話,也能夠向 ZooKeeper 服務(wù)器發(fā)送請(qǐng)求并接受響應(yīng),同時(shí)還能通過該連接接收來自服務(wù)器的 Watch 事件通知。Session 的 SessionTimeout 值用來設(shè)置一個(gè)客戶端會(huì)話的超時(shí)時(shí)間。當(dāng)由于服務(wù)器壓力太大、網(wǎng)絡(luò)故障或是客戶端主動(dòng)斷開連接等各種原因?qū)е驴蛻舳诉B接斷開時(shí),只要在 SessionTimeout 規(guī)定的時(shí)間內(nèi)能夠重新連接上集群中任意一臺(tái)服務(wù)器,那么之前創(chuàng)建的會(huì)話仍然有效。 </code></span>

    4 .?數(shù)據(jù)節(jié)點(diǎn)

    <span style="color:#000000"><code> zookeeper的結(jié)構(gòu)其實(shí)就是一個(gè)樹形結(jié)構(gòu),leader就相當(dāng)于其中的根結(jié)點(diǎn),其它節(jié)點(diǎn)就相當(dāng)于follow節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都保留自己的內(nèi)容。zookeeper的節(jié)點(diǎn)分兩類:持久節(jié)點(diǎn)和臨時(shí)節(jié)點(diǎn)- 持久節(jié)點(diǎn):所謂持久節(jié)點(diǎn)是指一旦這個(gè) 樹形結(jié)構(gòu)上被創(chuàng)建了,除非主動(dòng)進(jìn)行對(duì)樹節(jié)點(diǎn)的移除操作,否則這個(gè) 節(jié)點(diǎn)將一直保存在 ZooKeeper 上。- 臨時(shí)節(jié)點(diǎn):臨時(shí)節(jié)點(diǎn)的生命周期跟客戶端會(huì)話綁定,一旦客戶端會(huì)話失效,那么這個(gè)客戶端創(chuàng)建的所有臨時(shí)節(jié)點(diǎn)都會(huì)被移除。 </code></span>

    5 .?狀態(tài)信息

    <span style="color:#000000"><code> 每個(gè) 節(jié)點(diǎn)除了存儲(chǔ)數(shù)據(jù)內(nèi)容之外,還存儲(chǔ)了 節(jié)點(diǎn)本身的一些狀態(tài)信息。用 get 命令可以 同時(shí)獲得某個(gè) 節(jié)點(diǎn)的內(nèi)容和狀態(tài)信息在 ZooKeeper 中,version 屬性是用來實(shí)現(xiàn)樂觀鎖機(jī)制中的『寫入校驗(yàn)』的(保證分布 式數(shù)據(jù)原子性操作)。 </code></span>

    6 .事物操作

    <span style="color:#000000"><code> 在ZooKeeper中,能改變ZooKeeper服務(wù)器狀態(tài)的操作稱為事務(wù)操作。一般包括數(shù)據(jù)節(jié)點(diǎn) 創(chuàng)建與刪除、數(shù)據(jù)內(nèi)容更新和客戶端會(huì)話創(chuàng)建與失效等操作。對(duì)應(yīng)每一個(gè)事務(wù)請(qǐng)求,ZooKeeper 都會(huì)為其分配一個(gè)全局唯一的事務(wù)ID,用 ZXID 表示,通常是一個(gè)64位的數(shù)字。每一個(gè) ZXID 對(duì)應(yīng)一次更新操作,從這些 ZXID 中可以間接地識(shí)別出 ZooKeeper 處理這些事務(wù)操作請(qǐng)求的 全局順序。 </code></span>

    7 .Watcher(事件監(jiān)聽器)

    <span style="color:#000000"><code> 是 ZooKeeper 中一個(gè)很重要的特性。ZooKeeper允許用戶在指定節(jié)點(diǎn)上注冊(cè)一些 Watcher, 并且在一些特定事件觸發(fā)的時(shí)候,ZooKeeper 服務(wù)端會(huì)將事件通知到感興趣的客戶端上去。該 機(jī)制是 ZooKeeper 實(shí)現(xiàn)分布式協(xié)調(diào)服務(wù)的重要特性。 </code></span>

    三 .ZooKeeper應(yīng)用的典型場(chǎng)景

    <span style="color:#000000"><code> ZooKeeper 是一個(gè)高可用的分布式數(shù)據(jù)管理與協(xié)調(diào)框架。基于對(duì)ZAB算法的實(shí)現(xiàn),該框架 能夠很好地保證分布式環(huán)境中數(shù)據(jù)的一致性。也是基于這樣的特性,使得 ZooKeeper 成為了 解決分布式一致性問題的利器。 </code></span>

    1 .?數(shù)據(jù)發(fā)布與訂閱(配置中心)

    <span style="color:#000000"><code> 數(shù)據(jù)發(fā)布與訂閱,即所謂的配置中心,顧名思義就是發(fā)布者將數(shù)據(jù)發(fā)布到 ZooKeeper 節(jié)點(diǎn)上, 供訂閱者進(jìn)行數(shù)據(jù)訂閱,進(jìn)而達(dá)到動(dòng)態(tài)獲取數(shù)據(jù)的目的,實(shí)現(xiàn)配置信息的集中式管理和動(dòng)態(tài)更新。對(duì)于:數(shù)據(jù)量通常比較小。數(shù)據(jù)內(nèi)容在運(yùn)行時(shí)動(dòng)態(tài)變化。集群中各機(jī)器共享,配置一致。 這樣的全局配置信息就可以發(fā)布到 ZooKeeper上,讓客戶端(集群的機(jī)器)去訂閱該消息。發(fā)布/訂閱系統(tǒng)一般有兩種設(shè)計(jì)模式,分別是推(Push)和拉(Pull)模式。- 推模式服務(wù)端主動(dòng)將數(shù)據(jù)更新發(fā)送給所有訂閱的客戶端- 拉模式客戶端主動(dòng)發(fā)起請(qǐng)求來獲取最新數(shù)據(jù),通常客戶端都采用定時(shí)輪詢拉取的方式ZooKeeper 采用的是推拉相結(jié)合的方式:客戶端想服務(wù)端注冊(cè)自己需要關(guān)注的節(jié)點(diǎn),一旦該節(jié)點(diǎn)的數(shù)據(jù)發(fā)生變更,那么服務(wù)端就會(huì)向相應(yīng) 的客戶端發(fā)送Watcher事件通知,客戶端接收到這個(gè)消息通知后,需要主動(dòng)到服務(wù)端獲取最新的數(shù)據(jù) </code></span>

    2 .?命名服務(wù)

    <span style="color:#000000"><code> 命名服務(wù)也是分布式系統(tǒng)中比較常見的一類場(chǎng)景。在分布式系統(tǒng)中,通過使用命名服務(wù),客戶端 應(yīng)用能夠根據(jù)指定名字來獲取資源或服務(wù)的地址,提供者等信息。被命名的實(shí)體通常可以是集群中的 機(jī)器,提供的服務(wù),遠(yuǎn)程對(duì)象等等——這些我們都可以統(tǒng)稱他們?yōu)槊帧F渲休^為常見的就是一些分布式服務(wù)框架(如RPC)中的服務(wù)地址列表。通過在ZooKeepr里 創(chuàng)建順序節(jié)點(diǎn),能夠很容易創(chuàng)建一個(gè)全局唯一的路徑,這個(gè)路徑就可以作為一個(gè)名字。ZooKeeper 的命名服務(wù)即生成全局唯一的ID。 </code></span>

    3 .?分布式協(xié)調(diào)服務(wù)/通知

    <span style="color:#000000"><code> ZooKeeper 中特有 Watcher 注冊(cè)與異步通知機(jī)制,能夠很好的實(shí)現(xiàn)分布式環(huán)境下不同機(jī)器, 甚至不同系統(tǒng)之間的通知與協(xié)調(diào),從而實(shí)現(xiàn)對(duì)數(shù)據(jù)變更的實(shí)時(shí)處理。使用方法通常是不同的客戶端 如果 機(jī)器節(jié)點(diǎn) 發(fā)生了變化,那么所有訂閱的客戶端都能夠接收到相應(yīng)的Watcher通知,并做出相應(yīng) 的處理。ZooKeeper的分布式協(xié)調(diào)/通知,是一種通用的分布式系統(tǒng)機(jī)器間的通信方式。 </code></span>

    4 .?Master選舉

    Master 選舉可以說是 ZooKeeper 最典型的應(yīng)用場(chǎng)景了。比如 HDFS 中 Active NameNode 的選舉、YARN 中 Active ResourceManager 的選舉和 HBase 中 Active HMaster 的選舉等。

    <span style="color:#000000"><code> 針對(duì) Master 選舉的需求,通常情況下,我們可以選擇常見的關(guān)系型數(shù)據(jù)庫中的主鍵特性來 實(shí)現(xiàn):希望成為 Master 的機(jī)器都向數(shù)據(jù)庫中插入一條相同主鍵ID的記錄,數(shù)據(jù)庫會(huì)幫我們進(jìn)行 主鍵沖突檢查,也就是說,只有一臺(tái)機(jī)器能插入成功——那么,我們就認(rèn)為向數(shù)據(jù)庫中成功插入數(shù)據(jù) 的客戶端機(jī)器成為Master。依靠關(guān)系型數(shù)據(jù)庫的主鍵特性確實(shí)能夠很好地保證在集群中選舉出唯一的一個(gè)Master。但是,如果當(dāng)前選舉出的 Master 掛了,那么該如何處理?誰來告訴我 Master 掛了呢? 顯然,關(guān)系型數(shù)據(jù)庫無法通知我們這個(gè)事件。但是,ZooKeeper 可以做到!利用 ZooKeepr 的強(qiáng)一致性,能夠很好地保證在分布式高并發(fā)情況下節(jié)點(diǎn)的創(chuàng)建一定能夠 保證全局唯一性,即 ZooKeeper 將會(huì)保證客戶端無法創(chuàng)建一個(gè)已經(jīng)存在的 數(shù)據(jù)單元節(jié)點(diǎn)。也就是說,如果同時(shí)有多個(gè)客戶端請(qǐng)求創(chuàng)建同一個(gè)臨時(shí)節(jié)點(diǎn),那么最終一定只有一個(gè)客戶端 請(qǐng)求能夠創(chuàng)建成功。利用這個(gè)特性,就能很容易地在分布式環(huán)境中進(jìn)行 Master 選舉了。成功創(chuàng)建該節(jié)點(diǎn)的客戶端所在的機(jī)器就成為了 Master。同時(shí),其他沒有成功創(chuàng)建該節(jié)點(diǎn)的 客戶端,都會(huì)在該節(jié)點(diǎn)上注冊(cè)一個(gè)子節(jié)點(diǎn)變更的 Watcher,用于監(jiān)控當(dāng)前 Master 機(jī)器是否存 活,一旦發(fā)現(xiàn)當(dāng)前的Master掛了,那么其他客戶端將會(huì)重新進(jìn)行 Master 選舉。這樣就實(shí)現(xiàn)了 Master 的動(dòng)態(tài)選舉。 </code></span>

    5 .?分布式鎖

    分布式鎖是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式?
    分布式鎖又分為排他鎖和共享鎖兩種

    • 排它鎖?
      ZooKeeper如何實(shí)現(xiàn)排它鎖?

      • 定義鎖?
        ZooKeeper 上的一個(gè) 機(jī)器節(jié)點(diǎn) 可以表示一個(gè)鎖
      • 獲得鎖?
        把ZooKeeper上的一個(gè)節(jié)點(diǎn)看作是一個(gè)鎖,獲得鎖就通過創(chuàng)建臨時(shí)節(jié)點(diǎn)的方式來實(shí)現(xiàn)。?
        ZooKeeper 會(huì)保證在所有客戶端中,最終只有一個(gè)客戶端能夠創(chuàng)建成功,那么就可以?
        認(rèn)為該客戶端獲得了鎖。同時(shí),所有沒有獲取到鎖的客戶端就需要到/exclusive_lock?
        節(jié)點(diǎn)上注冊(cè)一個(gè)子節(jié)點(diǎn)變更的Watcher監(jiān)聽,以便實(shí)時(shí)監(jiān)聽到lock節(jié)點(diǎn)的變更情況。
      • 釋放鎖?
        因?yàn)殒i是一個(gè)臨時(shí)節(jié)點(diǎn),釋放鎖有兩種方式

        • 當(dāng)前獲得鎖的客戶端機(jī)器發(fā)生宕機(jī)或重啟,那么該臨時(shí)節(jié)點(diǎn)就會(huì)被刪除,釋放鎖
        • 正常執(zhí)行完業(yè)務(wù)邏輯后,客戶端就會(huì)主動(dòng)將自己創(chuàng)建的臨時(shí)節(jié)點(diǎn)刪除,釋放鎖。

    無論在什么情況下移除了lock節(jié)點(diǎn),ZooKeeper 都會(huì)通知所有在 /exclusive_lock 節(jié)點(diǎn)上注冊(cè)了節(jié)點(diǎn)變更 Watcher 監(jiān)聽的客戶端。這些客戶端在接收到通知后,再次重新發(fā)起分布式鎖獲取,即重復(fù)『獲取鎖』過程。

    • 共享鎖

      共享鎖在同一個(gè)進(jìn)程中很容易實(shí)現(xiàn),但是在跨進(jìn)程或者在不同 Server 之間就不好實(shí)現(xiàn)了。Zookeeper 卻很容易實(shí)現(xiàn)這個(gè)功能,實(shí)現(xiàn)方式也是需要獲得鎖的 Server 創(chuàng)建一個(gè) EPHEMERAL_SEQUENTIAL 目錄節(jié)點(diǎn),然后調(diào)用 getChildren方法獲取當(dāng)前的目錄節(jié)點(diǎn)列表中最小的目錄節(jié)點(diǎn)是不是就是自己創(chuàng)建的目錄節(jié)點(diǎn),如果正是自己創(chuàng)建的,那么它就獲得了這個(gè)鎖,如果不是那么它就調(diào)用 exists(String path, boolean watch) 方法并監(jiān)控 Zookeeper 上目錄節(jié)點(diǎn)列表的變化,一直到自己創(chuàng)建的節(jié)點(diǎn)是列表中最小編號(hào)的目錄節(jié)點(diǎn),從而獲得鎖,釋放鎖很簡(jiǎn)單,只要?jiǎng)h除前面它自己所創(chuàng)建的目錄節(jié)點(diǎn)就行了。

    總結(jié)

    <span style="color:#000000"><code> 本文介紹的 Zookeeper 的基本知識(shí),以及介紹了幾個(gè)典型的應(yīng)用場(chǎng)景。這些都是 Zookeeper的基本功能,最重要的是 Zoopkeeper 提供了一套很好的分布式集群管理的機(jī)制,就是它這種基于層次型的目錄樹的數(shù)據(jù)結(jié)構(gòu),并對(duì)樹中的節(jié)點(diǎn)進(jìn)行有效管理,從而可以設(shè)計(jì)出多種多樣的分布式的數(shù)據(jù)管理模型,而不僅僅局限于上面提到的幾個(gè)常用應(yīng)用場(chǎng)景</code></span> 超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

    總結(jié)

    以上是生活随笔為你收集整理的5分钟让你了解 ZooKeeper 的功能和原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。