亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

分布式設計與開發(三)------高一致性服務ZooKeeper

2019-11-14 15:24:20
字體:
來源:轉載
供稿:網友

分布式環境中大多數服務是允許部分失敗,也允許數據不一致,但有些最基礎的服務是需要高可靠性,高一致性的,這些服務是其他分布式服務運轉的基礎,比如naming service、分布式lock等,這些分布式的基礎服務有以下要求:

  • 高可用性
  • 高一致性
  • 高性能

對于這種有些挑戰CAP原則 的服務該如何設計,是一個挑戰,也是一個不錯的研究課題,Apache的ZooKeeper也許給了我們一個不錯的答案。ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務, 它暴露了一個簡單的原語集,分布式應用程序可以基于它實現同步服務,配置維護和命名服務等。關于ZooKeeper更多信息可以參見 官方文檔

ZooKeeper的基本使用

搭一個分布式的ZooKeeper環境比較簡單,基本步驟如下:

1)在各服務器安裝 ZooKeeper

下載ZooKeeper后在各服務器上進行解壓即可

tar -xzf zookeeper-3.2.2.tar.gz

2)配置集群環境

分別各服務器的zookeeper安裝目錄下創建名為zoo.cfg的配置文件,內容填寫如下:

[xhtml] view plaincopy
  1. # The number of milliseconds of each tick  
  2. tickTime=2000  
  3. # The number of ticks that the initial  
  4. # synchronization phase can take  
  5. initLimit=10  
  6. # The number of ticks that can pass between  
  7. # sending a request and getting an acknowledgement  
  8. syncLimit=5  
  9. # the directory where the snapshot is stored.  
  10. dataDir=/home/admin/zookeeper-3.2.2/data  
  11. # the port at which the clients will connect  
  12. clientPort=2181  
  13. server.1=zoo1:2888:3888  
  14. server.2=zoo2:2888:3888  

 

其中zoo1和zoo2分別對應集群中各服務器的機器名或ip,server.1和server.2中1和2分別對應各服務器的zookeeper id,id的設置方法為在dataDir配置的目錄下創建名為myid的文件,并把id作為其文件內容即可,在本例中就分為設置為1和2。其他配置具體含 義可見官方文檔。

3)啟動集群環境

分別在各服務器下運行zookeeper啟動腳本

/home/admin/zookeeper-3.2.2/bin/zkServer.sh start

4)應用zookeeper

應用zookeeper可以在是shell中執行命令,也可以在java或c中調用程序接口。

在shell中執行命令,可運行以下命令:

bin/zkCli.sh -server 10.20.147.35:2181

其中 10.20.147.35為集群中任一臺機器的ip或機器名。執行后可進入zookeeper的操作面板,具體如何操作可見官方文檔

在java中通過調用程序接口來應用zookeeper較為復雜一點,需要了解watch和callback等概念,不過試驗最簡單的CURD倒不需要這些,只需要使用ZooKeeper這個類即可,具體測試代碼如下:

[java] view plaincopy
  1. public static void main(String[] args) {  
  2.     try {  
  3.         ZooKeeper zk = new ZooKeeper("10.20.147.35:2181", 30000, null);  
  4.         String name = zk.create("/company", "alibaba".getBytes(),  
  5.                 Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);  
  6.         Stat stat = new Stat();  
  7.         System.out.PRintln(new String(zk.getData(name, null, stat)));  
  8.         zk.setData(name, "taobao".getBytes(), stat.getVersion(), null, null);  
  9.         System.out.println(new String(zk.getData(name, null, stat)));  
  10.         stat = zk.exists(name, null);  
  11.         zk.delete(name, stat.getVersion(), null, null);  
  12.         System.out.println(new String(zk.getData(name, null, stat)));  
  13.     } catch (Exception e) {  
  14.         e.printStackTrace();  
  15.     }  
  16. }  

 

以上代碼比較簡單,查看一下zooKeeper的api doc就知道如何使用了

ZooKeeper的實現機理

ZooKeeper的實現機理是我看過的開源框架中最復雜的,它的解決是分布式環境中的一致性問題,這個場景也決定了其實現的復雜性??戳藘扇斓脑创a還是有些摸不著頭腦,有些超出了我的能力,不過通過看文檔和其他高人寫的文章大致清楚它的原理和基本結構。

1)ZooKeeper的基本原理

ZooKeeper是以Fast Paxos算法為基礎的,在前一篇 blog 中大致介紹了一下paxos,而沒有提到的是paxos存在活鎖的問題,也就是當有多個 proposer交錯提交時,有可能互相排斥導致沒有一個proposer能提交成功,而Fast Paxos作了一些優化,通過選舉產生一個leader,只有leader才能提交propose,具體算法可見Fast Paxos 。因此,要想弄得ZooKeeper首先得對Fast Paxos有所了解。

2)ZooKeeper的基本運轉流程

ZooKeeper主要存在以下兩個流程:

  • 選舉Leader
  • 同步數據

選舉Leader過程中算法有很多,但要達到的選舉標準是一致的:

  • Leader要具有最高的zxid 
  • 集群中大多數的機器得到響應并follow選出的Leader

