zookeeper須要java1.6以上java
調整好jvm大小,別放在引發swap環境,zookeeper的及時性,不容許swapnode
#################################################################################數據庫
zookeeper數據目錄包含由服務器存儲的持久化拷貝文件,包括:快照和事務日誌文件apache
事務日誌:znode的變化追加到事務日誌vim
快照:事務日誌達到必定大小後,寫入系統,這個快照取代全部的以往日誌緩存
默認zookeeper配置不會刪除老版本快照和日誌文件,須要管理員手動刪除安全
dataDir version目錄下,log開頭的是事務日誌文件,snapshot開頭的是快照bash
清理日誌 dataDir存儲快照snapshot目錄,默認狀況下,事物日誌也在這個,能夠給事物日誌單獨設置一個掛載點或者磁盤,提升zk性能(dataLogDir)服務器
autopurge.snapRetainCount和autopurge.purgeInterval網絡
能夠在配置文件啓用這兩個參數來定時清理事務日誌和快照
autopurge.purgeInterval 這個參數指定了清理頻率,單位是小時,須要填寫一個1或更大的整數,默認是0,表示不開啓本身清理功能。
autopurge.snapRetainCount 這個參數和上面的參數搭配使用,這個參數指定了須要保留的文件數目。默認是保留3個。
監管進程,當zookeeper宕掉後,能夠從新啓動,加入集羣
##################################################################################
1.安裝daemontools 守護進程
mkdir /package
chmod 755 /package
cd /package
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
tar zxf daemontools-0.76.tar.gz
cd admin/daemontools-0.76
vim src/error.h 找到:extern int errno; 改爲:#include <errno.h>
package/install
2.監控zookeeper
cd /service
mkdir zookeeper
cd zookeeper
vim run
chmod 755 run
run內容以下:
#!/bin/bash
exec 2>&1
exec /root/zookeeper/zookeeper-3.4.5/bin/zkServer.sh start
3.運行supervise
親測這個仍是要一直輸出日誌,因此我啓動的時候, supervise /service/zookeeper >>/dev/null &
nohup supervise /service/zookeeper & 這樣啓動,會在當前目錄輸出nohup.out日誌
#####################################################################################
監控zookeeper
使用4字符命令或jmx,額,我用的4字符命令,我的感受方便點╮(╯▽╰)╭
conf
輸出相關服務配置的詳細信息。
cons
列出全部鏈接到服務器的客戶端的徹底的鏈接 / 會話的詳細信息。包括「接受 / 發送」的包數量、會話 id 、操做延遲、最後的操做執行等等信息。
dump
列出未經處理的會話和臨時節點。
envi
輸出關於服務環境的詳細信息(區別於 conf 命令)。
reqs
列出未經處理的請求
ruok
測試服務是否處於正確狀態。若是確實如此,那麼服務返回「 imok 」,不然不作任何相應。
stat
輸出關於性能和鏈接的客戶端的列表。
wchs
列出服務器 watch 的詳細信息。
wchc
經過 session 列出服務器 watch 的詳細信息,它的輸出是一個與 watch 相關的會話的列表。
wchp
經過路徑列出服務器 watch 的詳細信息。它輸出一個與 session 相關的路徑。
#################################################################################
故障排除
zookeeper集羣,其中一個服務器裏面的事務日誌文件損壞,可能不能讀取數據,在加載
Zookeeper數據庫時你會看到一些IOException,這個用四字符命令,nc stat|nc ip port
查看其它節點是否正常, 若是正常,清理事物日誌文件和快照,而後重啓服務器便可
##################################################################################
最小配置
clientPort 監聽客戶端鏈接的端口
dataDir,存儲內存數據庫快照的位置,若是不配置dataLogDir的話,更新的事物日誌也會存在這裏
存放事物日誌的地方,保持好良好的新能,否則儲存到忙碌的地方,會下降性能
tikeTime,它是zookeeper使用的基本時間單位,毫秒,用於控制心跳和超時,如最小session超時是兩倍的ticks
initLimit從leader那裏同步數據的時間,不用特地在乎,只有zookeeper比較大的時候,須要調整大一點
syncLimit檢測心跳的時間,leander服務器發出心跳包,在超過這個時間尚未收到F服務器的反饋信息,那麼就鏈接失敗,不用設置過大,會掩蓋一些問題
高級配置:
如下配置可選,可優化zookeeper的性能
dataLogDir,這個選項是把事物日誌寫到這個配置文件路徑下,這就容許使用單獨的日誌設備,避免快照和日誌之間競爭
注意:
專用日誌設備對吞吐量和穩定的延遲有不少影響,建議使用專業的日誌設備,並確保dataDir不在這個日誌設備上
globalOutstandingLimit
客戶端提交的請求速度快於zookeeper的處理速度,若是有不少客戶端的時候,爲了不排隊請求過多消耗內存,對客戶端未完成的排隊
請求不超過1千個(默認)
preAllocSize
爲了不在preAllocSize kb的塊的事務日誌裏尋找分配的空間。默認此配置項是64M。
若是日誌文件不會變得更大的話,能夠減小這個配置項的值。由於在每個快照結束時會開始生成一個新的日誌文件,
若是在兩次快照的間隔期間的那個事務日誌大小達不到64M的話,那麼須要調低這個值,以避免形成空間浪費。
例如,若是咱們每執行1000個事務就生成一次快照,一個事務的大小 平均爲100字節,那麼把preAllocSize配置成100KB就更合適。
默認的preAllocSize的值對於「默認的snapCount值,事務大小 平均值大於512字節」的狀況是適用的。
snapCount
zookeeper記錄事物到事物日誌,到了snapCount個事物日誌以後,會啓動一個快照的建立
並新建一個事務日誌,默認snapCount參數是100000
traceFile
會把操做打印調試信息,會影響性能,不建議和事物日誌一個盤
maxClientCnxns
單個客戶端併發數鏈接數,經過ip識別,默認限制數是60,若是設置爲0,不對併發數作限制
測試:我設置我1的時候,只能鏈接兩個客戶端,當鏈接第三個的時候失敗
maxSessionTimeout
最大session超時時間,默認是20倍的tickTime
fsync.warningthresholdms
事物日誌所用的時間大於這個值的時候,會輸入警告信息,單位毫秒,默認1000
autopurge.snapRetainCount
保留多少個最近的快照和各類對應的事物日誌,並刪除之前的,默認值是3,最小是3
syncEnabled
觀察者記錄事務和快照到硬盤。這下降觀察者重啓的恢復時間。設置"false"禁用這個功能。默認是"true"
#######################################################################################
集羣選項
electionAlg
用於選舉實現。"0"表明原始的UDP版本,"1"表明快速領導者選舉的不受權的UDP版本,
"2"表明受權的快速領導者選舉的UDP版本,"3"表明快速領導者選舉的TCP版本。當前,默認值是3.
注意
領導者選舉0,1,2的實現如今是棄用的。咱們計劃在下個發佈版本里移除他們,到那時只有FastLeaderElection可用(只有3可用)。
initLimit
時間數量,單位是ticks,容許追隨者鏈接和同步leader。根據須要增長這個值,若是Zookeeper管理的數據量很是大
和leader同步數據的時間,若是數據量比較大,能夠設置大一些,默認爲10,即10個ticktime
leaderServers
leader接收客戶端鏈接,默認是yes
注意
Zookeeper集羣大於3臺機器時強烈建議開啓領導者選舉。
server.x=[hostname]:nnnnn[:nnnnn],等等
(沒有Java系統屬性)
組成Zookeeper機器的服務器。當服務啓動時,經過查找數據目錄裏的myid文件肯定它是哪一個服務器。
那個文件包含服務器號,ASCII的形式,而且應該匹配左邊server.x裏的x。
使用Zookeeper服務的服務器的客戶端必須匹配每一個Zookeeper服務。
有兩個端口號nnnnn。第一個用於鏈接領導者,第二個用於領導者選舉。
領導者選舉端口只在electionAlg是一、二、3時必要。若是electionAlg是0,第二個端口就不必。
若是你想在單機上測試多服務,每一個服務要使用不一樣的端口。
syncLimit
檢測心跳。若是leader沒有在這個時間內收到fllower的應答,則移除集羣,全部
鏈接這個fllower的客戶端所有轉移到其它成員上
group.x=nnnnn[:nnnnn]
(沒有Java系統屬性)
啓用分層的法定人數構造。"x"是group標識符,"="後面的數字對應服務標識符。
左邊的任務是冒號分隔的服務標識符。注意groups必須是不相交的而且全部groups聯盟必須是Zookeeper全體。
weight.x=nnnnn
兼用"group",當造成法定人數時它給服務分配一個權重。投票時這個值對應服務的權重。Zookeeper的一些部分要求投票如領導者選舉和自動廣播協議。
默認服務器的權重是1.若是配置定義了groups,但不是權重,將會給全部的服務器權重設置爲1.
cnxTimeout
設置領導者選舉通知打開鏈接的超時值。只適用於electionAlg3。
注意
默認值是5秒
##########################################################################
使用Netty框架通訊
3.4新加入:Netty是一個基於NIO的客戶端/服務端通訊框架,它簡化了Java應用不少複雜的網絡層通訊。此外Netty框架支持數據加密(SSL)和身份驗證(證書)。還有可選擇的功能能夠獨立的開啓或關閉。
在版本3.4以前Zookeeper一直直接使用NIO,然而在版本3.4和之後的版本支持NIO選擇Netty。NIO仍然是默認值,然而基於Netty的通訊能夠經過設置環境變量"zookeeper.serverCnxnFactory"爲"org.apache.zookeeper.server.NettyServerCnxnFactory"使用。能夠在客戶端或服務端設置這個選項,通常兩邊都設置,這個由你決定。
TBD - netty的調優選項
TBD - 怎麼管理數據加密
TBD - 怎麼管理證書
###############################################################################
不安全選項
下面的選項能夠用,但用的時候要當心。每一個的風險說明和變量一塊兒。
forceSync
(Java系統屬性:zookeeper.forceSync)
在完成處理更新以前要求經過更新事務日誌的媒介。若是這個選項設置爲no,Zookeeper將不要求同步更新媒介。
jute.maxbuffer:
(Java系統屬性:jute.maxbuffer)
此選擇系能夠經過Java系統屬性設置。沒有zookeeper前綴。它指定znode中能夠存儲的數據的最大值。默認是0xffffff,或低於1M。若是這個選項變了,系統屬性必須在全部服務器和客戶端上設置,不然會出現問題。這確實是一個合理性檢查。Zookeeper用來存儲數據大約在KB大小。
skipACL
(Java系統屬性:zookeeper.skipACL)
跳過ACL檢查。這會增長吞吐量,可是會像全部人打開完整的訪問權限
quorumListenOnAllIPs
設置爲true時,Zookeeper服務器將監聽全部同行可用IP地址的鏈接,而且不僅是服務器裏配置的地址。它影響鏈接處理ZAB協議和快速領導者選舉協議。默認是false。
##################################################################################
要避免的事情
下面的問題能夠經過Zookeeper正確的配置避免:
不一致的服務器清單
客戶端使用的Zookeeper服務器清單必須和每一個Zookeeper服務的一致。每一個Zookeeper服務配置文件的服務器清單應該和其餘的一致。
不正確的事務日誌放置
Zookeeper性能的關鍵部分是事務日誌。Zookeeper在響應以前同步事務到媒介。一個專用的事務日誌裝置是保持良好性能的關鍵。將日誌放置在繁忙的裝置上會嚴重影響性能。若是你只有一個存儲設備,將跟蹤文件放置在NFS上並增長snapshotCount;這不能解決問題,但能改善。
不正確的Java堆大小
你應該特別注意正確的設置Java最大堆大小。特別的是,你不該該營造Zookeeper交換磁盤的狀況。磁盤可以讓Zookeeper死亡。每一個事情都是有序的,因此若是處理一個請求交換磁盤,全部其餘隊列裏的請求極可能會作一樣的事情。磁盤,不要SWAP。
保守估計:若是你有4G的RAM,不用設置Java最大堆大小爲6G或4G。
例如,4G的機器更建議你使用3G的堆,由於操做系統和緩存也須要內存。
堆大小的最佳推薦,你的系統須要運行負載測試,而後確保使用在引發系統交換的限制如下。