搭建zookeeper集群

首先簡單介紹一下zookeeper

zookeeper的重要概念

  • znode
    zookeeper在使用時不直接暴露原語,使用的時由一小部分調(diào)用方法組成的類似樹狀文件系統(tǒng)的API豆混,以便我們實現(xiàn)自己的原語忘分,增加使用的靈活性瑞眼。而由我們自己維護的這個文件系統(tǒng)的每一個數(shù)據(jù)節(jié)點稱為znode曹抬。其中znode可以分為兩種節(jié)點,臨時節(jié)點和持久節(jié)點关翎,他們的區(qū)別是扛门,持久節(jié)點只能通過delete的操作刪除,而臨時節(jié)點當客戶端失去與zookeeper的連接時便會被刪除,當然臨時節(jié)點也可以被delete操作刪除纵寝。zookeeper暴露了六個API供我們維護這個文件系統(tǒng),create星立、delete爽茴、exists、setData绰垂、getData室奏、getChildren。
  • 版本
    zookeeper為了管理集群服務劲装,在每個znode上面都會設置一個版本號胧沫,類似于SVN的管理,當一個znode被創(chuàng)建后占业,每次數(shù)據(jù)變化都會變更版本號绒怨,當多個客戶端操作同一個znode的時候,會進行版本號對比谦疾,如果對不上版本時南蹂,操作便不會成功,就像SVN同一個版本check下來的項目念恍,別人先commit了六剥,自己就commit不了了晚顷。
  • 會話
    客戶端與服務端建立的TCP長連接,這個會話能夠進行心跳檢測疗疟、Watch事件该默、發(fā)送請求、接收響應等多個工作策彤,而且每個會話都有各自的SessionID权均,全局唯一。
  • 監(jiān)視器
    zookeeper分布式很重要的特性锅锨,通過注冊和通知實現(xiàn)分布式協(xié)調(diào)服務叽赊。
  • ACL
    與Linux的文件系統(tǒng)ACL權(quán)限控制相似,zookeeper可以對每個節(jié)點進行ACL權(quán)限控制
  • zookeeper仲裁
    在集群模式下必搞,每個客戶端發(fā)起的請求會同步到各個機器節(jié)點上必指,然后再返回信息給客戶端,但是如果在一個大集群中存在網(wǎng)絡延遲恕洲、機器性能等問題時塔橡,要在同步到全部節(jié)點上顯得處理時間太長,為解決這個問題就引出仲裁霜第,而這個仲裁的基礎是zookeeper判斷集群健壯性的原則(n/2+1)葛家。所謂仲裁,就是眾人成虎泌类,假設集群節(jié)點數(shù)為n癞谒,那么只要客戶端的請求同步到n/2+1的節(jié)點上,就能保證這個請求在正常的集群狀態(tài)下最終一定能同步到全部節(jié)點上刃榨。因此這個n/2+1既是健壯性原則弹砚,也是zookeeper仲裁法定人數(shù)的最小值。
    舉個例子:現(xiàn)在有5個節(jié)點枢希,客戶端向節(jié)點1發(fā)起了請求桌吃,節(jié)點1同步信息到節(jié)點2了,如果這時我們設定的法定人數(shù)為2苞轿,那么集群就會認為可以給客戶端返回請求確認的信息了茅诱,然而在返回與客戶端發(fā)起監(jiān)聽的過程中,1搬卒、2節(jié)點掛了瑟俭,與客戶端的連接也丟失了,這時3秀睛、4尔当、5節(jié)點正常,正常節(jié)點大于n/2,所以zookeeper覺得集群正常椭迎,就繼續(xù)工作锐帜,然而3、4畜号、5節(jié)點還沒來得及同步客戶端的請求缴阎,那么客戶端重新連接過來時,發(fā)起的監(jiān)聽請求就找不到要監(jiān)聽的節(jié)點了简软,這就造成了數(shù)據(jù)的丟失了蛮拔。

