1. 程式人生 > >ZooKeeper的典型應用場景之Master選舉。

ZooKeeper的典型應用場景之Master選舉。

        Master選舉是一個分散式系統中非常常見的應用場景。分散式最核心的特性就是能夠將具有獨立計算能力的系統單元部署在不同的機器上,構成一個完整的分散式系統。而與此同時,實際場景中往往也需要在這些分佈在不同機器上的獨立系統單元中選出一個所謂的“老大”,在電腦科學中,我們稱之為Master。

        在分散式系統中,Master往往用來協調叢集中其他系統單元,具有對分散式系統狀態變更的決定權。例如,在一些讀寫分離的應用場景中,客戶端的寫請求往往是由Master來處理的;而在另一些場景中,Master則常常負責處理一些複雜的邏輯,並將處理結果同步給叢集中其他系統單元。Master選舉可以說是ZooKeeper最典型的應用場景了,在這裡,我們就結合“一種海量資料處理與共享模型”這個具體例子來看看ZooKeeper在叢集Master選舉中的應用場景。

        在分散式環境中,經常會碰到這樣的應用場景:叢集中的所有系統單元需要對前端業務提供資料,比如一個商品ID,或者是一個網站輪播廣告的廣告ID(通常出現在一些廣告投放系統中)等,而這些商品ID或是廣告ID往往需要從一系列的海量資料處理中計算得到——這通常是一個非常耗費I/O和CPU資源的過程。鑑於該計算過程的複雜性,如果讓叢集中的所有機器都執行這個計算邏輯的話,那麼將耗費非常多的資源。一種比較好的方法就是隻讓叢集中的部分,甚至只讓其中的一臺機器去處理資料計算,一旦計算出資料結果,就可以共享給整個叢集中的其他所有客戶端機器,這樣可以大大減少重複勞動,提升效能。

        這裡我們以一個簡單的廣告投放系統後臺場景為例來講解這個模型。整個系統大體上可以分成客戶端叢集、分散式快取系統、海量資料處理匯流排和ZooKeeper四個部分,如下圖所示。

        首先我們來看整個系統的執行機制。上圖中的Client叢集每天定時會通過ZooKeeper來實現Master選舉。選舉產生Master客戶端之後,這個Master就會負責進行一系列的海量資料處理,最終計算得到一個數據結果,並將其放置在一個記憶體/資料庫中。同時,Master還需要通知叢集中其他所有的客戶端從這個記憶體/資料庫中共享計算結果。

        接下去,我們將重點來看Master選舉的過程,首先來明確下Master選舉的需求:在叢集的所有機器中選舉出一臺機器作為Master。針對這個需求,通常情況下,我們可以選擇常見的關係型資料庫中的主鍵特性來實現:叢集中的所有機器都向資料庫彙總插入一條相同主鍵ID的記錄,資料庫會幫助我們自動進行主鍵衝突檢查,也就說,所有進行插入操作的客戶端機器中,只有一臺機器能夠成功——那麼,我們就認為向資料庫中成功插入資料的客戶端機器稱為Master。

        乍一看,這個方案確實可行,依賴關係型資料庫的主鍵特效能夠很好的保證在叢集中選舉出唯一的一個Master。但是我們需要考慮的另一個問題是,如果當前選舉出的Master掛了,那麼該如何處理?誰來告訴我Master掛了呢?顯然,關係型資料庫沒法通知我們這個事件。那麼,如果使用ZooKeeper是否可以做到這一點呢?

        利用ZooKeeper的強一致性,能夠很好的保證在分散式高併發情況下節點的建立一定能夠保證全域性唯一性,即ZooKeeper將會保證客戶端無法重複建立一個已經存在的資料節點。也就是說,如果同時有多個客戶端請求建立同一個節點,那麼最終一定只有一個客戶端請求能夠建立成功。利用這個特性,就能很容易的分散式環境中進行Master選舉了。

        在這個系統中,首先會在ZooKeeper上建立一個日期節點,例如“2013-09-20”,如下圖所示。

        客戶端叢集每天都會定時往ZooKeeper上建立一個臨時節點,例如/master_election/2013-09-20/binding。在這個過程中,只有一個客戶端能夠成功建立這個節點,那麼這個客戶端所在的機器就成為了Master。同時,其他沒有在ZooKeeper上成功建立節點的客戶端,都會在節點/master_election/2013-09-20上註冊一個子節點變更的Watcher,用於監控當前的Master機器是否存活,一旦發現當前的Master掛了,那麼其餘的客戶端將會重新進行Master選舉。

        從上面的講解中,我們可以看到,如果僅僅只是想實現Master選舉的話,那麼其實只需要有一個能夠保證資料唯一性的元件即可,例如關係型資料庫的主鍵模型就是非常不錯的選擇。但是,如果希望能夠快速的進行叢集Master動態選舉,那麼基於ZooKeeper來實現是一個不錯的新思路。

