當前位置:首頁 » 數據倉庫 » zookeeper多資料庫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

zookeeper多資料庫

發布時間: 2022-08-10 08:46:16

① Zookeeper-Zookeeper可以干什麼

在Zookeeper的官 網上有這么一句話:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.
這大概描述了Zookeeper主要可以干哪些事情:配置管理,名字服務,提供分布式同步以及集群管理。那這些服務又到底是什麼呢?我們為什麼需要這樣的服務?我們又為什麼要使用Zookeeper來實現呢,使用Zookeeper有什麼優勢?接下來我會挨個介紹這些到底是什麼,以及有哪些開源系統中使用了。
配置管理
在我們的應用中除了代碼外,還有一些就是各種配置。比如資料庫連接等。一般我們都是使用配置文件的方式,在代碼中引入這些配置文件。但是當我們只有一種配置,只有一台伺服器,並且不經常修改的時候,使用配置文件是一個很好的做法,但是如果我們配置非常多,有很多伺服器都需要這個配置,而且還可能是動態的話使用配置文件就不是個好主意了。這個時候往往需要尋找一種集中管理配置的方法,我們在這個集中的地方修改了配置,所有對這個配置感興趣的都可以獲得變更。比如我們可以把配置放在資料庫里,然後所有需要配置的服務都去這個資料庫讀取配置。但是,因為很多服務的正常運行都非常依賴這個配置,所以需要這個集中提供配置服務的服務具備很高的可靠性。一般我們可以用一個集群來提供這個配置服務,但是用集群提升可靠性,那如何保證配置在集群中的一致性呢? 這個時候就需要使用一種實現了一致性協議的服務了。Zookeeper就是這種服務,它使用Zab這種一致性協議來提供一致性。現在有很多開源項目使用Zookeeper來維護配置,比如在HBase中,客戶端就是連接一個Zookeeper,獲得必要的HBase集群的配置信息,然後才可以進一步操作。還有在開源的消息隊列Kafka中,也使用Zookeeper來維護broker的信息。在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實現服務治理。
名字服務
名字服務這個就很好理解了。比如為了通過網路訪問一個系統,我們得知道對方的IP地址,但是IP地址對人非常不友好,這個時候我們就需要使用域名來訪問。但是計算機是不能是別域名的。怎麼辦呢?如果我們每台機器里都備有一份域名到IP地址的映射,這個倒是能解決一部分問題,但是如果域名對應的IP發生變化了又該怎麼辦呢?於是我們有了DNS這個東西。我們只需要訪問一個大家熟知的(known)的點,它就會告訴你這個域名對應的IP是什麼。在我們的應用中也會存在很多這類問題,特別是在我們的服務特別多的時候,如果我們在本地保存服務的地址的時候將非常不方便,但是如果我們只需要訪問一個大家都熟知的訪問點,這里提供統一的入口,那麼維護起來將方便得多了。
分布式鎖
其實在第一篇文章中已經介紹了Zookeeper是一個分布式協調服務。這樣我們就可以利用Zookeeper來協調多個分布式進程之間的活動。比如在一個分布式環境中,為了提高可靠性,我們的集群的每台伺服器上都部署著同樣的服務。但是,一件事情如果集群中的每個伺服器都進行的話,那相互之間就要協調,編程起來將非常復雜。而如果我們只讓一個服務進行操作,那又存在單點。通常還有一種做法就是使用分布式鎖,在某個時刻只讓一個服務去幹活,當這台服務出問題的時候鎖釋放,立即fail over到另外的服務。這在很多分布式系統中都是這么做,這種設計有一個更好聽的名字叫Leader Election(leader選舉)。比如HBase的Master就是採用這種機制。但要注意的是分布式鎖跟同一個進程的鎖還是有區別的,所以使用的時候要比同一個進程里的鎖更謹慎的使用。
集群管理
在分布式的集群中,經常會由於各種原因,比如硬體故障,軟體故障,網路問題,有些節點會進進出出。有新的節點加入進來,也有老的節點退出集群。這個時候,集群中其他機器需要感知到這種變化,然後根據這種變化做出對應的決策。比如我們是一個分布式存儲系統,有一個中央控制節點負責存儲的分配,當有新的存儲進來的時候我們要根據現在集群目前的狀態來分配存儲節點。這個時候我們就需要動態感知到集群目前的狀態。還有,比如一個分布式的SOA架構中,服務是一個集群提供的,當消費者訪問某個服務時,就需要採用某種機制發現現在有哪些節點可以提供該服務(這也稱之為服務發現,比如Alibaba開源的SOA框架Dubbo就採用了Zookeeper作為服務發現的底層機制)。還有開源的Kafka隊列就採用了Zookeeper作為Cosnumer的上下線管理。
後記
在這篇文章中,列出了一些Zookeeper可以提供的服務,並給出了一些開源系統裡面的實例。後面我們從Zookeeper的安裝配置開始,並用示例進一步介紹Zookeeper如何使用。
(轉載)