同步數據這個流程是ZooKeeper的精髓所在,并且就是Fast Paxos算法的具體實現。一個牛人畫了一個ZooKeeper數據流動圖,比較直觀地描述了ZooKeeper是如何同步數據的。

以上兩個核心流程我暫時還不能悟透其中的精髓,這也和我還沒有完全理解Fast Paxos算法有關,有待后續深入學習

ZooKeeper的應用領域

Tim在blog中提到了Paxos所能應用的幾個主要場景,包括database replication、naming service、config配置管理、access control list等等,這也是ZooKeeper可以應用的幾個主要場景。此外, ZooKeeper官方文檔中提到了幾個更為基礎的分布式應用,這也算是ZooKeeper的妙用吧

1)分布式Barrier

Barrier是一種控制和協調多個任務觸發次序的機制,簡單說來就是搞個閘門把欲執行的任務給攔住,等所有任務都處于可以執行的狀態時,才放開閘門。它的機理可以見下圖所示:

在單機上JDK提供了CyclicBarrier這個類來實現這個機制,但在分布式環境中JDK就無能為力了。在分布式里實現Barrer需要高一致性做保障,因此 ZooKeeper可以派上用場,所采取的方案就是用一個Node作為Barrer的實體,需要被Barrer的任務通過調用 exists()檢測這個Node的存在,當需要打開Barrier的時候,刪掉這個Node,ZooKeeper的watch機制會通知到各個任務可以 開始執行。

2) 分布式 Queue

與 Barrier類似 分布式環境中 實現Queue也需要高一致性做保障, ZooKeeper提供了一個種簡單的方式, ZooKeeper通過一個Node來維護Queue的實體,用其children來存儲Queue的內容,并且 ZooKeeper的create方法中提供了順序遞增的模式,會自動地在name后面加上一個遞增的數字來插入新元素??梢杂闷?children來構建一個queue的數據結構,offer的時候使用create,take的時候按照children的順序刪除第一個即可。 ZooKeeper保障了各個server上數據是一致的,因此也就實現了一個 分布式 Queue。take和offer的實例代碼如下所示:

 

[java] view plaincopy
  1. /** 
  2.  * Removes the head of the queue and returns it, blocks until it succeeds. 
  3.  * @return The former head of the queue 
  4.  * @throws NoSuchElementException 
  5.  * @throws KeeperException 
  6.  * @throws InterruptedException 
  7.  */  
  8. public byte[] take() throws KeeperException, InterruptedException {  
  9.     TreeMap<Long,String> orderedChildren;  
  10.     // Same as for element.  Should refactor this.  
  11.     while(true){  
  12.         LatchChildWatcher childWatcher = new LatchChildWatcher();  
  13.         try{  
  14.             orderedChildren = orderedChildren(childWatcher);  
  15.         }catch(KeeperException.NoNodeException e){  
  16.             zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT);  
  17.             continue;  
  18.         }  
  19.         if(orderedChildren.size() == 0){  
  20.             childWatcher.await();  
  21.             continue;  
  22.         }  
  23.         for(String headNode : orderedChildren.values()){  
  24.             String path = dir +"/"+headNode;  
  25.             try{  
  26.                 byte[] data = zookeeper.getData(path, false, null);  
  27.                 zookeeper.delete(path, -1);  
  28.                 return data;  
  29.             }catch(KeeperException.NoNodeException e){  
  30.                 // Another client deleted the node first.  
  31.             }  
  32.         }  
  33.     }  
  34. }  
  35. /** 
  36.  * Inserts data into queue. 
  37.  * @param data 
  38.  * @return true if data was successfully added 
  39.  */  
  40. public boolean offer(byte[] data) throws KeeperException, InterruptedException{  
  41.     for(;;){  
  42.         try{  
  43.             zookeeper.create(dir+"/"+prefix, data, acl, CreateMode.PERSISTENT_SEQUENTIAL);  
  44.             return true;  
  45.         }catch(KeeperException.NoNodeException e){  
  46.             zookeeper.create(dir, new byte[0], acl, CreateMode.PERSISTENT);  
  47.         }  
  48.     }  
  49. }  

3)分布式lock