相關推薦

ZooKeeper典型應用場景Master選舉

        Master選舉是一個分散式系統中非常常見的應用場景。分散式最核心的特性就是能夠將具有獨立計算能力的系統單元部署在不同的機器上,構成一個完整的分散式系統。而與此同時,實際場景中往往也需要在這些分佈在不同機器上的獨立系統單元中選出一個所謂的“老大”,在電腦科學

zookeeper開源客戶端Curator典型應用場景-Master選舉(十)

在生產環境中,一般要保證服務的高可用,有時候只需要選出一臺機器來執行,其餘機器處於備用狀態,比如,在分散式系統中很常見的一個問題就是定時任務的執行。如果多臺機器同時執行相同的定時任務,業務複雜則可能出現災難性的後果。我使用的是噹噹網的elastic-job分散

ZooKeeper典型應用場景名稱空間

        命名服務(Name Service)也是分散式系統中比較常見的一類場景,在《Java網路高階程式設計》一書中提到,命名服務是分散式系統最基本的公共服務之一。在分散式系統中,被命名的實體通常可以是叢集中的機器、提供的服務地址或遠端物件等——這些我們都可以統稱他

zookeeper開源客戶端Curator典型應用場景-服務註冊與發現(十一)

隨著業務增加,以前簡單的系統已經變得越來越複雜,單純的提升伺服器效能也不是辦法,而且程式碼也是越來越龐大,維護也變得越來越困難,這一切都催生了新的架構設計風格 – 微服務架構的出現。 微服務給我們帶來了很多好處,例如:獨立可擴充套件、易維護。但是隨著應用的分解

zookeeper開源客戶端Curator典型應用場景-Barrier屏障(十三)

什麼是Barrier Barrier是這樣的:Barrier是一個同步點,每一個程序到達此點都要等待,直到某一個條件滿足,然後所有的節點繼續進行。 比如:賽跑大家都知道,所有比賽人員都會在起跑線外等待,直到教練員的槍響之後,所有參賽者立刻開始賽跑。 JDK的併

zookeeper開源客戶端Curator典型應用場景-分散式計數器(十四)

之前我們瞭解了基於Corator的分散式鎖之後,我們就很容易基於其實現一個分散式計數器,顧名思義,計數器是用來計數的, 利用ZooKeeper可以實現一個叢集共享的計數器。 只要使用相同的path就可以得到最新的計數器值, 這是由ZooKeeper的一致性保證

zookeeper開源客戶端Curator典型應用場景-訊息佇列(十二)

Curator框架也有分散式佇列實現。 利用ZK的PERSISTENT SEQUENTIAL(持久順序)節點,可以保證放入到佇列中的專案是按照順序排隊的。並且宕機重啟並不丟失訊息, 如果單一的消費者從佇列中取資料, 那麼它是先入先出的,這也是佇列的特點。 如果

ZooKeeper 典型應用場景

Zookeeper基礎知識  1.zookeeper是一個類似hdfs的樹形檔案結構,zookeeper可以用來保證資料在(zk)叢集之間的資料的事務性一致、  2.zookeeper有watch事件,是一次性觸發的,當watch監視的資料發生變化時,通知設定了該watch的client,即watcher  

ZooKeeper典型應用場景

ZooKeeper是一個高可用的分散式資料管理與系統協調框架。基於對Paxos演算法的實現,使該框架保證了分散式環境中資料的強一致性,也正是基於這樣的特性,使得ZooKeeper解決很多分散式問題。網上對ZK的應用場景也有不少介紹,本文將結合作者身邊的專案例子,系統地對ZK的

ZooKeeper典型應用場景一覽

