ZooKeeper配置詳解

jopen 10年前發布 | 41K 次閱讀 ZooKeeper 分布式/云計算/大數據

參數

說明

clientPort

客戶端連接server的端口,即zk對外服務端口,一般設置為2181

dataDir

就是把內存中的數據存儲成快照文件snapshot的目錄,同時myid也存儲在這個目錄下(myid中的內容為本機server服務的標識)。寫快照不需要單獨的磁盤,而且是使用后臺線程進行異步寫數據到磁盤,因此不會對內存數據有影響。默認情況下,事務日志也會存儲在這里。建議同時配置參數dataLogDir,   事務日志的寫性能直接影響zk性能。

tickTime

ZK中的一個時間單元。ZK中所有時間都是以這個時間單元為基礎,進行整數倍配置的。例如,session的最小超時時間是2*tickTime。默認3000毫秒。這個單元時間不能設置過大或過小,過大會加大超時時間,也就加大了集群檢測session失效時間;設置過小會導致session很容易超時,并且會導致網絡通訊負載較重(心跳時間縮短)

dataLogDir

事務日志輸出目錄。盡量給事務日志的輸出配置單獨的磁盤或是掛載點,這將極大的提升ZK性能。 由于事務日志輸出時是順序且同步寫到磁盤,只有從磁盤寫完日志后才會觸發followerleader發回事務日志確認消息(zk事務采用兩階段提交),因此需要單獨磁盤避免隨機讀寫和磁盤緩存導致事務日志寫入較慢或存儲在緩存中沒有寫入。

globalOutstandingLimit

最大請求堆積數。默認是1000ZK運行的時候, 盡管server已經沒有空閑來處理更多的客戶端請求了,但是還是允許客戶端將請求提交到服務器上來,以提高吞吐性能。當然,為了防止Server內存溢出,這個請求堆積數還是需要限制下的。當有非常多的客戶端并且請求都比較大時,可以減少這個值,不過這種情況很少。   (Java system property:zookeeper.globalOutstandingLimit)

preAllocSize

預先開辟磁盤空間,用于后續寫入事務日志。默認是64M,每個事務日志大小就是64M,這個默認大小是按snapCount100000且每個事務信息為512b來計算的。如果ZK的快照頻率較大的話,建議適當減小這個參數。(Java   system property:zookeeper.preAllocSize)。當事務日志文件不會增長得太大的話,這個大小是可以減小的。比如1000次事務會新產生一個快照(參數為snapCount),新產生快照后會用新的事務日志文件,假設一個事務信息大小100b,那么事務日志預開辟的大小為100kb會比較好。

snapCount

每進行snapCount次事務日志輸出后,觸發一次快照(snapshot),   此時,ZK會生成一個snapshot.*文件,同時創建一個新的事務日志文件log.*。默認是100000.(真正的代碼實現中,會進行一定的隨機數處理,以避免所有服務器在同一時間進行快照而影響性能)(Java   system property:zookeeper.snapCount)。在通過快照和事務日志恢復數據時,使用的時間為讀取快照時間和讀取在這個快照之后產生的事務日志的時間,因此snapCount太大會導致讀取事務日志的數量較多,snapCount較小會導致產生快照文件很多。

traceFile

用于記錄所有請求的log,一般調試過程中可以使用,但是生產環境不建議使用,會嚴重影響性能。(Java   system property:requestTraceFile)

maxClientCnxns

單個客戶端與單臺服務器之間的連接數的限制,是ip級別的,默認是60,如果設置為0,那么表明不作任何限制。請注意這個限制的使用范圍,僅僅是單臺客戶端機器與單臺ZK服務器之間的連接數限制,不是針對指定客戶端IP,也不是ZK集群的連接數限制,也不是單臺ZK對所有客戶端的連接數限制。指定客戶端IP的限制策略,這里有一個patch,可以嘗試一下:http://rdc.taobao.com/team/jm/archives/1334No 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.warningthresholdmsNew 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允許FollowerinitLimit時間內完成這個工作。通常情況下,我們不用太在意這個參數的設置。如果ZK集群的數據量確實很大了,Follower在啟動的時候,從Leader上同步數據的時間也會相應變長,因此在這種情況下,有必要適當調大這個參數了。默認值為1010   * 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。右邊可以配置兩個端口,第一個端口用于FollowerLeader之間的數據同步和其它通信,第二個端口用于Leader選舉過程中投票通信。Zk啟動時,會讀取myid中的值,從而得到server.x的配置為本機配置,并且也可以通過這個id找到和其他zk通信的地址和端口。hostname為機器ip,第一個端口n為事務發送的通信端口,第二個nleader選舉的通信端口,默認為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。這個限制必須在serverclient端都進行設置才會生效。(Java   system property:jute.maxbuffer)

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!