zookeeper概述

  • ZooKeeper 是一個開源的分布式協(xié)調(diào)服務,ZooKeeper框架最初是在“Yahoo!"上構(gòu)建的痹升,用于以簡單而穩(wěn)健的方式訪問他們的應用程序建炫。 后來,Apache ZooKeeper成為Hadoop疼蛾,HBase和其他分布式框架使用的有組織服務的標準肛跌。
  • ZooKeeper 是一個典型的分布式數(shù)據(jù)一致性解決方案,分布式應用程序可以基于 ZooKeeper 實現(xiàn)諸如數(shù)據(jù)發(fā)布/訂閱察郁、負載均衡衍慎、命名服務、分布式協(xié)調(diào)/通知皮钠、集群管理稳捆、Master 選舉、分布式鎖和分布式隊列等功能麦轰。
  • Zookeeper 一個最常用的使用場景就是用于擔任服務生產(chǎn)者和服務消費者的注冊中心乔夯。 服務生產(chǎn)者將自己提供的服務注冊到Zookeeper中心,服務的消費者在進行服務調(diào)用的時候先到Zookeeper中查找服務原朝,獲取到服務生產(chǎn)者的詳細信息之后驯嘱,再去調(diào)用服務生產(chǎn)者的內(nèi)容與數(shù)據(jù)。

zookeeper特點

  • zookeeper是一個用java編寫的分布式程序喳坠。
  • zookeeper將數(shù)據(jù)保存在內(nèi)存中,這也就保證了數(shù)據(jù)的高吞吐量和低延遲茂蚓。
  • zookeeper的數(shù)據(jù)節(jié)點有臨時和持久的類型壕鹉。
  • Zookeeper底層只提供了兩個功能:1、管理(存儲聋涨、讀攘涝 )用戶程序提交的數(shù)據(jù);2牍白、為用戶程序提交數(shù)據(jù)節(jié)點監(jiān)聽服務脊凰。

zookeeper模式

  • zookeeper獨立模式
    只有一個單獨的zookeeper服務器,zookeeper狀態(tài)無法復制。

  • zookeeper仲裁模式
    具有一組zookeeper服務器狸涌,它們之間可以進行狀態(tài)的復制和同時為客戶端服務切省。

這里要明確的一點是,我們說的zookeeper服務器不是我們硬件意義上的一臺服務器帕胆,而是該服務器上部署了一個zookeeper朝捆,就是說我們一臺硬件意義上的服務器可以部署多個zookeeper,并且成功通訊懒豹,這樣的模式也是仲裁模式芙盘。==

安裝過程

# 新建一個zookeeper用戶
cd /export/server
tar -xvzf apache-zookeeper-3.5.7.tar.gz
mv apache-zookeeper-3.5.7  zookeeper3.5.7
  • 配置JDK環(huán)境變量
    vi ~/.bash_profile脸秽,添加:
JAVA_HOME=/usr/java/jdk1.8.0_141”
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
Export PATH

source ~/.bash_profile

  • 修改配置文件
cp /export/server/zookeeper3.5.7/conf/zoo_sample.cfg /export/server/zookeeper3.5.7/conf/zoo.cfg

配置文件參考下面即可

