Zookeeper配置引數詳解
引數
說明
clientPort
客戶端連線server的埠,即zk對外服務埠,一般設定為2181。
dataDir
就是把記憶體中的資料儲存成快照檔案snapshot的目錄,同時myid也儲存在這個目錄下(myid中的內容為本機server服務的標識)。寫快照不需要單獨的磁碟,而且是使用後臺執行緒進行非同步寫資料到磁碟,因此不會對記憶體資料有影響。預設情況下,事務日誌也會儲存在這裡。建議同時配置引數dataLogDir, 事務日誌的寫效能直接影響zk效能。
tickTime
ZK中的一個時間單元。ZK中所有時間都是以這個時間單元為基礎,進行整數倍配置的。例如,session的最小超時時間是2*tickTime。預設3000毫秒。這個單元時間不能設定過大或過小,過大會加大超時時間,也就加大了叢集檢測session失效時間;設定過小會導致session很容易超時,並且會導致網路通訊負載較重(心跳時間縮短)
dataLogDir
事務日誌輸出目錄。儘量給事務日誌的輸出配置單獨的磁碟或是掛載點,這將極大的提升ZK效能。 由於事務日誌輸出時是順序且同步寫到磁碟,只有從磁碟寫完日誌後才會觸發follower和leader發回事務日誌確認訊息(zk事務採用兩階段提交),因此需要單獨磁碟避免隨機讀寫和磁碟快取導致事務日誌寫入較慢或儲存在快取中沒有寫入。
globalOutstandingLimit
最大請求堆積數。預設是1000。ZK執行的時候, 儘管server已經沒有空閒來處理更多的客戶端請求了,但是還是允許客戶端將請求提交到伺服器上來,以提高吞吐效能。當然,為了防止Server記憶體溢位,這個請求堆積數還是需要限制下的。當有非常多的客戶端並且請求都比較大時,可以減少這個值,不過這種情況很少。 (Java system property:zookeeper.globalOutstandingLimit)
preAllocSize
預先開闢磁碟空間,用於後續寫入事務日誌。預設是64M,每個事務日誌大小就是64M,這個預設大小是按snapCount為100000且每個事務資訊為512b來計算的。如果ZK的快照頻率較大的話,建議適當減小這個引數。(Java system property:zookeeper.preAllocSize)。當事務日誌檔案不會增長得太大的話,這個大小是可以減小的。比如1000次事務會新產生一個快照(引數為snapCount),新產生快照後會用新的事務日誌檔案,假設一個事務資訊大小100b,那麼事務日誌預開闢的大小為100kb會比較好。
snapCount
每進行snapCount次事務日誌輸出後,觸發一次快照(snapshot), 此時,ZK會生成一個snapshot.檔案,同時建立一個新的事務日誌檔案log.
traceFile
用於記錄所有請求的log,一般除錯過程中可以使用,但是生產環境不建議使用,會嚴重影響效能。(Java system property:requestTraceFile)
maxClientCnxns
單個客戶端與單臺伺服器之間的連線數的限制,是ip級別的,預設是60,如果設定為0,那麼表明不作任何限制。請注意這個限制的使用範圍,僅僅是單臺客戶端機器與單臺ZK伺服器之間的連線數限制,不是針對指定客戶端IP,也不是ZK叢集的連線數限制,也不是單臺ZK對所有客戶端的連線數限制。指定客戶端IP的限制策略,這裡有一個patch,可以嘗試一下:http://rdc.taobao.com/team/jm/archives/1334(No Java system property)
clientPortAddress
對於多網絡卡的機器,可以為每個IP指定不同的監聽埠。預設情況是所有IP都監聽clientPort指定的埠。New in 3.3.0
minSessionTimeoutmaxSessionTimeout
Session超時時間限制,如果客戶端設定的超時時間不在這個範圍,那麼會被強制設定為最大或最小時間。預設的Session超時時間是在2 * tickTime ~ 20 * tickTime這個範圍 New in 3.3.0
fsync.warningthresholdms
事務日誌輸出時,如果呼叫fsync方法超過指定的超時時間,那麼會在日誌中輸出警告資訊。預設是1000ms。(Java system property:
fsync.warningthresholdms) New in 3.3.4
autopurge.purgeInterval
在上文中已經提到,3.4.0及之後版本,ZK提供了自動清理事務日誌和快照檔案的功能,這個引數指定了清理頻率,單位是小時,需要配置一個1或更大的整數,預設是0,表示不開啟自動清理功能,但可以執行bin/zkCleanup.sh來手動清理zk日誌。(No Java system property) New in 3.4.0
autopurge.snapRetainCount
這個引數和上面的引數搭配使用,這個引數指定了需要保留的檔案數目。預設是保留3個。(No Java system property) New in 3.4.0
electionAlg
在之前的版本中, 這個引數配置是允許我們選擇leader選舉演算法,但是由於在以後的版本中,只會留下一種“TCP-based version of fast leader election”演算法,所以這個引數目前看來沒有用了,這裡也不詳細展開說了。(No Java system property)
initLimit
Follower在啟動過程中,會從Leader同步所有最新資料,然後確定自己能夠對外服務的起始狀態。Leader允許Follower在initLimit時間內完成這個工作。通常情況下,我們不用太在意這個引數的設定。如果ZK叢集的資料量確實很大了,Follower在啟動的時候,從Leader上同步資料的時間也會相應變長,因此在這種情況下,有必要適當調大這個引數了。預設值為10,即10 * tickTime (No Java system property)
syncLimit
在執行過程中,Leader負責與ZK叢集中所有機器進行通訊,例如通過一些心跳檢測機制,來檢測機器的存活狀態。如果Leader發出心跳包在syncLimit之後,還沒有從Follower那裡收到響應,那麼就認為這個Follower已經不線上了。注意:不要把這個引數設定得過大,否則可能會掩蓋一些問題,設定大小依賴與網路延遲和吞吐情況。預設為5,即5 * tickTime (No Java system property)
leaderServes
預設情況下,Leader是會接受客戶端連線,並提供正常的讀寫服務。但是,如果你想讓Leader專注於叢集中機器的協調,那麼可以將這個引數設定為no,這樣一來,會大大提高寫操作的效能。預設為yes(Java system property: zookeeper.leaderServes)。
server.x=[hostname]:n:n[:observer]
這裡的x是一個數字,與myid檔案中的id是一致的,用來標識這個zk server,大小為1-255。右邊可以配置兩個埠,第一個埠用於Follower和Leader之間的資料同步和其它通訊,第二個埠用於Leader選舉過程中投票通訊。Zk啟動時,會讀取myid中的值,從而得到server.x的配置為本機配置,並且也可以通過這個id找到和其他zk通訊的地址和埠。hostname為機器ip,第一個埠n為事務傳送的通訊埠,第二個n為leader選舉的通訊埠,預設為2888:3888。如果後面配置了observer,表示本機是一個觀察者(觀察者不參與事務和選舉,但會轉發更新請求給leader)。 (No Java system property)
group.x=nnnnn[:nnnnn]
weight.x=nnnnn
對機器分組和權重設定,可以 參見這裡(No Java system property)
cnxTimeout
Leader選舉過程中,開啟一次連線(選舉的server互相通訊建立連線)的超時時間,預設是5s。(Java system property: zookeeper.cnxTimeout)
zookeeper.DigestAuthenticationProvider .superDigest
ZK許可權設定相關,具體參見《使用super身份對有許可權的節點進行操作》 和 《ZooKeeper許可權控制》
skipACL
對所有客戶端請求都不作ACL檢查。如果之前節點上設定有許可權限制,一旦伺服器上開啟這個開頭,那麼也將失效。(Java system property:zookeeper.skipACL)
forceSync
這個引數確定了是否需要在事務日誌提交的時候呼叫FileChannel.force來保證資料完全同步到磁碟。(Java system property:zookeeper.forceSync)
jute.maxbuffer
每個節點最大資料量,是預設是1M。這個限制必須在server和client端都進行設定才會生效。(Java system property:jute.maxbuffer)