② 如何使用Zookeeper集群Tomcat

(1)解壓為zookeepertar -xf -C /home/myuser/zookeeper/
復制zookeeper文件夾3份,分別重名名為zookeeperA,zookeeperB,zookeeperC。 並且創建數據快照以及日誌存放文件夾,命名為zooA,zooB,zooC。 (2)編輯對應的zookeeper配置文件,復制zookeeperconf下zoo_sample.cfg為zoo.cfgcd /home/myuser/zookeeperA/conf
cp zoo_sample.cfg zoo.cfg
(3)修改zoo.cfg# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/myuser/zooA/data
# the port at which the clients will connect
clientPort=2181
# ZooKeeper server and its port no. # ZooKeeper ensemble should know about every other machine in the ensemble # specify server id by creating 'myid' file in the dataDir # use hostname instead of IP address for convenient maintenance
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2988:3988
server.3=127.0.0.1:2088:3088
#
# Be sure to read the maintenance section of the
# administrator guide before turning>tickTime:心跳時間,為了確保連接存在的,以毫秒為單位,最小超時時間為兩個心跳時間
initLimit:多少個心跳時間內,允許其他server連接並初始化數據,如果ZooKeeper管理的數據較大,則應相應增大這個值
clientPort:服務的監聽埠
dataDir:用於存放內存資料庫快照的文件夾,同時用於集群的myid文件也存在這個文件夾里(注意:一個配置文件只能包含一個dataDir字樣,即使它被注釋掉了。)
dataLogDir:用於單獨設置transaction log的目錄,transaction log分離可以避免和普通log還有快照的競爭
syncLimit:多少個tickTime內,允許follower同步,如果follower落後太多,則會被丟棄。
(4)創建myid文件
cd /home/myuser/zooA/data
sudo sh -c 'echo "1" >> myid'
其他文件夾類似創建myid文件,zookeeperB為2,zookeeperC為3
(5)啟動zookeeper
cd /home/myuser/zookeeperA/bin
sudo sh zkServer.sh start
查看zookeeper狀態[root@weibo bin]# sh zkServer.sh status
JMX enabled by default
Using config: /home/weibo/zookeeperA/bin/../conf/zoo.cfg
Mode: follower
啟動OK,依次啟動另外兩台zookeeper,啟動第一台zookeeper後,你可以觀察bin下的zookeeper.out可以看到報錯,connection
refused,沒有關系,zookeeper需要等待其他另個節點的加入,全部啟動之後就正常了。
(6)客戶端連接zookeeper
[root@weibo bin]# sh zkCli.sh
Connecting to localhost:2181
2013-05-10 15:00:25,363 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.5-1392090, built>configs:保存上傳的配置文件信息
clusterstate.json:集群狀態json
aliases:別名json
live_node:當solr伺服器啟動的時候,會注冊到這里
overseer:保存shard信息
overseer_elect:節點選舉
collections:所有的collection

③ zookeeper集群起不起來

