zookeeper 入門講解實例 轉

轉 ?http://www.blogjava.net/BucketLi/archive/2010/12/21/341268.html
zookeeper使用和原理探究(一)

zookeeper介紹
zookeeper是一個為分布式應用提供一致性服務的軟件,它是開源的Hadoop項目中的一個子項目,并且根據google發表的<The Chubby lock service for loosely-coupled distributed systems>論文來實現的,接下來我們首先來安裝使用下這個軟件,然后再來探索下其中比較重要一致性算法。??

zookeeper安裝和使用
zookeeper的安裝基本上可以按照?http://hadoop.apache.org/zookeeper/docs/current/ zookeeperStarted.html?這個頁面上的步驟完成安裝,這里主要介紹下部署一個集群的步驟,因為這個官方頁面似乎講得并不是非常詳細(Running Replicated Zookeeper)。

由于手頭機器不足,所以在一臺機器上部署了3個server,如果你手頭也比較緊,也可以這么做。那么我建了3個文件夾,如下
server1?? server2?? server3

然后每個文件夾里面解壓一個zookeeper的下載包,并且還建了幾個文件夾,總體結構如下,最后那個是下載過來壓縮包的解壓文件
data?dataLog?logs?zookeeper-3.3.2

那么首先進入data目錄,創建一個myid的文件,里面寫入一個數字,比如我這個是server1,那么就寫一個1,server2對應myid文件就寫入2,server3對應myid文件就寫個3

然后進入zookeeper-3.3.2/conf目錄,那么如果是剛下過來,會有3個文件,configuration.xml, log4j.properties,zoo_sample.cfg,這3個文件我們首先要做的就是在這個目錄創建一個zoo.cfg的配置文件,當然你可以把zoo_sample.cfg文件改成zoo.cfg,配置的內容如下所示:?
tickTime=2000
initLimit=5
syncLimit=2
dataDir=xxxx/zookeeper/server1/data
dataLogDir=xxx/zookeeper/server1/dataLog
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

標 紅的幾個配置應該官網講得很清楚了,只是需要注意的是clientPort這個端口如果你是在1臺機器上部署多個server,那么每臺機器都要不同的 clientPort,比如我server1是2181,server2是2182,server3是2183,dataDir和dataLogDir也 需要區分下。?

最后幾行唯一需要注意的地方就是?server.X?這個數字就是對應?data/myid中的數字。你在3個 server的myid文件中分別寫入了1,2,3,那么每個server中的zoo.cfg都配server.1,server.2,server.3 就OK了。因為在同一臺機器上,后面連著的2個端口3個server都不要一樣,否則端口沖突,其中第一個端口用來集群成員的信息交換,第二個端口是在 leader掛掉時專門用來進行選舉leader所用。

進入zookeeper-3.3.2/bin?目錄中,./zkServer.sh start啟 動一個server,這時會報大量錯誤?其實沒什么關系,因為現在集群只起了1臺server,zookeeper服務器端起來會根據zoo.cfg的服 務器列表發起選舉leader的請求,因為連不上其他機器而報錯,那么當我們起第二個zookeeper實例后,leader將會被選出,從而一致性服務 開始可以使用,這是因為3臺機器只要有2臺可用就可以選出leader并且對外提供服務(2n+1臺機器,可以容n臺機器掛掉)。

接下來就可以使用了,我們可以先通過?zookeeper自帶的客戶端交互程序來簡單感受下zookeeper到底做一些什么事情。進入zookeeper-3.3.2/bin(3個server中任意一個)下,./zkCli.sh?–server?127.0.0.1:2182,我連的是開著2182端口的機器。

那么,首先我們隨便打個命令,因為zookeeper不認識,他會給出命令的help,如下圖?

?
???
ls(查看當前節點數據),
ls2(查看當前節點數據并能看到更新次數等數據) ,
create(創建一個節點) ,
get(得到一個節點,包含數據和更新次數等數據),
set(修改節點)
delete(刪除一個節點)

