超簡單 - centos7搭建zookeeper集群

:zookeeper是為其它分布式程序提供:主從協(xié)調(diào)、服務(wù)器節(jié)點動態(tài)上下線、統(tǒng)一配置管理、分布式共享鎖、統(tǒng)一名稱 等服務(wù)的。同時zookeeper本身也是分布式程序的,只要半數(shù)以上節(jié)點存活,zookeeper就能正常服務(wù)。所以建議zookeeper搭建在奇數(shù)的機器上。

官方文檔:http://zookeeper.apache.org/doc/current/index.html

zookeeper特性

  • Zookeeper集群由一個leader,多個follower組成。
  • 全局數(shù)據(jù)一致:每個server保存一份相同的數(shù)據(jù)副本,client無論連接到哪個server,數(shù)據(jù)都是一致的
  • 分布式讀寫,更新請求轉(zhuǎn)發(fā),由leader實施
  • 更新請求順序進行,來自同一個client的更新請求按其發(fā)送順序依次執(zhí)行
  • 數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功,要么失敗
  • 實時性,在一定時間范圍內(nèi),client能讀到最新數(shù)據(jù)

zookeeper原理及內(nèi)部選舉機制

在配置文件中zookeeper并沒有指定master和slave,zookeeper啟動后會通過內(nèi)部的選舉機制臨時產(chǎn)生的。在一個zookeeper集群中,會選舉出一個節(jié)點為leader,其余節(jié)點為follower。下面說下選舉機制的兩種情況:

1. 新啟動的zookeeper集群(從未選舉成功過)

新配置的zookeeper集群依次,它們都是最新啟動的,也就是沒有歷史數(shù)據(jù),在存放數(shù)據(jù)量這一點上都是一樣的。一般這種情況下,ID大的的會被選舉為Leader。

http://www.itdecent.cn/p/c2ced54736aa

2. 非全新集群(數(shù)據(jù)恢復(fù))

初始化的時候,是按照上述的說明進行選舉的,但是當zookeeper運行了一段時間之后,有機器down掉,重新選舉時,選舉過程就相對復(fù)雜了。需要加入數(shù)據(jù)id、leader id和邏輯時鐘。

  • 數(shù)據(jù)id:數(shù)據(jù)新的id就大,數(shù)據(jù)每次更新都會更新id。
  • Leader id:就是我們配置的myid中的值,每個機器一個。
  • 邏輯時鐘:這個值從0開始遞增,每次選舉對應(yīng)一個值,也就是說: 如果在同一次選舉中,那么這個值應(yīng)該是一致的 ; 邏輯時鐘值越大,說明這一次選舉leader的進程更新.
    選舉的標準就變成:
  1. 邏輯時鐘小的選舉結(jié)果被忽略,重新投票
  2. 統(tǒng)一邏輯時鐘后,數(shù)據(jù)id大的勝出
  3. 數(shù)據(jù)id相同的情況下,leader id大的勝出

根據(jù)這個規(guī)則選出leader。

搭建三臺zookeeper集群

先準備好三臺CentOS 7服務(wù)器,服務(wù)器安裝Java1.8 +環(huán)境。

1. 安裝Java 1.8

略。

2. 安裝zookeeper

截止寫這篇文檔,zookeeper的穩(wěn)定版 最新版本為:zookeeper-3.4.13。以下操作三臺機器相同,不同處有標注。

# wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
# tar -zxvf zookeeper-3.4.13.tar.gz -C /opt/
# ln -s /opt/zookeeper-3.4.13/ /opt/zookeeper
# vim /etc/profile.d/zookeeper.sh
export ZK_HOME=/opt/zookeeper
export PATH=$PATH:$ZK_HOME/bin
# source /etc/profile.d/zookeeper.sh
# rm /opt/zookeeper/bin/*.cmd
# cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
# vim /opt/zookeeper/conf/zoo.cfg
dataDir=/opt/zookeeper/data
dataLogDir=/opt/zookeeper/logs
server.1=172.16.5.137:2888:3888
server.2=172.16.5.138:2888:3888
server.3=172.16.5.139:2888:3888
# mkdir -p /opt/zookeeper/{logs,data}

每臺Server ID寫入文件,三臺不相同
# echo 3 > /opt/zookeeper/data/myid
# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
配置文件說明:
  • tickTime:這個時間是作為zookeeper服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時間間隔,也就是說每個tickTime時間就會發(fā)送一個心跳。
  • initLimit:這個配置項是用來配置zookeeper接受客戶端(這里所說的客戶端不是用戶連接zookeeper服務(wù)器的客戶端,而是zookeeper服務(wù)器集群中連接到leader的follower 服務(wù)器)初始化連接時最長能忍受多少個心跳時間間隔數(shù)。當已經(jīng)超過10個心跳的時間(也就是tickTime)長度后 zookeeper 服務(wù)器還沒有收到客戶端的返回信息,那么表明這個客戶端連接失敗??偟臅r間長度就是 10*2000=20秒。
  • syncLimit:這個配置項標識leader與follower之間發(fā)送消息,請求和應(yīng)答時間長度,最長不能超過多少個tickTime的時間長度,總的時間長度就是5*2000=10秒。
  • dataDir:顧名思義就是zookeeper保存數(shù)據(jù)的目錄,默認情況下zookeeper將寫數(shù)據(jù)的日志文件也保存在這個目錄里;
  • clientPort:這個端口就是客戶端連接Zookeeper服務(wù)器的端口,Zookeeper會監(jiān)聽這個端口接受客戶端的訪問請求;
  • server.A=B:C:D:中的A是一個數(shù)字,表示這個是第幾號服務(wù)器,B是這個服務(wù)器的IP地址,C第一個端口用來集群成員的信息交換,表示這個服務(wù)器與集群中的leader服務(wù)器交換信息的端口,D是在leader掛掉時專門用來進行選舉leader所用的端口。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容