16年第一天上班 接下來幾天會整理下之前學過的知識 :node
一. ZooKeeper介紹apache
ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、命名服務、分佈式同步、組服務等
二. ZooKeeper的使用場景服務器
數據發佈與訂閱(配置中心)負載均衡
發佈與訂閱模型,即所謂的配置中心,顧名思義就是發佈者將數據發佈到ZK節點上,供訂閱者動態獲取數據,實現配置信息的集中式管理和動態更新。例如全局的配置信息,服務式服務框架的服務地址列表等就很是適合使用。框架
注意:在上面提到的應用場景中,有個默認前提是:數據量很小,可是數據更新可能會比較快的場景。異步
負載均衡分佈式
這裏說的負載均衡是指軟負載均衡。在分佈式環境中,爲了保證高可用性,一般同一個應用或同一個服務的提供方都會部署多份,達到對等服務。而消費者就需要在這些對等的服務器中選擇一個來執行相關的業務邏輯,其中比較典型的是消息中間件中的生產者,消費者負載均衡。oop
在某個消費者故障或者重啓等狀況下,其餘消費者會感知到這一變化(經過 zookeeper watch消費者列表),而後從新進行負載均衡,保證全部的分區都有消費者進行消費。code
命名服務(Naming Service)server
命名服務也是分佈式系統中比較常見的一類場景。在分佈式系統中,經過使用命名服務,客戶端應用可以根據指定名字來獲取資源或服務的地址,提供者等信息。被命名的實體一般能夠是集羣中的機器,提供的服務地址,遠程對象等等——這些咱們均可以統稱他們爲名字(Name)。其中較爲常見的就是一些分佈式服務框架中的服務地址列表。經過調用ZK提供的建立節點的API,可以很容易建立一個全局惟一的path,這個path就能夠做爲一個名稱。
注意,全部向ZK上註冊的地址都是臨時節點,這樣就可以保證服務提供者和消費者可以自動感應資源的變化。
分佈式通知/協調
ZooKeeper中特有watcher註冊與異步通知機制,可以很好的實現分佈式環境下不一樣系統之間的通知與協調,實現對數據變動的實時處理。使用方法一般是不一樣系統都對ZK上同一個znode進行註冊,監聽znode的變化(包括znode自己內容及子節點的),其中一個系統update了znode,那麼另外一個系統可以收到通知,並做出相應處理
1). 另外一種心跳檢測機制:檢測系統和被檢測系統之間並不直接關聯起來,而是經過zk上某個節點關聯,大大減小系統耦合。
2). 另外一種系統調度模式:某系統有控制檯和推送系統兩部分組成,控制檯的職責是控制推送系統進行相應的推送工做。管理人員在控制檯做的一些操做,其實是修改了ZK上某些節點的狀態,而ZK就把這些變化通知給他們註冊Watcher的客戶端,即推送系統,因而,做出相應的推送任務。
3). 另外一種工做彙報模式:一些相似於任務分發系統,子任務啓動後,到zk來註冊一個臨時節點,而且定時將本身的進度進行彙報(將進度寫回這個臨時節點),這樣任務管理者就可以實時知道任務進度。
總之,使用zookeeper來進行分佈式通知和協調可以大大下降系統之間的耦合
集羣管理與Master選舉
Master選舉則是zookeeper中最爲經典的應用場景了。
分佈式鎖
分佈式鎖,這個主要得益於ZooKeeper爲咱們保證了數據的強一致性。鎖服務能夠分爲兩類,一個是 保持獨佔,另外一個是 控制時序。
分佈式隊列
隊列方面,簡單地講有兩種,一種是常規的先進先出隊列,另外一種是要等到隊列成員聚齊以後的才統一按序執行。對於第一種先進先出隊列,和分佈式鎖服務中的控制時序場景基本原理一致,這裏再也不贅述。 第二種隊列實際上是在FIFO隊列的基礎上做了一個加強。一般能夠在 /queue 這個znode下預先創建一個/queue/num 節點,而且賦值爲n(或者直接給/queue賦值n),表示隊列大小,以後每次有隊列成員加入後,就判斷下是否已經到達隊列大小,決定是否能夠開始執行了。這種用法的典型場景是,分佈式環境中,一個大任務Task A,須要在不少子任務完成(或條件就緒)狀況下才能進行。這個時候,凡是其中一個子任務完成(就緒),那麼就去 /taskList 下創建本身的臨時時序節點(CreateMode.EPHEMERAL_SEQUENTIAL),當 /taskList 發現本身下面的子節點知足指定個數,就能夠進行下一步按序進行處理了。
三. ZooKeeper的集羣安裝部署
**要將 ZK 集羣的節點數量要爲奇數(2n+1:如 三、五、7 個節點)較爲合適** 服務器 1:192.168.1.81 端口:218一、288一、3881 服務器 2:192.168.1.82 端口:218二、288二、3882 服務器 3:192.168.1.83 端口:218三、288三、3883 1. 修改/etc/hosts 192.168.1.81 zk-01 192.168.1.82 zk-02 192.168.1.83 zk-03 2. 解壓zookeeper,在安裝目錄中建立data,logs目錄 3. copy 安裝文件中conf/ 下的 zoo_sample.cfg cp zoo_sample.cfg zoo.cfg 4. 配置每一個節點的zoo.cfg,例如: #心跳時間 tickTime=2000 #Zookeeper 服務器集羣中鏈接到 Leader 的 Follower 服務器 initLimit=10 syncLimit=5 dataDir=/${ZK_HOME}/node-01/data dataLogDir=/${ZK_HOME}/node-01/logs clientPort=2181 server.1=zk-01:2881:3881 server.2=zk-02:2882:3882 server.3=zk-03:2883:3883 5. 在 dataDir=/${ZK_HOME}/data 下建立 myid 文件分別是配置中server.x中x的值 6. iptables中過濾暴露的端口 7. 啓動 /${ZK_HOME}/bin/zkServer.sh start 8. 偵聽 tail -500f /${ZK_HOME}/bin/zookeeper.out
ZK下載地址:http://apache.fayea.com/zookeeper/
ZK的介紹、場景、集羣安裝就到這裏,歡迎提問!