通過上述命令實踐,我們可以發現,zookeeper使用了一個類似文件系統的樹結構,數據可以掛在某個節點上,可以對這個節點進行刪改。另外我們還發現,當改動一個節點的時候,集群中活著的機器都會更新到一致的數據。?

zookeeper的數據模型
在簡單使用了zookeeper之后,我們發現其數據模型有些像操作系統的文件結構,結構如下圖所示



(1)?????每個節點在zookeeper中叫做znode,并且其有一個唯一的路徑標識,如/SERVER2節點的標識就為/APP3/SERVER2
(2)?????Znode可以有子znode,并且znode里可以存數據,但是EPHEMERAL類型的節點不能有子節點
(3)?????Znode中的數據可以有多個版本,比如某一個路徑下存有多個數據版本,那么查詢這個路徑下的數據就需要帶上版本。
(4)?????znode?可以是臨時節點,一旦創建這個?znode?的客戶端與服務器失去聯系,這個?znode?也將自動刪除,Zookeeper?的客戶端和服務器通信采用長連接方式,每個客戶端和? 服務器通過心跳來保持連接,這個連接狀態稱為?session,如果?znode?是臨時節點,這個?session?失效,znode?也就刪除了
(5)?????znode?的目錄名可以自動編號,如?App1?已經存在,再創建的話,將會自動命名為?App2?
(6)?????znode?可以被監控,包括這個目錄節點中存儲的數據的修改,子節點目錄的變化等,一旦變化可以通知設置監控的客戶端,這個功能是zookeeper對于應用最重要的特性,通過這個特性可以實現的功能包括配置的集中管理,集群管理,分布式鎖等等。??

通過java代碼使用zookeeper?
Zookeeper的使用主要是通過創建其jar包下的Zookeeper實例,并且調用其接口方法進行的,主要的操作就是對znode的增刪改操作,監聽znode的變化以及處理。?

以下為主要的API使用和解釋

//創建一個Zookeeper實例,第一個參數為目標服務器地址和端口,第二個參數為Session超時時間,第三個為節點變化時的回調方法
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 500000,new Watcher() {// 監控所有被觸發的事件public void process(WatchedEvent event) {//dosomething
           }});
