欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何實(shí)現(xiàn)Zookeeper動(dòng)態(tài)更新服務(wù)器列表

如何實(shí)現(xiàn)Zookeeper動(dòng)態(tài)更新服務(wù)器列表,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的江口網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

zookeeper內(nèi)部就是一個(gè)集群,主節(jié)點(diǎn)是選舉出來的,外部看起來就像只有一臺(tái)一樣,保存的是一份狀態(tài)數(shù)據(jù)。 做分布式應(yīng)用協(xié)調(diào)的時(shí)候,可以降低開發(fā)難度。

具有高可用性,松耦合交互方式。

一、zookeeper的API接口

String create(String path, byte[] data, List<ACL> acl, CreateMode createMode) Stat exists(String path, boolean watch) void delete(String path, int version) List<String> getChildren(String path, boolean watch) List<String> getChildren(String path, boolean watch) Stat setData(String path, byte[] data, int version) byte[] getData(String path, boolean watch, Stat stat) void addAuthInfo(String scheme, byte[] auth) Stat setACL(String path, List<ACL> acl, int version) List<ACL> getACL(String path, Stat stat)

 zookeeper一般來說保管的數(shù)據(jù)不超過1M.主要是保存一些配置信息,主要特點(diǎn)是監(jiān)聽數(shù)據(jù)實(shí)時(shí)更新。

二、主要應(yīng)用:

1、集群管理:規(guī)定編號(hào)最小的為master,所以當(dāng)我們對(duì)SERVERS節(jié)點(diǎn)做監(jiān)控的時(shí)候,得到服務(wù)器列表,只要所有集群機(jī)器邏輯認(rèn)為最小編號(hào)節(jié)點(diǎn)為master,那么master就被選出,而這個(gè)master宕機(jī)的時(shí)候,相應(yīng)的znode會(huì)消失,然后新的服務(wù)器列表就被推送到客戶端,然后每個(gè)節(jié)點(diǎn)邏輯認(rèn)為最小編號(hào)節(jié)點(diǎn)為master,這樣就做到動(dòng)態(tài)master選舉。

2、配置的管理:在分布式應(yīng)用環(huán)境中很常見,例如同一個(gè)應(yīng)用系統(tǒng)需要多臺(tái) PC Server 運(yùn)行,但是它們運(yùn)行的應(yīng)用系統(tǒng)的某些配置項(xiàng)是相同的,如果要修改這些相同的配置項(xiàng),那么就必須同時(shí)修改每臺(tái)運(yùn)行這個(gè)應(yīng)用系統(tǒng)的 PC Server,這樣非常麻煩而且容易出錯(cuò)。 將配置信息保存在 Zookeeper 的某個(gè)目錄節(jié)點(diǎn)中,然后將所有需要修改的應(yīng)用機(jī)器監(jiān)控配置信息的狀態(tài),一旦配置信息發(fā)生變化,每臺(tái)應(yīng)用機(jī)器就會(huì)收到 Zookeeper 的通知,然后從 Zookeeper 獲取新的配置信息應(yīng)用到系統(tǒng)中。

3、共享鎖:在同一個(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)就行了。

4、隊(duì)列管理:Zookeeper 可以處理兩種類型的隊(duì)列:當(dāng)一個(gè)隊(duì)列的成員都聚齊時(shí),這個(gè)隊(duì)列才可用,否則一直等待所有成員到達(dá),這種是同步隊(duì)列;隊(duì)列按照 FIFO 方式進(jìn)行入隊(duì)和出隊(duì)操作,例如實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者模型

三、使用eclipse連接zookeeper

在eclipse中,我們可以導(dǎo)入需要的包,然后對(duì)節(jié)點(diǎn)進(jìn)行增刪改查操作。 當(dāng)連接的時(shí)候可以這樣,這里我是采用了3臺(tái)zookeeper來進(jìn)行操作的。ubuntu1,2,3都分別是主機(jī)名

ZooKeeper zk = null; @Before public void init() throws Exception{ 
zk = new ZooKeeper("ubuntu2:2181,ubuntu1:2181,ubuntu3:2181", 5000, new Watcher() { 
//監(jiān)聽事件發(fā)生時(shí)的回調(diào)方法 
@Override public void process(WatchedEvent event) { 
System.out.println(event.getPath()); System.out.println(event.getType());
 } }); }

