zookeeper是個什么玩意?
顧名思義zookeeper就是動物園管理員,他是用來管hadoop(大象)、Hive(蜜蜂)、pig(小豬)的管理員, Apache Hbase和 Apache Solr 的分布式集群都用到了zookeeper;Zookeeper:是一個分布式的、開源的程序協(xié)調(diào)服務(wù),是hadoop項目下的一個子項目。
Zookeeper可以干哪些事情?
1、配置管理
在我們的應(yīng)用中除了代碼外,還有一些就是各種配置。比如數(shù)據(jù)庫連接等。一般我們都是使用配置文件的方式,在代碼中引入這些配置文件。但是當(dāng)我們只有一種配置,只有一臺服務(wù)器,并且不經(jīng)常修改的時候,使用配置文件是一個很好的做法,但是如果我們配置非常多,有很多服務(wù)器都需要這個配置,而且還可能是動態(tài)的話使用配置文件就不是個好主意了。這個時候往往需要尋找一種集中管理配置的方法,我們在這個集中的地方修改了配置,所有對這個配置感興趣的都可以獲得變更。比如我們可以把配置放在數(shù)據(jù)庫里,然后所有需要配置的服務(wù)都去這個數(shù)據(jù)庫讀取配置。但是,因為很多服務(wù)的正常運(yùn)行都非常依賴這個配置,所以需要這個集中提供配置服務(wù)的服務(wù)具備很高的可靠性。一般我們可以用一個集群來提供這個配置服務(wù),但是用集群提升可靠性,那如何保證配置在集群中的一致性呢? 這個時候就需要使用一種實現(xiàn)了一致性協(xié)議的服務(wù)了。Zookeeper就是這種服務(wù),它使用Zab這種一致性協(xié)議來提供一致性。現(xiàn)在有很多開源項目使用Zookeeper來維護(hù)配置,比如在HBase中,客戶端就是連接一個Zookeeper,獲得必要的HBase集群的配置信息,然后才可以進(jìn)一步操作。還有在開源的消息隊列Kafka中,也使用Zookeeper來維護(hù)broker的信息。在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實現(xiàn)服務(wù)治理。
2、名字服務(wù)
名字服務(wù)這個就很好理解了。比如為了通過網(wǎng)絡(luò)訪問一個系統(tǒng),我們得知道對方的IP地址,但是IP地址對人非常不友好,這個時候我們就需要使用域名來訪問。但是計算機(jī)是不能是別域名的。怎么辦呢?如果我們每臺機(jī)器里都備有一份域名到IP地址的映射,這個倒是能解決一部分問題,但是如果域名對應(yīng)的IP發(fā)生變化了又該怎么辦呢?于是我們有了DNS這個東西。我們只需要訪問一個大家熟知的(known)的點(diǎn),它就會告訴你這個域名對應(yīng)的IP是什么。在我們的應(yīng)用中也會存在很多這類問題,特別是在我們的服務(wù)特別多的時候,如果我們在本地保存服務(wù)的地址的時候?qū)⒎浅2环奖悖侨绻覀冎恍枰L問一個大家都熟知的訪問點(diǎn),這里提供統(tǒng)一的入口,那么維護(hù)起來將方便得多了。
3、分布式鎖
其實在第一篇文章中已經(jīng)介紹了Zookeeper是一個分布式協(xié)調(diào)服務(wù)。這樣我們就可以利用Zookeeper來協(xié)調(diào)多個分布式進(jìn)程之間的活動。比如在一個分布式環(huán)境中,為了提高可靠性,我們的集群的每臺服務(wù)器上都部署著同樣的服務(wù)。但是,一件事情如果集群中的每個服務(wù)器都進(jìn)行的話,那相互之間就要協(xié)調(diào),編程起來將非常復(fù)雜。而如果我們只讓一個服務(wù)進(jìn)行操作,那又存在單點(diǎn)。通常還有一種做法就是使用分布式鎖,在某個時刻只讓一個服務(wù)去干活,當(dāng)這臺服務(wù)出問題的時候鎖釋放,立即fail over到另外的服務(wù)。這在很多分布式系統(tǒng)中都是這么做,這種設(shè)計有一個更好聽的名字叫Leader Election(leader選舉)。比如HBase的Master就是采用這種機(jī)制。但要注意的是分布式鎖跟同一個進(jìn)程的鎖還是有區(qū)別的,所以使用的時候要比同一個進(jìn)程里的鎖更謹(jǐn)慎的使用。
4、集群管理
在分布式的集群中,經(jīng)常會由于各種原因,比如硬件故障,軟件故障,網(wǎng)絡(luò)問題,有些節(jié)點(diǎn)會進(jìn)進(jìn)出出。有新的節(jié)點(diǎn)加入進(jìn)來,也有老的節(jié)點(diǎn)退出集群。這個時候,集群中其他機(jī)器需要感知到這種變化,然后根據(jù)這種變化做出對應(yīng)的決策。比如我們是一個分布式存儲系統(tǒng),有一個中央控制節(jié)點(diǎn)負(fù)責(zé)存儲的分配,當(dāng)有新的存儲進(jìn)來的時候我們要根據(jù)現(xiàn)在集群目前的狀態(tài)來分配存儲節(jié)點(diǎn)。這個時候我們就需要動態(tài)感知到集群目前的狀態(tài)。還有,比如一個分布式的SOA架構(gòu)中,服務(wù)是一個集群提供的,當(dāng)消費(fèi)者訪問某個服務(wù)時,就需要采用某種機(jī)制發(fā)現(xiàn)現(xiàn)在有哪些節(jié)點(diǎn)可以提供該服務(wù)(這也稱之為服務(wù)發(fā)現(xiàn),比如Alibaba開源的SOA框架Dubbo就采用了Zookeeper作為服務(wù)發(fā)現(xiàn)的底層機(jī)制)。還有開源的Kafka隊列就采用了Zookeeper作為Cosnumer的上下線管理。
Zookeeper集群的搭建
前臺條件
三個zookeeper實例。Zookeeper也是java開發(fā)的所以需要安裝jdk。
Linux系統(tǒng)
Jdk環(huán)境。
Zookeeper。
Zookeeper的安裝步驟
第一步:把zookeeper的安裝包上傳到服務(wù)器
第二步:解壓縮。
[root@bogon ~]# tar -zxf zookeeper-3.4.6.tar.gz
[root@bogon ~]#
第三步:在/usr/local/目錄下創(chuàng)建一個solrcloud目錄。把zookeeper解壓后的文件夾復(fù)制到此目錄下三份。分別命名為zookeeper1、2、3
[root@bogon ~]# mkdir /usr/local/solrcloud
[root@bogon ~]# mv zookeeper-3.4.6 /usr/local/solrcloud/zookeeper1
[root@bogon ~]# cd /usr/local/solrcloud
[root@bogon solrcloud]# ll
total 4
drwxr-xr-x. 10 1000 1000 4096 Feb 20 2014 zookeeper1
[root@bogon solrcloud]# cp -r zookeeper1/ zookeeper2
[root@bogon solrcloud]# cp -r zookeeper1/ zookeeper3
[root@bogon solrcloud]#
第四步:配置zookeeper。
1.在每個zookeeper文件夾下創(chuàng)建一個data目錄。
2.在data文件夾下創(chuàng)建一個文件名稱為myid,文件的內(nèi)容就是此zookeeper的編號1、2、3(不是txt格式的使用終端創(chuàng)建[echo 1 << myid])
[root@bogon data]# echo 1 >> myid
[root@bogon data]# ll
total 4
-rw-r--r--. 1 root root 2 Sep 17 23:43 myid
[root@bogon data]# cat myid
1
[root@bogon data]#
在zookeeper2、3文件夾下分別創(chuàng)建data目錄和myid文件
[root@bogon solrcloud]# mkdir zookeeper2/data
[root@bogon solrcloud]# echo 2 >> zookeeper2/data/myid
[root@bogon solrcloud]# ll zookeeper2/data
total 4
-rw-r--r--. 1 root root 2 Sep 17 23:44 myid
[root@bogon solrcloud]# cat zookeeper2/data/myid
2
[root@bogon solrcloud]# mkdir zookeeper3/data
[root@bogon solrcloud]# echo 3 >> zookeeper3/data/myid
[root@bogon solrcloud]#
3.把zookeeper1下conf目錄下的zoo_sample.cfg文件復(fù)制一份改名為zoo.cfg
4.修改zoo.cfg的配置
第五步:啟動zookeeper。進(jìn)入zookeeper1/bin目錄下。
啟動zookeeper:./zkServer.sh start
關(guān)閉:./zkServer.sh stop
查看狀態(tài):./zkServer.sh status
[root@bogon solrcloud]# zookeeper1/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/solrcloud/zookeeper1/bin/../conf/zoo.cfg
Mode: follower
[root@bogon solrcloud]# zookeeper2/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/solrcloud/zookeeper2/bin/../conf/zoo.cfg
Mode: leader
[root@bogon solrcloud]# zookeeper3/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/solrcloud/zookeeper3/bin/../conf/zoo.cfg
Mode: follower
[root@bogon solrcloud]#
相同的方式在zookeeper2 ,3 中創(chuàng)建zoo.cfg并修改配置