利用 ZooKeeper實現 分布式lock,主要是通過一個Node來代表一個Lock,當一個client去拿鎖的時候,會在這個Node下創建一個自增序列的 child,然后通過getChildren()方式來check創建的child是不是最靠前的,如果是則拿到鎖,否則就調用exist()來 check第二靠前的child,并加上watch來監視。當拿到鎖的child執行完后歸還鎖,歸還鎖僅僅需要刪除自己創建的child,這時 watch機制會通知到所有沒有拿到鎖的client,這些child就會根據前面所講的拿鎖規則來競爭鎖。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频丨精品|在线观看| 岛国av一区二区在线在线观看| 免费99精品国产自在在线| 欧美美女操人视频| 亚洲性日韩精品一区二区| 久久久久99精品久久久久| 亚洲国产精品高清久久久| 亚洲欧美国产高清va在线播| 国产精品一区二区3区| 97avcom| 日韩第一页在线| 日韩美女视频在线观看| 欧美中文在线观看| 日韩中文字幕在线看| 亚洲精品电影久久久| 亚洲国产精久久久久久| 亚洲福利视频专区| 日韩美女免费视频| 欧美在线视频观看免费网站| 久久久久久999| 浅井舞香一区二区| 国产小视频国产精品| 日韩av在线影院| 久久伊人免费视频| 欧美国产亚洲精品久久久8v| 久久久在线视频| 91视频免费网站| 91精品国产综合久久香蕉的用户体验| 欧美性生交xxxxx久久久| 久久久亚洲精品视频| 久久久久久综合网天天| 亚洲天堂av综合网| 欧美激情精品久久久久久| 国产精品影院在线观看| 欧美日韩国产成人在线| 成人高清视频观看www| 国产亚洲人成a一在线v站| 亚洲第一页中文字幕| 欧美大尺度电影在线观看| 97av视频在线| 91精品国产综合久久香蕉最新版| 久热精品视频在线| 欧美国产高跟鞋裸体秀xxxhd| 国产成人一区二区三区| 欧美日韩美女视频| 欧美激情中文网| 久久精品夜夜夜夜夜久久| 久久免费成人精品视频| 亚洲第一网中文字幕| 国产精品久久久久久久久久ktv| 欧美又大粗又爽又黄大片视频| 国产欧美日韩最新| 日韩精品一区二区三区第95| 欧美电影在线免费观看网站| 国产成人综合精品| 久久网福利资源网站| 国产精品一区二区三区久久| 欧美一级片久久久久久久| 欧美国产亚洲视频| 亚洲另类欧美自拍| 欧美精品久久久久久久免费观看| 日韩欧美成人网| 亚洲国产精品久久久久秋霞蜜臀| 日韩在线观看免费全集电视剧网站| 午夜精品一区二区三区视频免费看| 欧美xxxx做受欧美.88| 欧美精品精品精品精品免费| 国产精品视频xxx| 国产91对白在线播放| 97在线视频国产| 在线观看91久久久久久| 大荫蒂欧美视频另类xxxx| 久久综合久久88| 最近2019中文字幕一页二页| 成人福利免费观看| 国产综合视频在线观看| 国产成人精品亚洲精品| 成人精品久久久| 亚洲va久久久噜噜噜| 欧美大片网站在线观看| 一区二区亚洲欧洲国产日韩| 亚洲人成在线播放| 97视频在线观看亚洲| 欧美人在线观看| 狠狠躁夜夜躁人人爽天天天天97| 成人在线国产精品| 欧美最顶级的aⅴ艳星| 91精品在线观看视频| 成人国产精品色哟哟| 色综合色综合久久综合频道88| 国产成人午夜视频网址| 色综合久久88| 九九热视频这里只有精品| 国产日韩精品视频| 欧美专区在线播放| 欧美精品www在线观看| 怡红院精品视频| 欧美日韩国产二区| 亚洲视频免费一区| 国产成人中文字幕| 色99之美女主播在线视频| 98精品国产自产在线观看| 亚洲韩国欧洲国产日产av| 国产精品久久久久久搜索| 久久久久九九九九| 一本色道久久88亚洲综合88| 欧美高清在线观看| 国产精品日韩欧美综合| 正在播放国产一区| 色天天综合狠狠色| 欧美激情视频网| 午夜精品一区二区三区av| 91免费人成网站在线观看18| 国产日韩欧美影视| 亚洲成av人片在线观看香蕉| 中文字幕亚洲欧美一区二区三区| 亚洲成av人影院在线观看| 亚洲欧美日韩区| 91久久嫩草影院一区二区| 另类美女黄大片| 91av视频在线播放| 亚洲女人被黑人巨大进入| 久久深夜福利免费观看| 日韩精品亚洲元码| 亚洲欧美变态国产另类| 欧美成人精品三级在线观看| 久久影视电视剧免费网站| 性亚洲最疯狂xxxx高清| 国产女精品视频网站免费| 中文字幕欧美精品日韩中文字幕| 欧美激情一级二级| 亚洲自拍偷拍福利| 日韩高清免费在线| 91大神福利视频在线| 亚洲欧美一区二区三区情侣bbw| 亚洲综合在线播放| 亚洲精品国产美女| 91久久综合亚洲鲁鲁五月天| 欧亚精品在线观看| 国产精品6699| 久久久97精品| 国产精品久久久久久久久免费| 亚洲欧美在线磁力| 人人爽久久涩噜噜噜网站| 在线电影欧美日韩一区二区私密| 国产精品xxxxx| 国产情人节一区| 懂色aⅴ精品一区二区三区蜜月| 欧美成人合集magnet| 国产亚洲欧美另类中文| 美乳少妇欧美精品| 成人黄色av免费在线观看| 97国产suv精品一区二区62| 久久久亚洲国产天美传媒修理工| 中文字幕日韩综合av| 在线a欧美视频| 91国内在线视频| 国外日韩电影在线观看| 欧美日韩第一视频| 国产极品精品在线观看| 日韩欧美国产高清91| 欧美高清视频一区二区| 亚洲精品网站在线播放gif| 韩国美女主播一区|