創(chuàng)建節(jié)點(diǎn): 這里我是采用創(chuàng)建一個(gè)永久節(jié)點(diǎn),在zookeeper節(jié)點(diǎn)中有臨時(shí)節(jié)點(diǎn)和永久節(jié)點(diǎn)之分。在跟目錄下創(chuàng)建一個(gè)eclipse節(jié)點(diǎn),內(nèi)容的編碼格式是utf-8,Ids是指權(quán)限控制,我這里采用的是開放ACL權(quán)限控制。最后需要把流關(guān)閉。

@Test public void testZkNode() throws Exception { String path = zk.create("/eclipse", "指令匯科技".getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println("創(chuàng)建了一個(gè)永久節(jié)點(diǎn): " + path); zk.close(); }

然后是注冊(cè)監(jiān)聽器,畢竟zookeeper有一個(gè)很重要的功能就是是用來監(jiān)聽整個(gè)服務(wù)的狀態(tài)。

@Test public void testGet() throws Exception { 
//監(jiān)聽器的注冊(cè)只能生效一次byte[] data = zk.getData("/eclipse", true, new Stat()); 
System.out.println(new String(data,"utf-8")); Thread.sleep(Long.MAX_VALUE); }

在main方法中調(diào)用執(zhí)行。

@Test public void testSet() throws UnsupportedEncodingException, KeeperException, InterruptedException{ 
zk.setData("/eclipse", "誰是英雄".getBytes("utf-8"), -1); 
zk.close(); }

四、動(dòng)態(tài)服務(wù)器

因?yàn)槲抑饕窒淼氖侨绾卧诳蛻舳松蟿?dòng)態(tài)的監(jiān)聽服務(wù)器的上線和離線,所以我們先來寫一個(gè)服務(wù)器的進(jìn)程。

首先我們需要把后面需要的節(jié)點(diǎn)信息定義一下,先去zookeeper的客戶端上面運(yùn)行一下,創(chuàng)建一個(gè)grpnode節(jié)點(diǎn),以便我們的后續(xù)操作。

private ZooKeeper zk; private String groupNode = "grpnode"; private String subNode = "sub"; 
// 向zookeeper注冊(cè)信息public void connectZK(String name) throws KeeperException, InterruptedException, IOException { zk = new ZooKeeper("ubuntu2:2181,ubuntu1:2181,ubuntu3:2181", 5000, new Watcher() { //監(jiān)聽事件發(fā)生時(shí)的回調(diào)方法 @Override public void process(WatchedEvent event) { } }); String path = zk.create("/" + groupNode + "/" + subNode, name.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); System.out.println("服務(wù)器上線,創(chuàng)建了一個(gè)子節(jié)點(diǎn): " + path); }

接下來就是zookeeper默認(rèn)的業(yè)務(wù)邏輯的處理,最后在主方法中調(diào)用。當(dāng)然也可以把這個(gè)打成一個(gè)jar包放到hadoop上面去運(yùn)行。

// 業(yè)務(wù)處理邏輯public void handle() throws Exception { Thread.sleep(Long.MAX_VALUE); } public static void main(String[] args) throws Exception { if(args.length==0){ System.err.println("參數(shù)個(gè)數(shù)不對(duì),請(qǐng)附加服務(wù)器名作為參數(shù)來啟動(dòng)....."); System.exit(1); } // 去向zookeeper注冊(cè)本服務(wù)器信息AppServer server = new AppServer(); server.connectZK(args[0]); server.handle(); }

五、動(dòng)態(tài)客戶端

服務(wù)器寫好之后,我們就需要一個(gè)客戶端來監(jiān)聽這個(gè)服務(wù)器的上下線操作了。同樣使用一個(gè)zookeeper的監(jiān)聽回調(diào)方法。一旦服務(wù)器發(fā)生變化,這里就可以動(dòng)態(tài)監(jiān)聽到。主要是監(jiān)聽父子節(jié)點(diǎn)的變化情況。

