1. 程式人生 > >zookeeper集群安裝

zookeeper集群安裝

zk

本文參考以下鏈接:

http://www.cnblogs.com/yuyijq/p/4116365.html

Zookeeper-Zookeeper leader選舉

http://www.cnblogs.com/yuyijq/p/3424473.html

Zookeeper-Zookeeper可以幹什麽

http://www.cnblogs.com/yuyijq/p/3391945.html

Zookeeper--Zookeeper是什麽


那分布式協調服務又是個什麽東西呢?首先我們來看“協調”是什麽意思。

說到協調,我首先想到的是北京很多十字路口的交通協管,他們手握著小紅旗,指揮車輛和行人是不是可以通行。如果我們把車輛和行人比喻成運行在計算機中的單元(線程),那麽這個協管是幹什麽的?很多人都會想到,這不就是鎖麽?對,在一個並發的環境裏,我們為了避免多個運行單元對共享數據同時進行修改,造成數據損壞的情況出現,我們就必須依賴像鎖這樣的協調機制,讓有的線程可以先操作這些資源,然後其他線程等待。

Zookeeper-Zookeeper leader選舉

節點狀態: 每個集群中的節點都有一個狀態 LOOKING, FOLLOWING, LEADING, OBSERVING。都屬於這4種,每個節點啟動的時候都是LOOKING狀態,如果這個節點參與選舉但最後不是leader,則狀態是FOLLOWING,如果不參與選舉則是OBSERVING,leader的狀態是LEADING。

在FastLeaderElection裏有一個Manager的內部類,這個類裏有啟動了兩個線程:WorkerReceiver, WorkerSender。為什麽說選舉這部分復雜呢,我覺得就是這些線程就像左右互搏一樣,非常難以理解。顧名思義,這兩個線程一個是處理從別的節點接收消息的,一個是向外發送消息的。對於外面的邏輯接收和發送的邏輯都是異步的。

1. 判斷消息裏的epoch是不是比當前的大,如果大則消息裏id對應的server我就承認它是leader

2. 如果epoch相等則判斷zxid,如果消息裏的zxid比我的大我就承認它是leader

3. 如果前面兩個都相等那就比較一下server id吧,如果比我的大我就承認它是leader。

關於前面兩個東西暫時我們不去關心它,對於新啟動的集群這兩者都是相等的。

那這樣看來server id的大小也是leader選舉的一環啊(有的人生下來註定就不平凡,這都是命啊)。

最後我們來看看,很多文章所介紹的,如果超過一半的人說它是leader,那它就是leader的邏輯吧

這裏介紹的是一個新集群啟動時候的選舉過程,啟動的時候就是根據zoo.cfg裏的配置,向各個節點廣播投票,一般都是選投自己。然後收到投票後就會進行進行判斷。如果某個節點收到的投票數超過一半,那麽它就是leader了。

了解了這個過程,我們來看看另外一個問題:

一個集群有3臺機器,掛了一臺後的影響是什麽?掛了兩臺呢?

掛了一臺:掛了一臺後就是收不到其中一臺的投票,但是有兩臺可以參與投票,按照上面的邏輯,它們開始都投給自己,後來按照選舉的原則,兩個人都投票給其中一個,那麽就有一個節點獲得的票等於2,2 > (3/2)=1 的,超過了半數,這個時候是能選出leader的。

掛了兩臺: 掛了兩臺後,怎麽弄也只能獲得一張票, 1 不大於 (3/2)=1的,這樣就無法選出一個leader了。


一、環境介紹:至少3個節點,且必須為單數

原因:

       在zookeeper的選舉過程中,為了保證選舉過程最後能選出leader,就一定不能出現兩臺機器得票相同的僵局,所以一般的,要求zk集群的server數量一定要是奇數,也就是2n+1臺,並且,如果集群出現問題,其中存活的機器必須大於n+1臺,否則leader無法獲得多數server的支持,系統就自動掛掉。所以一般是3個或者3個以上節點。

系統:CentOS Linux release 7.3.1611 (Core)

軟件版本:

zookeeper-3.4.10

java -version

java version "1.7.0_80"

在以下文件中添加以下內容

cat /etc/hosts

192.168.3.99 zk01.example.com

192.168.3.33 zk02.example.com

192.168.3.159 zk03.example.com

二、配置:

三臺zookeeper配置文件相同

/opt/zookeeper-3.4.10/conf/zoo.cfg

tickTime=2000

autopurge.purgeInterval=2

dataLogDir=/opt/zookeeper-3.4.10/log/

initLimit=10

syncLimit=5

dataDir=/opt/zookeeper-3.4.10/data

clientPort=2181

server.1=192.168.3.99:2888:3888

這裏的server.1要與/opt/zookeeper-3.4.10/conf/data/myid 數字與之對應

cat /opt/zookeeper-3.4.10/data/myid

1

server.2=192.168.3.33:2888:3888

cat /opt/zookeeper-3.4.10/data/myid

2

server.3=192.168.3.159:2888:3888

cat /opt/zookeeper-3.4.10/data/myid

3

名詞解釋:

在上面的例子中,我把三個zookeeper服務放到同一臺機器上。上面的配置中有兩個TCP port後面一個是用於Zookeeper選舉用的而前一個是Leader和Follower或Observer交換數據使用的

dataLogDir如果沒提供的話使用的則是dataDir。zookeeper的持久化都存儲在這兩個目錄裏。dataLogDir裏是放到的順序日誌(WAL)。而dataDir裏放的是內存數據結構的snapshot,便於快速恢復。為了達到性能最大化,一般建議把dataDir和dataLogDir分到不同的磁盤上,這樣就可以充分利用磁盤順序寫的特性。

syncLimit = 5 就表示fowller與leader的心跳時間是5 tick

autopurge.snapRetainCount,autopurge.purgeInterval -- 客戶端在與zookeeper交互過程中會產生非常多的日誌,而且zookeeper也會將內存中的數據作為snapshot保存下來,這些數據是不會被自動刪除的,這樣磁盤中這樣的數據就會越來越多。不過可以通過這兩個參數來設置,讓zookeeper自動刪除數據。autopurge.purgeInterval就是設置多少小時清理一次。而autopurge.snapRetainCount是設置保留多少個snapshot,之前的則刪除。

配置-myid

在dataDir裏會放置一個myid文件,裏面就一個數字,用來唯一標識這個服務。這個id是很重要的,一定要保證整個集群中唯一。zookeeper會根據這個id來取出server.x上的配置。比如當前id為1,則對應著zoo.cfg裏的server.1的配置。

2. 而且在後面我們介紹leader選舉的時候,這個id的大小也是有意義的。

三、啟動:

OK,上面就是配置的講解了,現在我們可以啟動zookeeper集群了。進入到bin目錄,執行 ./zkServer.sh start即可。

/opt/zookeeper-3.4.10/bin/zkServer.sh start

四、測試連接

/opt/zookeeper-3.4.10/bin/zkCli.sh -server 192.168.3.159:2181

技術分享


本文出自 “silence” 博客,請務必保留此出處http://silencezone.blog.51cto.com/3613477/1948638

zookeeper集群安裝