[root@server2 test]# vim /export/server/zookeeper3.5.7/conf/zoo.cfg | grep -v "#"
### 必要配置(沒有默認值)
# 心跳檢測時間儒老,單位ms(毫秒),一般為3000毫秒记餐,設置更低的值可以更早發(fā)現(xiàn)服務器超時問題
tickTime=2000
# 內(nèi)存數(shù)據(jù)庫保存的模糊快照目錄驮樊,集群的id文件也需要再這個目錄下
dataDir=/epxort/server/zookeeper3.5.7/data
# 事務日志目錄
dataLogDir=/export/server/zookeeper3.5.7/log
#服務器建婷端口,客戶端的連接會發(fā)到這個端口
clientPort=52181
# 四字命令白名單剥扣,為了方便監(jiān)控巩剖,給出了這些命令權(quán)限
4lw.commands.whitelist=mntr,stat,cons,conf
## 集群配置
# follower連接到leader是的超時值,時間為10個ticktime钠怯,即20秒佳魔,因為連接過程中會做相當?shù)臄?shù)據(jù)同步,如果內(nèi)存數(shù)據(jù)較大可以適當增加該值
initLimit=10
# follower與leader同步的超時值晦炊,時間為5個ticktime鞠鲜,即10秒,如果網(wǎng)絡延遲較大或事務日志較多断国,可以適當增大該值
syncLimit=5
# 集群服務器配置參數(shù)贤姆,格式為server.x=ip:port1:port2[:observer],port1用于事務日志同步稳衬,port2用于leader選舉霞捡,observer配置可以讓服務器變成觀察者模式,如需要使用觀察者薄疚,需要在觀察者服務器新增一行配置 peerType=observer
server.1=ip1:2222:2223
server.2=ip2:3333:3334
server.3=ip3:4444:4445
(上面ip1/2/3具體為對應集群主機的ip碧信,集群中所有主機的ip都要配上去。配置文件支持主機名代替ip街夭,但是需要配置好主機名和機器上主機名解析等配置砰碴,因此直接使用ip較為簡單直觀)
## 集群配置
### 必要配置(沒有默認值)
### 可選配置(有默認值)
## 存儲配置
# 預分配的事務日志文件大小,單位是KB板丽,默認值為64MB呈枉,但是往往不會達到這么大,設置該值可基于snapCount值和平局事務大小情況而定,必要時增大該值猖辫。默認的preAllocSize適用于默認的snapCount值和平均事務超過512KB的情況酥泞。
preAllocSize=10240
# 每次快照之間的事務數(shù),默認值是100000住册,因為進行快照時會影響性能婶博,所以不應該設置太小。
# snapCount=100000
# 對快照和日志進行垃圾回收操作荧飞,單位是小時凡人,默認值是0,0代表不會執(zhí)行清理操作叹阔,現(xiàn)設置為20天清理一次挠轴,其實就是定時執(zhí)行了zk的bin目錄下的zkCleanup.sh腳本。
Autopurge.purgeInterval=480
# 執(zhí)行清理操作時耳幢,保留的快照梳理和其對應的事務日志文件數(shù)量岸晦,默認是3,也是最小值睛藻,即保留3個文件
Autopurge.snapRetainCount=10
## 存儲配置
## 擴展配置
# 如要禁用jetty程序启上,可使用這配置
# admin.enableServer=false
# jetty監(jiān)聽端口
admin.serverPort=58080
## 擴展配置
### 可選配置(有默認值)

#上面ip1/2/3具體為對應集群主機的ip,集群中所有主機的ip都要配上去店印。配置文件支持主機名代替ip冈在,但是需要配置好主機名和機器上主機名解析等配置,因此直接使用ip較為簡單直觀
  • 日志配置
vi /export/server/zookeeper3.5.7/conf/log4j.properties按摘,修改以下配置:
zookeeper.root.logger=INFO, CONSOLE,ROLLINGFILE
zookeeper.log.dir=/export/server/zookeeper3.5.7/logs
log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender

以上過程3臺服務器都要執(zhí)行

  • 創(chuàng)建myid
    這個步驟需要分別在server1,server2,server3創(chuàng)建不同的id來區(qū)分集群的機器包券,而且這個id必須跟上面zoo.cfg中server.后面的數(shù)字對應。
server1: echo “1” > /export/server/zookeeper3.5.7/data/myid
Server2: echo “2” > /export/server/zookeeper3.5.7/data/myid
Server3: echo “3” > /export/server/zookeeper3.5.7/data/myid
  • 啟動
    zookeeper提供兩種啟動方式:
    1.zkServer.sh start-foreground(有啟動日志顯示炫贤,方便查看配置環(huán)境是否有錯誤)
    2.zkServer.sh start(沒有明顯日志溅固,成功或失敗都不會顯示,需要自行查看運行日志)
    這里使用第二種方式兰珍。
    建立啟動腳本:
cd ~/bin/
vi start_zookeeper.sh窘行,添加 :
cd /export/server/zookeeper3.5.7/bin
./zkServer.sh start

啟動完成后
./zkServer.sh status 或者 echo stat | nc localhost 52181獲取服務狀態(tài)欣范,確認是否啟動成功熄守。成功的話就可以看到集群的主從關(guān)系慷荔。(注意新版本3.4.10以后需要把需要用的四字命令加到配置文件白名單才可以使用四字命令,在zoo.cfg添加4lw.commands.whitelist=stat)

  • 詳細配置