ookeeper是什麼Zookeeper,一種分布式應用的協作服務,是Google的Chubby一個開源的實現,是Hadoop的分布式協調服務,它包含一個簡單的原語集,應用於分布式應用的協作服務,使得分布式應用可以基於這些介面實現諸如同步、配置維護和分集群或者命名的服務。zookeeper是一個由多個service組成的集群,一個leader,多個follower,每個server保存一份數據部分,全局數據一致,分布式讀寫,更新請求轉發由leader實施.更新請求順序進行,來自同一個client的更新請求按其發送順序依次執行,數據更新原子性,一次數據更新要麼成功,要麼失敗,全局唯一數據試圖,client無論連接到哪個server,數據試圖是一致的.為什麼要用zookeeper大部分分布式應用需要一個主控、協調器或控制器來管理物理分布的子進程(如資源、任務分配等),目前,大部分應用需要開發私有的協調程序,缺乏一個通用的機制.協調程序的反復編寫浪費,且難以形成通用、伸縮性好的協調器,ZooKeeper:提

④ zkparking資料庫配置程序

摘要 這邊給您查詢分析到每台機器的應用程序都需要連接資料庫,而資料庫的配置信息(連接信息),這時候放在機器本地的話不方面(機器多,需要一個個改配置信息),這就用到Zookeeper,把資料庫的配置信息放到配置中心,利用Zookeeper節點可以存儲數據的特性,然後各台機器可以使用JavaAPI去獲取Zookeeper中資料庫的配置信息。每一個應用都在Zookeeper節點注冊監聽器,一旦節點信息改變,各台機器就獲取信息,使用最新的信息連接資料庫,這樣優點一是方便了管理(只放置一份數據在配置中心,沒必要放到多個機器上去),二是一旦配置改了,就做一個發布的動作即可。

⑤ zookeeper是要安裝在哪個目錄

然後每個文件夾裡面解壓一個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配置管理平台測試點有哪些

Master節點管理集群當中最重要的是Master,所以一般都會設置一台Master的Backup。解決問題:Master節點高可用,並且保證唯一。Meta信息的及時同步配置文件管理集群中配置文件的更新和同步是很頻繁的,傳統的配置文件分發都是需要把配置文件數據分發到每台worker上,然後進行worker的reload,這種方式是最笨的方式,結構很難維護,因為如果集群當中有可能很多種應用的配置文件要同步,而且效率很低,集群規模一大負載很高。還有一種就是每次更新把配置文件單獨保存到一個資料庫裡面,然後worker端定期pull數據,這種方式就是數據及時性得不到同步。解決問題:統一配置文件分發並且及時讓worker生效zookeeper監控集群利用zookeeper建立znode的強一致性,可以用於那種對集群中機器狀態,機器在線率有較高要求的場景,能夠快速對集群中機器變化作出響應。

⑦ zookeeper集群中數據的多副本是怎麼同步的