//創建一個節點root,數據是mydata,不進行ACL權限控制,節點為永久性的(即客戶端shutdown了也不會消失)
zk.create("/root", "mydata".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//在root下面創建一個childone znode,數據為childone,不進行ACL權限控制,節點為永久性的
zk.create("/root/childone","childone".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);//取得/root節點下的子節點名稱,返回List<String>
zk.getChildren("/root",true);//取得/root/childone節點下的數據,返回byte[]
zk.getData("/root/childone", true, null);//修改節點/root/childone下的數據,第三個參數為版本,如果是-1,那會無視被修改的數據版本,直接改掉
zk.setData("/root/childone","childonemodify".getBytes(), -1);//刪除/root/childone這個節點,第二個參數為版本,-1的話直接刪除,無視版本
zk.delete("/root/childone", -1);//關閉session
zk.close();
?

Zookeeper的主流應用場景實現思路(除去官方示例)?

(1)
配置管理
集中式的配置管理在應用集群中是非常常見的,一般商業公司內部都會實現一套集中的配置管理中心,應對不同的應用集群對于共享各自配置的需求,并且在配置變更時能夠通知到集群中的每一個機器。

Zookeeper很容易實現這種集中式的配置管理,比如將APP1的所有配置配置到/APP1 znode下,APP1所有機器一啟動就對/APP1這個節點進行監控(zk.exist("/APP1",true)),并且實現回調方法Watcher,那么在zookeeper上/APP1 znode節點下數據發生變化的時候,每個機器都會收到通知,Watcher方法將會被執行,那么應用再取下數據即可(zk.getData("/APP1",false,null));



以上這個例子只是簡單的粗顆粒度配置監控,細顆粒度的數據可以進行分層級監控,這一切都是可以設計和控制的。?????
(2)集群管理?
應用集群中,我們常常需要讓每一個機器知道集群中(或依賴的其他某一個集群)哪些機器是活著的,并且在集群機器因為宕機,網絡斷鏈等原因能夠不在人工介入的情況下迅速通知到每一個機器。

Zookeeper同樣很容易實現這個功能,比如我在zookeeper服務器端有一個znode叫/APP1SERVERS,那么集群中每一個機器啟動的時候都去這個節點下創建一個EPHEMERAL類型的節點,比如server1創建/APP1SERVERS/SERVER1(可以使用ip,保證不重復),server2創建/APP1SERVERS/SERVER2,然后SERVER1和SERVER2都watch /APP1SERVERS這個父節點,那么也就是這個父節點下數據或者子節點變化都會通知對該節點進行watch的客戶端。因為EPHEMERAL類型節點有一個很重要的特性,就是客戶端和服務器端連接斷掉或者session過期就會使節點消失,那么在某一個機器掛掉或者斷鏈的時候,其對應的節點就會消失,然后集群中所有對/APP1SERVERS進行watch的客戶端都會收到通知,然后取得最新列表即可。

另外有一個應用場景就是集群選master,一旦master掛掉能夠馬上能從slave中選出一個master,實現步驟和前者一樣,只是機器在啟動的時候在APP1SERVERS創建的節點類型變為EPHEMERAL_SEQUENTIAL類型,這樣每個節點會自動被編號,例如??????????

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);// 創建一個子目錄節點
zk.create("/testRootPath/testChildPath4","4".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(zk.getChildren("/testRootPath", false));
?打印結果:[testChildPath10000000000, testChildPath20000000001, testChildPath40000000003, testChildPath30000000002]
zk.create("/testRootPath", "testRootData".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);// 創建一個子目錄節點
zk.create("/testRootPath/testChildPath1","1".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);zk.create("/testRootPath/testChildPath2","2".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);zk.create("/testRootPath/testChildPath3","3".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);// 創建一個子目錄節點
zk.create("/testRootPath/testChildPath4","4".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);System.out.println(zk.getChildren("/testRootPath", false));
打印結果:[testChildPath2, testChildPath1, testChildPath4, testChildPath3]


我們默認規定編號最小的為master,所以當我們對/APP1SERVERS節點做監控的時候,得到服務器列表,只要所有集群機器邏輯認為最小編號節點為master,那么master就被選出,而這個master宕機的時候,相應的znode會消失,然后新的服務器列表就被推送到客戶端,然后每個節點邏輯認為最小編號節點為master,這樣就做到動態master選舉。


總結?

我們初步使用了一下zookeeper并且嘗試著描述了幾種應用場景的具體實現思路,接下來的文章,我們會嘗試著去探究一下zookeeper的高可用性與leaderElection算法。

參考:http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/

??????http://hadoop.apache.org/zookeeper/docs/current/

? ? ??http://rdc.taobao.com/team/jm/archives/448

轉載于:https://www.cnblogs.com/zhengah/p/4971550.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286712.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286712.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286712.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小程序仿微信發現頁 03《 程序員變現指南之 微信QQ 小程序 真的零基礎開發寶典》

本系列教程是針對粉絲的變現教程&#xff0c;還不是粉絲的可以關注我并且到社區&#xff1a;https://bbs.csdn.net/topics/603436232 進行打卡&#xff0c;不是老粉的也可以獲取最終的技術變現學習&#xff0c;最終還有詳細的變現教程等你來。 前言 《 程序員變現指南之 微信…

Silverlight與WCF之間的通信(4)silverlight以net.tcp方式調用console上寄宿的wcf服務

&#xff08;由于最近是針對一個demo進行的研究&#xff0c;在之前公開過代碼結構&#xff0c;這里只是對需要改動的地方加以說明&#xff09; WCF4.0使得編寫wcf服務不再那么復雜&#xff0c;去掉了許多的配置信息&#xff0c;客戶端只需要一個服務地址&#xff0c;便可在系統…

【空間數據庫】空間數據庫引擎(Spatial DataBase Engine)ArcSDE詳解

一、空間數據庫引擎概述 空間數據庫引擎的概念最早由ESRI提出。ESRI對SDE的定義是:從空間數據管理的角度看,SDE是一個連續的空間數據模型,借助這一模型,我們可以將空間數據加人到關系數據庫系統( RDBMS)中去。 SDE可以理解為基于特定的空間數據模型,在特定的數據存儲、數…

Git之提示There is no tracking information for the current branch.

1 問題 我項目比如是0.2分支&#xff0c;我需要修改項目的git地址&#xff0c;然后再pull新的代碼 1&#xff09;修改github地址&#xff08;讀者可以忽略&#xff09; 1.git remote 查看所有遠程倉庫 2.git remote rm origin 刪除之前的版本庫 3.git remote add origin htt…

Maui學習之路(一)--Windows窗體設置

Maui的學習之路作為 Maui的先行者&#xff0c;我有話要說&#xff0c;微軟你為了讓我成為牛 B 的程序員真的是煞費苦心&#xff0c;你一定是覺得我不夠牛逼所以針對我&#xff0c;存心想氣死我。好了廢話不多說&#xff0c;Maui現在也算是正式發布了&#xff0c;我有點想用它來…

Git 常用命令大全

Git 是一個很強大的分布式版本控制系統。它不但適用于管理大型開源軟件的源代碼&#xff0c;管理私人的文檔和源代碼也有很多優勢。 Git常用操作命令&#xff1a; 1) 遠程倉庫相關命令 檢出倉庫&#xff1a;$ git clone git://github.com/jquery/jquery.git 查看遠程倉庫&#…

為什么本地使用js或jquery操作cookie在谷歌瀏覽器chrome中不生效?

2019獨角獸企業重金招聘Python工程師標準>>> 為什么本地使用js或jquery操作cookie在谷歌瀏覽器chrome中不生效&#xff1f;新手學習js或jquery時&#xff0c;一般是在本地調試&#xff08;前端學習一般用不到服務器端&#xff09;&#xff0c;當學習到cookie一節時&…

全解小程序猜數字游戲 04《 程序員變現指南之 微信QQ 小程序 真的零基礎開發寶典》

本系列教程是針對粉絲的變現教程&#xff0c;還不是粉絲的可以關注我并且到社區&#xff1a;https://bbs.csdn.net/topics/603436232 進行打卡&#xff0c;不是老粉的也可以獲取最終的技術變現學習&#xff0c;最終還有詳細的變現教程等你來。 社區有獎勵 下面有投票 本文也…

Android之解決主頁面Activity監聽fragment退出問題(由NavHostFragment和RxFragment一起管理fragment)

1、 問題 app里面目前主頁面是一個activity,然后部分fragment是由NavHostFragment管理,當splash、login等頁面也放在navigation時,按手機的返回鍵這些頁面只能一頁頁回退,因為設置了 app:defaultNavHost="true" 并不能在某個頁面例如splash、login按返回鍵時退…

linux之ps命令詳解

linux中ps(process status) 命令是LINUX下最常用的也是非常強大的進程查看命令&#xff0c;運用該命令可以確定有哪些進程正在運行和運行地狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多地資源等等。 ps命令最常用的是用于監控后臺進程的工作情況。 Linux 查看進程p…

【空間數據庫】傳統數據模型(層次、網狀、關系)和空間數據模型詳解

數據模型是指數據庫的組織形式,它決定了數據庫中數據之間聯系的表達方式,即把在計算機中表示客觀事物及其聯系的數據及結構稱為數據模型。本文詳細講述傳統三大數據模型和空間數據模型。 一、數據模型概述 數據模型是指數據庫的組織形式,它決定了數據庫中數據之間聯系的表…

聊聊 C# 中的多態底層 (虛方法調用) 是怎么玩的

最近在看 C 的虛方法調用實現原理&#xff0c;大概就是說在 class 的首位置存放著一個指向 vtable array 指針數組 的指針&#xff0c;而 vtable array 中的每一個指針元素指向的就是各自的 虛方法&#xff0c;實現方式很有意思&#xff0c;哈哈&#xff0c;現在我很好奇 C# 中…

sublime text 3 安裝、添加命令行啟動、漢化、注冊碼

1. 安裝sublime&#xff1a; 下載&#xff1a;http://www.sublimetext.com/3 添加命令行啟動&#xff1a;設置環境變量->計算機->右鍵屬性->高級系統設置->環境變量->系統變量->Path->編輯&#xff0c;加入";安裝路徑"(如&#xff1a;;D:\Progr…

MVC基礎知識-View

public ActionResult Index() {ViewBag.Message "Modify this template to jump-start your ASP.NET MVC application.";//展現到視圖中數據//~/Views/Home/Index.cshtmlreturn View(); //展現指定的視圖&#xff0c;當沒有指定視圖名稱時&#xff0c;默認是指向根目…

Android之設置當前app為默認瀏覽器研究

1 需求 把當前app設置為默認瀏覽器 2 主要思路 分析競品,我們主要通過2種方式設置app為默認瀏覽器 直接跳 手機“設置默認應用”界面來讓用戶選擇 默認瀏覽器為哪個app打開一個鏈接,拉起手機所有瀏覽器,讓用戶去選擇哪個瀏覽器,并且只有點擊“始終”才會生效,僅僅點擊“…

Linux下的用戶和組

2019獨角獸企業重金招聘Python工程師標準>>> 用戶和組 GNU/Linux 通過用戶和用戶組實現訪問控制 —— 包括對文件訪問、設備使用的控制。Linux 默認的訪問控制機制相對簡單直接&#xff0c;不過還有一些更加高級的機制&#xff0c;包括 ACL 和 LDAP Authentication.…

漫畫C語言 做個聊天軟件你不懂也得懂

學完C語言做不出東西&#xff1f;不存在的&#xff0c;咱們做一個最“隱私”的聊天器&#xff0c;就倆人&#xff0c;你和我。咱們聊天的信息你知我知沒別人知。 對了&#xff0c;本文評論區點贊、收藏抽獎。 社區也有抽獎&#xff0c;本周社區抽獎帖子 &#xff1a;https://b…

【Microstation】第一章:Microstation三維模型構建概述

MicroStation 是國際上和AutoCAD齊名的二維和三維CAD設計軟件&#xff0c;第一個版本由Bentley兄弟在1986年開發完成。其專用格式是DGN&#xff0c;并兼容AutoCAD的DWG/DXF等格式。 MicroStation是Bentley 工程軟件系統有限公司在建筑、土木工程、交通運輸、加工工廠、離散制造…

libgdx游戲引擎開發筆記(十)SuperJumper游戲例子的講解(篇四)---- 主游戲界面內部框架編寫...

上一講&#xff0c;我們已經實現了點擊play進入游戲界面但僅僅是個黑屏 今天&#xff0c;我們就試著編寫代碼讓它出現游戲的一些簡單場景。還是在上一講的代碼基礎上&#xff0c;我們創建兩個類&#xff1a;World 和 WorldRenderer 1.Word類&#xff1a; 12345678910111213141…

看看《System.CommandLine》

記得之前出過幾篇.net tool工具的文章&#xff0c;當時的做法是所有工具的語法分析全部自己解釋&#xff0c;自己執行&#xff0c;語法的解釋占了大部分時間&#xff0c;反而工具的功能被弱化了。其實微軟有一個CommandLine框架在緩慢的發展著&#xff0c;至今都沒有正式發布&a…