參數(shù) 說明
clientPort 客戶端連接server的端口口柳,即對外服務端口,一般設置為2181吧有滑。
dataDir 存儲快照文件snapshot的目錄跃闹。默認情況下,事務日志也會存儲在這里。建議同時配置參數(shù)dataLogDir, 事務日志的寫性能直接影響zk性能望艺。
tickTime ZK中的一個時間單元苛秕。ZK中所有時間都是以這個時間單元為基礎,進行整數(shù)倍配置的找默。例如艇劫,session的最小超時時間是2*tickTime。
dataLogDir 事務日志輸出目錄惩激。盡量給事務日志的輸出配置單獨的磁盤或是掛載點店煞,這將極大的提升ZK性能。
globalOutstandingLimit 最大請求堆積數(shù)风钻。默認是1000顷蟀。ZK運行的時候, 盡管server已經(jīng)沒有空閑來處理更多的客戶端請求了骡技,但是還是允許客戶端將請求提交到服務器上來鸣个,以提高吞吐性能。當然布朦,為了防止Server內(nèi)存溢出囤萤,這個請求堆積數(shù)還是需要限制下的。
preAllocSize 預先開辟磁盤空間是趴,用于后續(xù)寫入事務日志涛舍。默認是64M,每個事務日志大小就是64M右遭。如果ZK的快照頻率較大的話做盅,建議適當減小這個參數(shù)。
snapCount 每進行snapCount次事務日志輸出后窘哈,觸發(fā)一次快照(snapshot), 此時吹榴,ZK會生成一個snapshot.文件,同時創(chuàng)建一個新的事務日志文件log.滚婉。默認是100000.(真正的代碼實現(xiàn)中图筹,會進行一定的隨機數(shù)處理,以避免所有服務器在同一時間進行快照而影響性能)
traceFile 用于記錄所有請求的log让腹,一般調(diào)試過程中可以使用远剩,但是生產(chǎn)環(huán)境不建議使用,會嚴重影響性能骇窍。
maxClientCnxns 單個客戶端與單臺服務器之間的連接數(shù)的限制瓜晤,是ip級別的,默認是60腹纳,如果設置為0痢掠,那么表明不作任何限制驱犹。請注意這個限制的使用范圍,僅僅是單臺客戶端機器與單臺ZK服務器之間的連接數(shù)限制足画,不是針對指定客戶端IP雄驹,也不是ZK集群的連接數(shù)限制,也不是單臺ZK對所有客戶端的連接數(shù)限制淹辞。指定客戶端IP的限制策略医舆,這里有一個patch,可以嘗試一下:http://rdc.taobao.com/team/jm/archives/1334
clientPortAddress 對于多網(wǎng)卡的機器象缀,可以為每個IP指定不同的監(jiān)聽端口蔬将。默認情況是所有IP都監(jiān)聽clientPort指定的端口。New in 3.3.0
minSessionTimeoutmaxSessionTimeout Session超時時間限制攻冷,如果客戶端設置的超時時間不在這個范圍娃胆,那么會被強制設置為最大或最小時間。默認的Session超時時間是在2 * tickTime ~ 20 * tickTime這個范圍 New in 3.3.0
fsync.warningthresholdms 事務日志輸出時等曼,如果調(diào)用fsync方法超過指定的超時時間里烦,那么會在日志中輸出警告信息。默認是1000ms禁谦。
autopurge.purgeInterval 在上文中已經(jīng)提到胁黑,3.4.0及之后版本,ZK提供了自動清理事務日志和快照文件的功能州泊,這個參數(shù)指定了清理頻率丧蘸,單位是小時,需要配置一個1或更大的整數(shù)遥皂,默認是0力喷,表示不開啟自動清理功能。
autopurge.snapRetainCount 這個參數(shù)和上面的參數(shù)搭配使用演训,這個參數(shù)指定了需要保留的文件數(shù)目弟孟。默認是保留3個。
electionAlg 在之前的版本中样悟, 這個參數(shù)配置是允許我們選擇leader選舉算法拂募,但是由于在以后的版本中,只會留下一種“TCP-based version of fast leader election”算法窟她,所以這個參數(shù)目前看來沒有用了陈症,這里也不詳細展開說了。
initLimit Follower在啟動過程中震糖,會從Leader同步所有最新數(shù)據(jù)录肯,然后確定自己能夠?qū)ν夥盏钠鹗紶顟B(tài)。Leader允許F在initLimit時間內(nèi)完成這個工作吊说。通常情況下嘁信,我們不用太在意這個參數(shù)的設置于样。如果ZK集群的數(shù)據(jù)量確實很大了,F(xiàn)在啟動的時候潘靖,從Leader上同步數(shù)據(jù)的時間也會相應變長,因此在這種情況下蚤蔓,有必要適當調(diào)大這個參數(shù)了
syncLimit 在運行過程中卦溢,Leader負責與ZK集群中所有機器進行通信,例如通過一些心跳檢測機制秀又,來檢測機器的存活狀態(tài)单寂。如果L發(fā)出心跳包在syncLimit之后,還沒有從F那里收到響應吐辙,那么就認為這個F已經(jīng)不在線了宣决。注意:不要把這個參數(shù)設置得過大,否則可能會掩蓋一些問題昏苏。
leaderServes 默認情況下尊沸,Leader是會接受客戶端連接,并提供正常的讀寫服務贤惯。但是洼专,如果你想讓Leader專注于集群中機器的協(xié)調(diào),那么可以將這個參數(shù)設置為no孵构,這樣一來屁商,會大大提高寫操作的性能。
server.x=[hostname]:nnnnn[:nnnnn] 這里的x是一個數(shù)字颈墅,與myid文件中的id是一致的蜡镶。右邊可以配置兩個端口,第一個端口用于F和L之間的數(shù)據(jù)同步和其它通信恤筛,第二個端口用于Leader選舉過程中投票通信官还。
group.x=nnnnn[:nnnnn]weight.x=nnnnn 對機器分組和權(quán)重設置,可以 參見這里
cnxTimeout Leader選舉過程中叹俏,打開一次連接的超時時間妻枕,默認是5s。ZK權(quán)限設置相關(guān)粘驰,具體參見《使用super身份對有權(quán)限的節(jié)點進行操作》 和 《ZooKeeper權(quán)限控制》
skipACL 對所有客戶端請求都不作ACL檢查屡谐。如果之前節(jié)點上設置有權(quán)限限制,一旦服務器上打開這個開頭蝌数,那么也將失效愕掏。
forceSync 這個參數(shù)確定了是否需要在事務日志提交的時候調(diào)用FileChannel.force來保證數(shù)據(jù)完全同步到磁盤。
jute.maxbuffer 每個節(jié)點最大數(shù)據(jù)量顶伞,是默認是1M饵撑。這個限制必須在server和client端都進行設置才會生效剑梳。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滑潘,隨后出現(xiàn)的幾起案子垢乙,更是在濱河造成了極大的恐慌,老刑警劉巖语卤,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件追逮,死亡現(xiàn)場離奇詭異,居然都是意外死亡粹舵,警方通過查閱死者的電腦和手機钮孵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眼滤,“玉大人巴席,你說我怎么就攤上這事∽缧瑁” “怎么了漾唉?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诱担。 經(jīng)常有香客問我毡证,道長,這世上最難降的妖魔是什么蔫仙? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任料睛,我火速辦了婚禮,結(jié)果婚禮上摇邦,老公的妹妹穿的比我還像新娘恤煞。我一直安慰自己,他們只是感情好施籍,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布居扒。 她就那樣靜靜地躺著,像睡著了一般丑慎。 火紅的嫁衣襯著肌膚如雪喜喂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天竿裂,我揣著相機與錄音玉吁,去河邊找鬼。 笑死腻异,一個胖子當著我的面吹牛进副,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悔常,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼影斑,長吁一口氣:“原來是場噩夢啊……” “哼给赞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起矫户,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤片迅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吏垮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體障涯,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年膳汪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片九秀。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡遗嗽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鼓蜒,到底是詐尸還是另有隱情痹换,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布都弹,位于F島的核電站娇豫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏畅厢。R本人自食惡果不足惜冯痢,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望框杜。 院中可真熱鬧浦楣,春花似錦、人聲如沸咪辱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽油狂。三九已至历恐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間专筷,已是汗流浹背弱贼。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仁堪,地道東北人哮洽。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像弦聂,于是被迫代替她去往敵國和親鸟辅。 傳聞我的和親對象是個殘疾皇子氛什,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350