搭建一個高可用的Zookeeper環境

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協議的健/值對存儲系統,它是一個分布式和功能層次配置系統,可用于構建服務發現系統。其很容易部署、安裝和使用,提供了可靠的數據持久化特性。它是安全的并且文檔也十分齊全。

etcdZookeeper是比更好的選擇,因為它很簡單,然而,它需要搭配一些第三方工具才可以提供服務發現功能。但是etcd只是一個存儲工具,要做到服務治理,就還需要RegistratorConfd的配合使用。

Registrator通過檢查容器在線或者停止運行狀態自動注冊和去注冊服務,它目前支持etcdConsulSkyDNS 2

Registratoretcd是一個簡單但是功能強大的組合,可以運行很多先進的技術。每當我們打開一個容器,所有數據將被存儲在etcd并傳播到集群中的所有節點。

Confd是一個輕量級的配置管理工具,常見的用法是通過使用存儲在etcdconsul和其他一些數據登記處的數據保持配置文件的最新狀態,它也可以用來在配置文件改變時重新加載應用程序。換句話說,我們可以用存儲在etcd(或者其他注冊中心)的信息來重新配置所有服務。

Consul介紹

Consul是強一致性的數據存儲,使用gossip形成動態集群。它提供分級鍵/值存儲方式,不僅可以存儲數據,而且可以用于注冊器件事各種任務,從發送數據改變通知到運行健康檢查和自定義命令,具體如何取決于它們的輸出。

Zookeeperetcd不一樣,Consul內嵌實現了服務發現系統,所以這樣就不需要構建自己的系統或使用第三方系統。這一發現系統除了上述提到的特性之外,還包括節點健康檢查和運行在其上的服務。

Zookeeperetcd只提供原始的鍵/值隊存儲,要求應用程序開發人員構建他們自己的系統提供服務發現功能。而Consul提供了一個內置的服務發現的框架。客戶只需要注冊服務并通過DNSHTTP接口執行服務發現。其他兩個工具需要一個親手制作的解決方案或借助于第三方工具。

Consul為多種數據中心提供了開箱即用的原生支持,其中的gossip系統不僅可以工作在同一集群內部的各個節點,而且還可以跨數據中心工作。

Consul還有另一個不錯的區別于其他工具的功能,它不僅可以用來發現已部署的服務以及其駐留的節點信息,還通過HTTP請求、TTLs(time-to-live)和自定義命令提供了易于擴展的健康檢查特性。

如何選擇合適的注冊中心?

http://static.cyblogs.com/QQ截圖20200104231932.png

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.cfgzoo.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

配置好,dataDirdataLogDirserver.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-002leader節點,然后vm-centos-001vm-centos-003為其follower節點。這樣子,一個簡單的Zookeeper環境就搭建出來了。

這些其實也是很久以前搭建的環境,只是今天抽空,把之前欠的東西回顧一下,寫了這篇博客。如果有地方描述的不對或者模糊的,歡迎指定與交流。

http://static.cyblogs.com/15135197832243.jpg

參考地址

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,791評論 6 545
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,795評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,943評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,057評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,773評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,106評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,082評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,282評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,793評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,507評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,741評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,220評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,929評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,325評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,661評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,482評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,702評論 2 380

推薦閱讀更多精彩內容