在Zookeeper的官 網上有這么一句話:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.
這大概描述了Zookeeper主要可以干哪些事情:配置管理,名字服務,提供分布式同步以及集群管理。那這些服務又到底是什麼呢?我們為什麼需要這樣的服務?我們又為什麼要使用Zookeeper來實現呢,使用Zookeeper有什麼優勢?接下來我會挨個介紹這些到底是什麼,以及有哪些開源系統中使用了。
配置管理
在我們的應用中除了代碼外,還有一些就是各種配置。比如資料庫連接等。一般我們都是使用配置文件的方式,在代碼中引入這些配置文件。但是當我們只有一種配置,只有一台伺服器,並且不經常修改的時候,使用配置文件是一個很好的做法,但是如果我們配置非常多,有很多伺服器都需要這個配置,而且還可能是動態的話使用配置文件就不是個主意了。這個時候往往需要尋找一種集中管理配置的方法,我們在這個集中的地方修改了配置,所有對這個配置感興趣的都可以獲得變更。比如我們可以把配置放在資料庫里,然後所有需要配置的服務都去這個資料庫讀取配置。但是,因為很多服務的正常運行都非常依賴這個配置,所以需要這個集中提供配置服務的服務具備很高的可靠性。一般我們可以用一個集群來提供這個配置服務,但是用集群提升可靠性,那如何保證配置在集群中的一致性呢? 這個時候就需要使用一種實現了一致性協議的服務了。Zookeeper就是這種服務,它使用Zab這種一致性協議來提供一致性。現在有很多開源項目使用Zookeepe信息,然後才可以進一步操作。還有在開源的消息隊列Kafka中,也使用Zookeeper來維護broker的信息。在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實現服務治理。
名字服務
名字服務這個就很好理解了。比如為了通過網路訪問一個系統,我們得知道對方的IP地址,但是IP地址對人非常不友好,這個時家熟知的(known)的點,它就會告訴你這個域名對應的IP是什麼。在我們的應用中也會存候我們就需要使用域名r來維護配置,比如在HBase中,客戶端就是連接一個Zookeeper,獲得必要的HBase集群的配置個進程的鎖還是有區別的,所以使用的時候要比同一個進程里的鎖更謹慎的使用。
集群管理
在分布式的集群中,經常會由於各種原因,比如硬體故障,軟在很多這類問題,特別是在我們的服務特別多的時候,如果我們在本地保件故障,網路問題,有些節點會進進出出。有新的節點加入進來,也有老的節點退出集群。這個時候,集群中其他機器需要感知到這種變化,然後根據這種變化做出對應的決策。比如我們是一個分布式存儲系統,有一個中央控制節點負責存儲的分配,當有新的存儲進來的時候我們要根據現在集群目前的狀態來分配存儲節點。這個時候我們就需要動態感知到集群目前的狀態。還有,比如一個分布式的SOA架構中,服務是一個集群提供的,當消費者訪問某個服務時,就需要採用某種機制發現現在有哪些節點可以提供該服務(這也稱之為服務發現,比如Alibaba開源的SOA框架Dubbo就採用了Zookeeper作為服務發現的底層機制)。還有開源的Kafka隊列就採用了Zookeeper作為Cosnumer的上下線管理。
後記
在這篇文章中,列出了一些Zookeeper可以提供的服務,並給出了一些開源系統裡面的實例。後面我們從Zookeeper的安裝配置開始,並用示例進一步介紹Zookeeper如何使用。
(轉載)

⑧ zookeeper 資料庫鎖 哪個好

packagecom.concurrent;

importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.List;
importjava.util.concurrent.CountDownLatch;
importjava.util.concurrent.TimeUnit;
importjava.util.concurrent.locks.Condition;
importjava.util.concurrent.locks.Lock;

importorg.apache.zookeeper.CreateMode;
importorg.apache.zookeeper.KeeperException;
importorg.apache.zookeeper.WatchedEvent;
importorg.apache.zookeeper.Watcher;
importorg.apache.zookeeper.ZooDefs;
importorg.apache.zookeeper.ZooKeeper;
importorg.apache.zookeeper.data.Stat;