叢集機器監控:這通常用於那種對叢集中機器狀態,機器線上率有較高要求的場景,能夠快速對叢集中機器變化作出響應。這樣的場景中,往往有一個監控系統,實時檢測叢集機器是否存活。過去的做法通常是:監控系統通過某種手段(比如ping)定時檢測每個機器,或者每個機器自己定時向監控系統彙報“我還活著”。 這種做法可行

【推薦】zookeeper典型應用場景: 分散式計數器

一、技術介紹 zookeeper有很多典型應用場景,應用在分散式系統中,這裡介紹其分散式計數器應用。本文將討論如何使用Curator來實現計數器。 顧名思義,計數器是用來計數的, 利用ZooKeeper可以實現一個叢集共享的計數器。 只要使用相同的path就可以得到最新的計數器值, 這是由Z

Hive典型應用場景行列轉換

在使用Hive處理資料時,經常遇到行列轉換的場景,本文將對Hive的行列轉換操作做詳細的說明。 行轉列 1)多行轉多列 假設資料表 row2col: col1 col2 col3 a c 1 a d

大資料生態zookeeper典型應用場景

1. 命名服務        命名服務是分散式系統中較為常見的一類場景,分散式系統中,被命名的實體通常可以是叢集中的機器、提供的服務地址或者遠端物件,通過命名服務,客戶端可以根據指定名字來獲取資源的實體、服務地址和提供者的資訊。Zookee

ZooKeeper學習路 (七)ZooKeeper設計特點及典型應用場景

目錄 正文 回到頂部 ZooKeeper 特點/設計目的 ZooKeeper 作為一個叢集提供資料一致的協調服務,自然,最好的方式就是在整個叢集中的 各服務節點進行資料的複製和同步。 資料複製的好處 1、容錯:一個節點出錯,不至於讓整個叢集無法提供服務

Zookeeper應用場景分布式屏障Barrier

pri worker use int 休眠 沒有 分布 eat demo Barrier就是柵欄或者屏障,適用於這樣的業務場景:當有些操作需要並行執行,但後續操作又需要串行執行,此時必須等待所有並行執行的線程全部結束,才開始串行,於是就需要一個屏障,來控制所有線程同時開始,

ZooKeeper典型應用場景

拉取 ons 執行 全局 進行 創建失敗 消息通知 防止 成了 《從Paxos到Zookeeper 分布式一致性原理與實踐》讀書筆記 本文:總結腦圖地址:腦圖 前言 所有的典型應用場景,都是利用了ZK的如下特性: 強一致性:在高並發情況下,能夠保證節點的創建一定是

SpringBoot整合RabbitMQ典型應用場景實戰二

factor aid 分享圖片 actor esp rem 排隊 stc tps 實戰前言RabbitMQ 作為目前應用相當廣泛的消息中間件,在企業級應用、微服務應用中充當著重要的角色。特別是在一些典型的應用場景以及業務模塊中具有重要的作用,比如業務服務模塊解耦、異步通信、

SpringBoot整合RabbitMQ典型應用場景實戰三

分布 boot 自動刪除 blog jce 地址 這樣的 實施 微服務 實戰前言RabbitMQ 作為目前應用相當廣泛的消息中間件,在企業級應用、微服務應用中充當著重要的角色。特別是在一些典型的應用場景以及業務模塊中具有重要的作用,比如業務服務模塊解耦、異步通信、高並發限流

SpringBoot整合RabbitMQ 典型應用場景實戰二

實戰前言 RabbitMQ 作為目前應用相當廣泛的訊息中介軟體,在企業級應用、微服務應用中充當著重要的角色。特別是在一些典型的應用場景以及業務模組中具有重要的作用,比如業務服務模組解耦、非同步通訊、高併發限流、超時業務、資料延遲處理等。上一篇博文我分享了RabbitMQ在業務服務模組解耦,非

SpringBoot整合RabbitMQ 典型應用場景實戰一

實戰前言 RabbitMQ 作為目前應用相當廣泛的訊息中介軟體,在企業級應用、微服務應用中充當著重要的角色。特別是在一些典型的應用場景以及業務模組中具有重要的作用,比如業務服務模組解耦、非同步通訊、高併發限流、超時業務、資料延遲處理等。 RabbitMQ 官網拜讀 首先,讓我們先拜讀