private  volatile   List<String> servers; private ZooKeeper zk; //使用zk的監(jiān)聽器功能觸發(fā)服務(wù)器更新的動(dòng)作public void connectZK() throws IOException, KeeperException, InterruptedException{ zk = new ZooKeeper("ubuntu2:2181,ubuntu1:2181,ubuntu3:2181", 5000, new Watcher() { //監(jiān)聽事件發(fā)生時(shí)的回調(diào)方法 @Override public void process(WatchedEvent event) { if("/grpnode".equals(event.getPath()) && event.getType()==EventType.NodeChildrenChanged ){ //觸發(fā)更新服務(wù)器列表的動(dòng)作try { updateServerList(); } catch (Exception e) { e.printStackTrace(); } } } }); updateServerList(); }

動(dòng)態(tài)獲取服務(wù)器列表,這里主要就是監(jiān)聽父子節(jié)點(diǎn)的變化。

//動(dòng)態(tài)獲取服務(wù)器列表public void updateServerList() throws KeeperException, InterruptedException, UnsupportedEncodingException{ ArrayList<String>  serverList=new ArrayList<String>(); //監(jiān)聽子節(jié)點(diǎn),并且對(duì)父節(jié)點(diǎn)注冊(cè)監(jiān)聽器List<String>  childer=zk.getChildren("/grpnode", true); //遍歷子節(jié)點(diǎn)for(String child:childer){ byte[] data=zk.getData("/grpnode/"+child,false, new Stat()); String server=new String(data,"utf-8"); //將獲取到的服務(wù)器名稱存入list serverList.add(server); } //把暫存的list放到全局的list中servers=serverList; System.out.println("最新的在線服務(wù)器是:"+serverList); }

最后就是我們最熟悉的main方法了

//客戶端的業(yè)務(wù)功能public void handle() throws InterruptedException{ Thread.sleep(Long.MAX_VALUE); } public static void main(String[] args) throws IOException, InterruptedException, KeeperException{ AppClient client=new AppClient(); client.connectZK(); client.handle(); }Zookeeper 作為 Hadoop 項(xiàng)目中的一個(gè)子項(xiàng)目,是 Hadoop 集群管理的一個(gè)必不可少的模塊,它主要用來控制集群中的數(shù)據(jù),如它管理 Hadoop 集群中的 NameNode,還有 Hbase 中 Master Election、Server 之間狀態(tài)同步等。 Zoopkeeper 提供了一套很好的分布式集群管理的機(jī)制,就是它這種基于層次型的目錄樹的數(shù)據(jù)結(jié)構(gòu),并對(duì)樹中的節(jié)點(diǎn)進(jìn)行有效管理,從而可以設(shè)計(jì)出多種多樣的分布式的數(shù)據(jù)管理模型

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

網(wǎng)頁題目:如何實(shí)現(xiàn)Zookeeper動(dòng)態(tài)更新服務(wù)器列表
當(dāng)前地址:http://chinadenli.net/article0/gpceio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站排名網(wǎng)站導(dǎo)航、關(guān)鍵詞優(yōu)化企業(yè)網(wǎng)站制作、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
亚洲av专区在线观看| 久久精品国产在热亚洲| 人妻巨大乳一二三区麻豆| 国产又粗又猛又大爽又黄| 国产乱久久亚洲国产精品| 亚洲一区二区三区在线免费| 国产专区亚洲专区久久| 99视频精品免费视频播放| 亚洲午夜精品视频在线| 国产成人精品国产亚洲欧洲 | 国产美女精品人人做人人爽| 亚洲精品高清国产一线久久| 五月婷婷欧美中文字幕| 欧美中文字幕日韩精品| 一级片黄色一区二区三区| 99国产精品国产精品九九| 国产又粗又猛又大爽又黄同志 | 国产精品激情在线观看| 五月激情五月天综合网| 成在线人免费视频一区二区| 国产成人国产精品国产三级 | 国产大屁股喷水在线观看视频 | 丝袜视频日本成人午夜视频| 欧美午夜一级特黄大片| 亚洲国产欧美久久精品| 日本免费一区二区三女| 久久国产精品热爱视频| 视频一区二区 国产精品| 国产内射一级一片内射高清视频| 亚洲国产色婷婷久久精品| 东京热男人的天堂久久综合| 麻豆亚州无矿码专区视频| 亚洲第一香蕉视频在线| 婷婷激情五月天丁香社区| 人妻乱近亲奸中文字幕| 麻豆一区二区三区精品视频| 国产成人精品一区二区在线看| 少妇成人精品一区二区| 欧美午夜性刺激在线观看| 精品香蕉国产一区二区三区| 久久99亚洲小姐精品综合|