/**
DistributedLocklock=null;
try{
lock=newDistributedLock("127.0.0.1:2182","test");
lock.lock();
//dosomething...
}catch(Exceptione){
e.printStackTrace();
}
finally{
if(lock!=null)
lock.unlock();
}
*@authorxueliang
*
*/
,Watcher{
privateZooKeeperzk;
privateStringroot="/locks";//根
privateStringlockName;//競爭資源的標志
privateStringwaitNode;//等待前一個鎖
privateStringmyZnode;//當前鎖
privateCountDownLatchlatch;//計數器
privateintsessionTimeout=30000;
privateList<Exception>exception=newArrayList<Exception>();

/**
*創建分布式鎖,使用前請確認config配置的zookeeper服務可用
*@paramconfig127.0.0.1:2181
*@paramlockName競爭資源標志,lockName中不能包含單詞lock
*/
publicDistributedLock(Stringconfig,StringlockName){
this.lockName=lockName;
//創建一個與伺服器的連接
try{
zk=newZooKeeper(config,sessionTimeout,this);
Statstat=zk.exists(root,false);
if(stat==null){
//創建根節點
zk.create(root,newbyte[0],ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}
}catch(IOExceptione){
exception.add(e);
}catch(KeeperExceptione){
exception.add(e);
}catch(InterruptedExceptione){
exception.add(e);
}
}

/**
*zookeeper節點的監視器
*/
publicvoidprocess(WatchedEventevent){
if(this.latch!=null){
this.latch.countDown();
}
}

publicvoidlock(){
if(exception.size()>0){
thrownewLockException(exception.get(0));
}
try{
if(this.tryLock()){
System.out.println("Thread"+Thread.currentThread().getId()+""+myZnode+"getlocktrue");
return;
}
else{
waitForLock(waitNode,sessionTimeout);//等待鎖
}
}catch(KeeperExceptione){
thrownewLockException(e);
}catch(InterruptedExceptione){
thrownewLockException(e);
}
}

publicbooleantryLock(){
try{
StringsplitStr="_lock_";
if(lockName.contains(splitStr))
thrownewLockException("lockNamecannotcontains\u000B");
//創建臨時子節點
myZnode=zk.create(root+"/"+lockName+splitStr,newbyte[0],ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println(myZnode+"iscreated");
//取出所有子節點
List<String>subNodes=zk.getChildren(root,false);
//取出所有lockName的鎖
List<String>lockObjNodes=newArrayList<String>();
for(Stringnode:subNodes){
String_node=node.split(splitStr)[0];
if(_node.equals(lockName)){
lockObjNodes.add(node);
}
}
Collections.sort(lockObjNodes);
System.out.println(myZnode+"=="+lockObjNodes.get(0));
if(myZnode.equals(root+"/"+lockObjNodes.get(0))){
//如果是最小的節點,則表示取得鎖
returntrue;
}
//如果不是最小的節點,找到比自己小1的節點
StringsubMyZnode=myZnode.substring(myZnode.lastIndexOf("/")+1);
waitNode=lockObjNodes.get(Collections.binarySearch(lockObjNodes,subMyZnode)-1);
}catch(KeeperExceptione){
thrownewLockException(e);
}catch(InterruptedExceptione){
thrownewLockException(e);
}
returnfalse;
}

publicbooleantryLock(longtime,TimeUnitunit){
try{
if(this.tryLock()){
returntrue;
}
returnwaitForLock(waitNode,time);
}catch(Exceptione){
e.printStackTrace();
}
returnfalse;
}

privatebooleanwaitForLock(Stringlower,longwaitTime)throwsInterruptedException,KeeperException{
Statstat=zk.exists(root+"/"+lower,true);
//判斷比自己小一個數的節點是否存在,如果不存在則無需等待鎖,同時注冊監聽
if(stat!=null){
System.out.println("Thread"+Thread.currentThread().getId()+"waitingfor"+root+"/"+lower);
this.latch=newCountDownLatch(1);
this.latch.await(waitTime,TimeUnit.MILLISECONDS);
this.latch=null;
}
returntrue;
}

publicvoinlock(){
try{
System.out.println("unlock"+myZnode);
zk.delete(myZnode,-1);
myZnode=null;
zk.close();
}catch(InterruptedExceptione){
e.printStackTrace();
}catch(KeeperExceptione){
e.printStackTrace();
}
}

publicvoidlockInterruptibly()throwsInterruptedException{
this.lock();
}

publicConditionnewCondition(){
returnnull;
}

{
=1L;
publicLockException(Stringe){
super(e);
}
publicLockException(Exceptione){
super(e);
}
}

}

⑨ 什麼是mongodb,zookeeper,redis,solr

MongoDB[1] 是一個基於分布式文件存儲的資料庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。
ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。
Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於內存亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。
Solr是一個獨立的企業級搜索應用伺服器,它對外提供類似於Web-service的API介面。用戶可以通過http請求,向搜索引擎伺服器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,並得到XML格式的返回結果。

⑩ zookeeper集群中數據的多副本是怎麼同步的

擴容是什麼意思?增加容量還是增加處理能力? ZK本來就不是當資料庫的,每次最大返回數據大小默認的限制是在1M內,所以不在於提高容量。 ZK主要用於協調的,增加從節點一可以提高讀性能,二可以提高集群的容災能力和可用性。 讀取數據時可能是讀