Zookeeper背景
Google
的三篇論文影響了很多很多人,也影響了很多很多系統。這三篇論文一直是分布式領域傳閱的經典。
根據MapReduce
,于是我們有了Hadoop
;
根據GFS
,于是我們有了HDFS
;
根據BigTable
,于是我們有了HBase
;
而在這三篇論文里都提及Google
的一個lock service---Chubby
,哦,于是我們有了Zookeeper
。
伴隨著Zookeeper
有兩篇論文:
- 第一篇:
ZAB
是介紹Zookeeper
背后使用的一致性協議的(Zookeeper atomic broadcast protocol
); - 第二篇:介紹
Zookeeper
本身的,在這兩篇論文里都提到Zookeeper
是一個分布式協調服務(a service for coordinating processes of distributed applications
)。
在一個高并發的場景下,我們代碼都要考慮一些同步、先后順序,注意一些資源的安全性問題,那么在一個分布式的場景下,這些就更加的復雜了,在分布式環境中為了提升可靠性,我們往往會部署多套服務,但是如何在多套服務中達到一致性,這在同一個進程內很容易解決的問題,但在分布式環境中確實一個大難題。
所以分布式協調遠遠比同一個進程里的協調復雜得多,所以類似Zookeeper這類基礎服務就應運而生。這些系統都在各個系統久經考驗,它的可靠性,可用性都是經過理論和實踐的驗證的。所以我們在構建一些分布式系統的時候,就可以以這類系統為起點來構建我們的系統,這將節省不少成本,而且bug也將更少。
還有哪些適合做注冊中心?
ZK屬于服務發現工具,那么在市面上也會存在其他的一些服務治理的工具,比如:etcd
& Consul
。
參考一篇文章:http://dockone.io/article/667
etcd介紹
etcd
是一個采用HTTP協議的健/值對存儲系統,它是一個分布式和功能層次配置系統,可用于構建服務發現系統。其很容易部署、安裝和使用,提供了可靠的數據持久化特性。它是安全的并且文檔也十分齊全。
etcd
比Zookeeper
是比更好的選擇,因為它很簡單,然而,它需要搭配一些第三方工具才可以提供服務發現功能。但是etcd
只是一個存儲工具,要做到服務治理,就還需要Registrator
與Confd
的配合使用。
Registrator
通過檢查容器在線或者停止運行狀態自動注冊和去注冊服務,它目前支持etcd
、Consul
和SkyDNS 2
。
Registrator
與etcd
是一個簡單但是功能強大的組合,可以運行很多先進的技術。每當我們打開一個容器,所有數據將被存儲在etcd
并傳播到集群中的所有節點。
Confd
是一個輕量級的配置管理工具,常見的用法是通過使用存儲在etcd
、consul
和其他一些數據登記處的數據保持配置文件的最新狀態,它也可以用來在配置文件改變時重新加載應用程序。換句話說,我們可以用存儲在etcd
(或者其他注冊中心)的信息來重新配置所有服務。
Consul介紹
Consul
是強一致性的數據存儲,使用gossip
形成動態集群。它提供分級鍵/值存儲方式,不僅可以存儲數據,而且可以用于注冊器件事各種任務,從發送數據改變通知到運行健康檢查和自定義命令,具體如何取決于它們的輸出。
與Zookeeper
和etcd
不一樣,Consul
內嵌實現了服務發現系統,所以這樣就不需要構建自己的系統或使用第三方系統。這一發現系統除了上述提到的特性之外,還包括節點健康檢查和運行在其上的服務。
Zookeeper
和etcd
只提供原始的鍵/值隊存儲,要求應用程序開發人員構建他們自己的系統提供服務發現功能。而Consul提供了一個內置的服務發現的框架。客戶只需要注冊服務并通過DNS
或HTTP
接口執行服務發現。其他兩個工具需要一個親手制作的解決方案或借助于第三方工具。
Consul
為多種數據中心提供了開箱即用的原生支持,其中的gossip
系統不僅可以工作在同一集群內部的各個節點,而且還可以跨數據中心工作。
Consul
還有另一個不錯的區別于其他工具的功能,它不僅可以用來發現已部署的服務以及其駐留的節點信息,還通過HTTP
請求、TTLs(time-to-live)
和自定義命令提供了易于擴展的健康檢查特性。
如何選擇合適的注冊中心?
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的上下線管理。
搭建ZK的環境
準備3臺機器
由于沒有那么多的資源,我這里用的虛擬機(更好的辦法是用Docker)。
環境情況:
1、Mac安裝VMware,Professional Version 7.0.0 (2103067);
2、安裝好Linux系統,我推薦大家用CentOS,盡量與生產保持一致;
3、下載好zk的安裝包:zookeeper-3.4.6
(官網下載地址:http://apache.fayea.com/zookeeper/zookeeper-3.4.6/)
4、并且將3臺機器設置為免密碼登錄那種,因為3臺機器是需要即時通訊,這里我就不描述如何配置免密碼登錄的步驟了;推薦一篇博客:(http://blog.csdn.net/leexide/article/details/17252369)
4.2、配置ZK
我的3臺機器IP為:
機器1(CentOS-001):172.16.98.160
機器2(CentOS-002):172.16.98.162
機器3(CentOS-003):172.16.98.161
將下載后的包解壓,為了暫時的方便(生產建議專門放到規定的文件,比如:opt),我現在就放在home目錄下面:
[chenyuan@vm-centos-001 ~]$ ll zookeeper-3.4.6
total 2040
drwxr-xr-x. 2 chenyuan chenyuan 4096 Oct 31 05:13 bin
-rw-rw-r--. 1 chenyuan chenyuan 82446 Feb 20 2014 build.xml
-rw-rw-r--. 1 chenyuan chenyuan 80776 Feb 20 2014 CHANGES.txt
drwxr-xr-x. 2 chenyuan chenyuan 4096 Oct 31 05:11 conf
drwxr-xr-x. 10 chenyuan chenyuan 4096 Feb 20 2014 contrib
drwxrwxr-x. 3 chenyuan chenyuan 4096 Oct 31 06:59 data
drwxrwxr-x. 3 chenyuan chenyuan 4096 Apr 3 2017 datalog
drwxr-xr-x. 2 chenyuan chenyuan 4096 Feb 20 2014 dist-maven
drwxr-xr-x. 6 chenyuan chenyuan 4096 Feb 20 2014 docs
-rw-rw-r--. 1 chenyuan chenyuan 1953 Feb 20 2014 ivysettings.xml
-rw-rw-r--. 1 chenyuan chenyuan 3375 Feb 20 2014 ivy.xml
drwxr-xr-x. 4 chenyuan chenyuan 4096 Feb 20 2014 lib
-rw-rw-r--. 1 chenyuan chenyuan 11358 Feb 20 2014 LICENSE.txt
-rw-rw-r--. 1 chenyuan chenyuan 170 Feb 20 2014 NOTICE.txt
-rw-rw-r--. 1 chenyuan chenyuan 1770 Feb 20 2014 README_packaging.txt
-rw-rw-r--. 1 chenyuan chenyuan 1585 Feb 20 2014 README.txt
drwxr-xr-x. 5 chenyuan chenyuan 4096 Feb 20 2014 recipes
drwxr-xr-x. 8 chenyuan chenyuan 4096 Feb 20 2014 src
-rw-rw-r--. 1 chenyuan chenyuan 1340305 Feb 20 2014 zookeeper-3.4.6.jar
-rw-rw-r--. 1 chenyuan chenyuan 836 Feb 20 2014 zookeeper-3.4.6.jar.asc
-rw-rw-r--. 1 chenyuan chenyuan 33 Feb 20 2014 zookeeper-3.4.6.jar.md5
-rw-rw-r--. 1 chenyuan chenyuan 41 Feb 20 2014 zookeeper-3.4.6.jar.sha1
-rw-rw-r--. 1 chenyuan chenyuan 490893 Apr 3 2017 zookeeper.out
[chenyuan@vm-centos-001 ~]$ pwd
/home/chenyuan
先一臺一臺的配置,后面2臺的配置就與前面一致,只是有一點點的區別。
配置conf
復制一份zoo_sample.cfg
為zoo.cfg
-rw-rw-r--. 1 chenyuan chenyuan 535 Feb 20 2014 configuration.xsl
-rw-rw-r--. 1 chenyuan chenyuan 2161 Feb 20 2014 log4j.properties
-rw-rw-r--. 1 chenyuan chenyuan 1082 Oct 31 05:11 zoo.cfg
-rw-rw-r--. 1 chenyuan chenyuan 922 Feb 20 2014 zoo_sample.cfg
[chenyuan@vm-centos-001 conf]$ pwd
/home/chenyuan/zookeeper/conf
然后,填寫好我們的配置,具體如下:
# 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/chenyuan/zookeeper/data
dataLogDir=/home/chenyuan/zookeeper/datalog
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.0=vm-centos-001:2888:3888
server.1=vm-centos-002:2888:3888
server.2=vm-centos-003:2888:3888
配置好,dataDir
、dataLogDir
、server.0
~server.3
,這里用到的是vm-centos-001
,這里去修改network
。
[chenyuan@vm-centos-001 conf]$ vim /etc/sysconfig/network
[chenyuan@vm-centos-001 conf]$
打開里面的值,修改完畢后需要重啟才生效,這個是永久有效。
NETWORKING=yes
HOSTNAME=vm-centos-001
并且把三臺機器的hosts加上去
# VMWare CentOS
172.16.98.160 vm-centos-001
172.16.98.162 vm-centos-002
172.16.98.161 vm-centos-003
配置完畢后,啟動第一個節點:
[chenyuan@vm-centos-001 zookeeper]$ ./bin/zkServer.sh start
JMX enabled by default
Using config: /home/chenyuan/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[chenyuan@vm-centos-001 zookeeper]$
驗證ZooKeeper服務
再通jps
看一下進程的啟動情況
[chenyuan@vm-centos-001 zookeeper]$ jps
3851 QuorumPeerMain
3993
Jps
然后通過zk的status明亮查看zk的leader與follower的節點:
[chenyuan@vm-centos-001 bin]$ sh zkServer.sh status
JMX enabled by default
Using config: /home/chenyuan/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[chenyuan@vm-centos-002 bin]$ sh zkServer.sh status
JMX enabled by default
Using config: /home/chenyuan/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[chenyuan@vm-centos-002 bin]$
[chenyuan@vm-centos-003 bin]$ sh zkServer.sh status
JMX enabled by default
Using config: /home/chenyuan/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[chenyuan@vm-centos-003 bin]$
不難看出來,vm-centos-002
為leader
節點,然后vm-centos-001
與vm-centos-003
為其follower
節點。這樣子,一個簡單的Zookeeper
環境就搭建出來了。
這些其實也是很久以前搭建的環境,只是今天抽空,把之前欠的東西回顧一下,寫了這篇博客。如果有地方描述的不對或者模糊的,歡迎指定與交流。
參考地址
- http://www.cnblogs.com/yuyijq/p/3391945.html
-
http://www.cnblogs.com/yuyijq/p/3424473.html
如果大家喜歡我的文章,可以關注個人訂閱號。歡迎隨時留言、交流。
簡棧文化服務訂閱號