zookeeper是JAVA
① zookeeper是什麼語言寫的
本文是Jason Wilder對於常見的服務發現項目 Zookeeper , Doozer , Etcd 所寫的一篇博客,其原文地址如下: Open-Source Service Discovery 。
服務發現是大多數分布式系統以及面向服務架構(SOA)的一個核心組成部分。這個難題,簡單來說,可以認為是:當一項服務存在於多個主機節點上時,client端如何決策獲取相應正確的IP和port。
在傳統情況下,當出現服務存在於多個主機節點上時,都會使用靜態配置的方法來實現服務信息的注冊。但是當大型系統中,需要部署更多服務的時候,事情就顯得復雜得多。在一個實時的系統中,由於自動或者人工的服務擴展,或者服務的新添加部署,還有主機的宕機或者被替換,服務的location信息可能會很頻繁的變化。
在這樣的場景下,為了避免不必要的服務中斷,動態的服務注冊和發現就顯得尤為重要。
關於服務發現的話題,已經很多次被人所提及,而且也的確不斷的在發展。現在,筆者介紹一下該領域內一些open-source或者被經常被世人廣泛討論的解決方案,嘗試理解它們到底是如何工作的。特別的是,我們會較為專注於每一個解決方案的一致性演算法,到底是強一致性,還是弱一致性;運行時依賴;client的集成選擇;以後最後這些特性的折中情況。
本文首先從幾個強一致性的項目於開始,比如Zookeeper,Doozer,Etcd,這些項目主要用於服務間的協調,同時又可用於服務的注冊。
隨後,本文將討論一些在服務注冊以及發現方面比較有意思的項目,比如:Airbnb的SmartStack,Netflix的Eureka,Bitly的NSQ,Serf,Spotify and DNS,最後是SkyDNS。
問題陳述
在定位服務的時候,其實會有兩個方面的問題:服務注冊(Service Registration)和服務發現(Service Discovery)。
服務注冊—— 一個服務將其位置信息在中心注冊節點注冊的過程。該服務一般會將它的主機IP地址以及埠號進行注冊,有時也會有服務訪問的認證信息,使用協議,版本號,以及關於環境的一些細節信息。
服務發現—— client端的應用實例查詢中心注冊節點以獲知服務位置的過程。
每一個服務的服務注冊以及服務發現,都需要考慮一些關於開發以及運營方面的問題:
監控—— 當一個已注冊完畢的服務失效的時候,如何處理。一些情況下,在一個設定的超時定時(timeout)後,該服務立即被一個其他的進程在中心注冊節點處注銷。這種情況下,服務通常需要執行一個心跳機制,來確保自身的存活狀態;而客戶端必然需要能夠可靠處理失效的服務。
負載均衡—— 如果多個相同地位的服務都注冊完畢,如何在這些服務之間均衡所有client的請求負載?如果有一個master節點的話,是否可以正確處理client訪問的服務的位置。
集成方式—— 信息注冊節點是否需要提供一些語言綁定的支持,比如說,只支持java?集成的過程是否需要將注冊過程以及發現過程的代碼嵌入到你的應用程序中,或者使用一個類似於集成助手的進程?
運行時依賴—— 是否需要JVM,ruby或者其他在你的環境中並不兼容的運行時?
可用性考慮—— 如果系統失去一個節點的話,是否還能正常工作?系統是否可以實時更新或升級,而不造成任何系統的癱瘓?既然集群的信息注冊節點是架構中的中心部分,那該模塊是否會存在單點故障問題?
強一致性的Registries
首先介紹的三個服務注冊系統都採用了強一致性協議,實際上為達到通用的效果,使用了一致性的數據存儲。盡管我們把它們看作服務的注冊系統,其實它們還可以用於協調服務來協助leader選舉,以及在一個分布式clients的集合中做centralized locking。
Zookeeper
Zookeeper是一個集中式的服務,該服務可以維護服務配置信息,命名空間,提供分布式的同步,以及提供組化服務。Zookeeper是由Java語言實現,實現了強一致性(CP),並且是使用 Zab協議 在ensemble集群之間協調服務信息的變化。
Zookeeper在ensemble集群中運行3個,5個或者7個成員。眾多client端為了可以訪問ensemble,需要使用綁定特定的語言。這種訪問形式被顯性的嵌入到了client的應用實例以及服務中。
服務注冊的實現主要是通過命令空間(namespace)下的 ephemeral nodes 。ephemeral nodes只有在client建立連接後才存在。當client所在節點啟動之後,該client端會使用一個後台進程獲取client的位置信息,並完成自身的注冊。如果該client失效或者失去連接的時候,該ephemeral node就從樹中消息。
服務發現是通過列舉以及查看具體服務的命名空間來完成的。Client端收到目前所有注冊服務的信息,無論一個服務是否不可用或者系統新添加了一個同類的服務。Client端同時也需要自行處理所有的負載均衡工作,以及服務的失效工作。
Zookeeper的API用起來可能並沒有那麼方便,因為語言的綁定之間可能會造成一些細小的差異。如果使用的是基於JVM的語言的話, Curator Service Discovery Extension 可能會對你有幫助。
由於Zookeeper是一個CP強一致性的系統,因此當網路分區(Partition)出故障的時候,你的部分系統可能將出出現不能注冊的情況,也可能出現不能找到已存在的注冊信息,即使它們可能在Partition出現期間仍然正常工作。特殊的是,在任何一個non-quorum端,任何讀寫都會返回一個錯誤信息。
Doozer
Doozer是一個一致的分布式數據存儲系統,Go語言實現,通過 Paxos演算法 來實現共識的強一致性系統。這個項目開展了數年之後,停滯了一段時間,而且現在也關閉了一些fork數,使得fork數降至160 。.不幸的是,現在很難知道該項目的實際發展狀態,以及它是否適合使用於生產環境。
Doozer在集群中運行3,5或者7個節點。和Zookeeper類似,Client端為了訪問集群,需要在自身的應用或者服務中使用特殊的語言綁定。
Doozer的服務注冊就沒有Zookeeper這么直接,因為Doozer沒有那些ephemeral node的概念。一個服務可以在一條路徑下注冊自己,如果該服務不可用的話,它也不會自動地被移除。
現有很多種方式來解決這樣的問題。一個選擇是給注冊進程添加一個時間戳和心跳機制,隨後在服務發現進程中處理那些超時的路徑,也就是注冊的服務信息,當然也可以通過另外一個清理進程來實現。
服務發現和Zookeeper很類似,Doozer可以羅列出指定路徑下的所有入口,隨後可以等待該路徑下的任意改動。如果你在注冊期間使用一個時間戳和心跳,你就可以在服務發現期間忽略或者刪除任何過期的入口,也就是服務信息。
和Zookeeper一樣,Doozer是一個CP強一致性系統,當發生網路分區故障時,會導致同樣的後果。
Etcd
Etcd 是一個高可用的K-V存儲系統,主要應用於共享配置、服務發現等場景。Etcd可以說是被Zookeeper和Doozer催生而出。整個系統使用Go語言實現,使用Raft演算法來實現選舉一致,同時又具有一個基於HTTP+JSON的API。
Etcd,和Doozer和Zookeeper相似,通常在集群中運行3,5或者7個節點。client端可以使用一種特定的語言進行綁定,同時也可以通過使用HTTP客戶端自行實現一種。
服務注冊環節主要依賴於使用一個key TTL來確保key的可用性,該key TTL會和服務端的心跳捆綁在一起。如果一個服務在更新key的TTL時失敗了,那麼Etcd會對它進行超時處理。如果一個服務變為不可用狀態,client會需要處理這樣的連接失效,然後嘗試另連接一個服務實例。
服務發現環節設計到羅列在一個目錄下的所有key值,隨後等待在該目錄上的所有變動信息。由於API介面是基於HTTP的,所以client應用會的Etcd集群保持一個long-polling的連接。
由於Etcd使用 Raft一致性協議 ,故它應該是一個強一致性系統。Raft需要一個leader被選舉,然後所有的client請求會被該leader所處理。然而,Etcd似乎也支持從non-leaders中進行讀取信息,使用的方式是在讀情況下提高可用性的未公開的一致性參數。在網路分區故障期間,寫操作還是會被leader處理,而且同樣會出現失效的情況。
② zookeeper是java寫的還是c
Java
因為安裝 zk 需要安裝 JDK
③ zookeeper 安裝需要jdk嗎
在安裝ZooKeeper之前,請確保在以下任何操作系統上運行 :
任意Linux OS− 支持開發和部署。它是演示應用程序的首選。
Windows OS− 僅支持開發。
Mac OS− 僅支持開發。
ZooKeeper伺服器是用Java編寫創建,它運行在JVM。所以需要使用JDK 6或更高版本。
④ apache zookeeper是干什麼的
簡介ZooKeeper是Hadoop的正式子項目,它是一個針對大型分布式系統的可靠協調系統,提供的功能包括:配置維護、名字服務、分布式同步、組服務等。ZooKeeper的目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的介面和性能高效、功能穩定的系統提供給用戶。
Zookeeper是Google的Chubby一個開源的實現.是高有效和可靠的協同工作系統.Zookeeper能夠用來leader選舉,配置信息維護等.在一個分布式的環境中,我們需要一個Master實例或存儲一些配置信息,確保文件寫入的一致性等.[1]
ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,包含一個簡單的原語集,是Hadoop和Hbase的重要組件。
說白了是hadoop的組件之一,用來管理hadoop。
⑤ zookeeper和bbo都是分布式服務框架嗎
zookeeper是注冊中心,用來管理提供者和消費者的,包括軟負載均衡等;DUBBO是一個SOA分布式框架,它也用到的ZOOKEEPER,其它的HADOOP等也用到的這個注冊中心
⑥ zookeeper java實現的嗎
是的,整個hadoop都是java寫的
⑦ zookeeper怎麼用java創建臨時節點
基本操作
下面給出基本的操作 ZooKeeper 的示例代碼,這樣你就能對 ZooKeeper 有直觀的認識了。下面的清單包括了創建與 ZooKeeper 伺服器的連接以及最基本的數據操作:
ZooKeeper 基本的操作示例
// 創建一個與伺服器的連接
ZooKeeper zk = new ZooKeeper("localhost:" + CLIENT_PORT,
ClientBase.CONNECTION_TIMEOUT, new Watcher() {
// 監控所有被觸發的事件
public void process(WatchedEvent event) {
System.out.println("已經觸發了" + event.getType() + "事件!");
}
});
// 創建一個目錄節點
zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
// 創建一個子目錄節點
zk.create("/testRootPath/testChildPathOne", "testChildDataOne".getBytes(),
Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
System.out.println(new String(zk.getData("/testRootPath",false,null)));
// 取出子目錄節點列表
System.out.println(zk.getChildren("/testRootPath",true));
// 修改子目錄節點數據
zk.setData("/testRootPath/testChildPathOne","modifyChildDataOne".getBytes(),-1);
System.out.println("目錄節點狀態:["+zk.exists("/testRootPath",true)+"]");
// 創建另外一個子目錄節點
zk.create("/testRootPath/testChildPathTwo", "testChildDataTwo".getBytes(),
Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
System.out.println(new String(zk.getData("/testRootPath/testChildPathTwo",true,null)));
// 刪除子目錄節點
zk.delete("/testRootPath/testChildPathTwo",-1);
zk.delete("/testRootPath/testChildPathOne",-1);
// 刪除父目錄節點
zk.delete("/testRootPath",-1);
// 關閉連接
zk.close();
輸出的結果如下:
已經觸發了 None 事件!
testRootData
[testChildPathOne]
目錄節點狀態:[5,5,,,0,1,0,0,12,1,6]
已經觸發了 NodeChildrenChanged 事件!
testChildDataTwo
已經觸發了 NodeDeleted 事件!
已經觸發了 NodeDeleted 事件!
當對目錄節點監控狀態打開時,一旦目錄節點的狀態發生變化,Watcher 對象的 process 方法就會被調用。
⑧ zookeeper 是java 還是c++
ZooKeeper是用Java編寫的,運行在Java環境上,因此,在部署zk的機器上需要安裝Java運行環境。為了正常運行zk,我們需要JRE1.6或者以上的版本。
對於集群模式下的ZooKeeper部署,3個ZooKeeper服務進程是建議的最小進程數量,而且不同的服務進程建議部署在不同的物理機器上面,以減少機器宕機帶來的風險,以實現ZooKeeper集群的高可用。
⑨ 什麼是Zookeeper
ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。
ZooKeeper的目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的介面和性能高效、功能穩定的系統提供給用戶。
ZooKeeper包含一個簡單的原語集,[1] 提供Java和C的介面。
ZooKeeper代碼版本中,提供了分布式獨享鎖、選舉、隊列的介面,代碼在zookeeper-3.4.3\src\recipes。其中分布鎖和隊列有Java和C兩個版本,選舉只有Java版本。(概述圖片來源:[2] )
外文名
ZooKeeper
類 別
分布式系統的可靠協調系統
所 屬
Hadoop的正式子項目
特 點
高效,可靠
⑩ zookeeper一定要用java嗎
znode創建類型(CreateMode):
PERSISTENT 持久化節點
PERSISTENT_SEQUENTIAL 順序自動編號持久化節點,這種節點會根據當前已存在的節點數自動加 1
EPHEMERAL 臨時節點, 客戶端session超時這類節點就會被自動刪除
EPHEMERAL_SEQUENTIAL 臨時自動編號節點
[java] view plainprint?
/*
* ZookeeperTest.java
*/
package com.x.zookeeper;
import java.io.IOException;
import java.util.List;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author http://blog.csdn.net/java2000_wl
* @version <b>1.0</b>
*/
public class ZookeeperTest {
private static final int SESSION_TIMEOUT = 30000;
public static final Logger LOGGER = LoggerFactory.getLogger(ZookeeperTest.class);
private Watcher watcher = new Watcher() {
public void process(WatchedEvent event) {
LOGGER.info("process : " + event.getType());
}
};
private ZooKeeper zooKeeper;
/**
* 連接zookeeper
* <br>------------------------------<br>
* @throws IOException
*/
@Before
public void connect() throws IOException {
zooKeeper = new ZooKeeper("localhost:2181,localhost:2182,localhost:2183", SESSION_TIMEOUT, watcher);
}
/**
* 關閉連接
* <br>------------------------------<br>
*/
@After
public void close() {
try {
zooKeeper.close();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 創建一個znode
* 1.CreateMode 取值
* PERSISTENT:持久化,這個目錄節點存儲的數據不會丟失
* PERSISTENT_SEQUENTIAL:順序自動編號的目錄節點,這種目錄節點會根據當前已近存在的節點數自動加 1,然後返回給客戶端已經成功創建的目錄節點名;
* EPHEMERAL:臨時目錄節點,一旦創建這個節點的客戶端與伺服器埠也就是 session過期超時,這種節點會被自動刪除
* EPHEMERAL_SEQUENTIAL:臨時自動編號節點
* <br>------------------------------<br>
*/
@Test
public void testCreate() {
String result = null;
try {
result = zooKeeper.create("/zk001", "zk001data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
} catch (Exception e) {
LOGGER.error(e.getMessage());
Assert.fail();
}
LOGGE