ZooKeeper系列(4):ZooKeeper的配置文件詳解

ZooKeeper系列文章:http://www.javashuo.com/article/p-waqydwdc-bt.htmlhtml

 


zkServer.sh讀取的默認配置文件是$ZOOKEEPER_HOME/conf/zoo.cfg。若是要用其它配置文件。以下傳遞配置文件參數:算法

zkServer.sh start  your_config
zkServer.sh stop   your_config
zkServer.sh status your_config

配置文件的官方說明:http://zookeeper.apache.org/doc/r3.4.12/zookeeperAdmin.html#sc_configuration數據庫

如下是ZooKeeper的配置文件中各配置項的解釋,分兩部分:一部分是ZooKeeper正常運行所必須的配置項(只有3項),一部分是非必須項。apache

1.必須配置項

下面3項是ZooKeeper正常運行所必須配置的。數組

  • clientPort
    向外提供服務的端口號。換句話說,是給客戶端鏈接的端口。bash

  • dataDir
    ZooKeeper的數據目錄,主要目的是存儲內存數據庫序列化後的快照路徑。若是沒有配置事務日誌(即dataLogDir配置項)的路徑,那麼ZooKeeper的事務日誌也存放在數據目錄中。服務器

  • tickTime
    tick的中文意思是"嘀的一聲",tickTime指的是滴答一聲的時間長度。在ZooKeeper中,它是全部涉及到時間長度的單元,單位爲毫秒,就至關於時鐘裏的秒單元同樣。例如,tickTime=2000;initLimit=5,表示initLimit的時間爲"嘀嗒"5次,長度爲2000*5=10秒。tickTime隱含了心跳時間(即心跳時間爲tickTime),還隱含了客戶端和服務器之間保持的會話的最小和最大超時時間(最小2倍tickTime,最大20倍tickTime)。併發

2.其它配置項

2.1 通常選項

  • dataLogDir
    指定事務日誌的存放目錄。事務日誌對ZooKeeper的影響很是大,強烈建議事務日誌目錄和數據目錄分開,不要將事務日誌記錄在數據目錄(主要用來存放內存數據庫快照)下。函數

  • globalOutstandingLimit
    接收客戶端的最大請求隊列。默認是1000。爲了提升ZooKeeper的吞吐量,即便ZooKeeper已經沒有空閒資源來處理新的客戶端請求,也仍是會接收進來。這個配置項是爲了限流,避免內存溢出。日誌

  • preAllocSize
    爲事務日誌預先開闢磁盤空間。默認是64M,意味着每一個事務日誌大小就是64M(能夠去事務日誌目錄中看一下,每一個事務日誌只要被建立出來,就是64M)。若是ZooKeeper產生快照頻率較大,能夠考慮減少這個參數,由於每次快照後都會切換到新的事務日誌,但前面的64M根本就沒寫完。(見snapCount配置項)

  • snapCount
    ZooKeeper使用事務日誌和快照來持久化每一個事務(注意是日誌先寫)。該配置項指定ZooKeeper在將內存數據庫序列化爲快照以前,須要先寫多少次事務日誌。也就是說,每寫幾回事務日誌,就快照一次。默認值爲100000。爲了防止全部的ZooKeeper服務器節點同時生成快照(通常狀況下,全部實例的配置文件是徹底相同的),當某節點的先寫事務數量在(snapCount/2+1,snapCount)範圍內時(挑選一個隨機值),這個值就是該節點拍快照的時機。

  • maxClientCnxns
    在套接字級別上限制同一客戶端的併發鏈接數。由於同一客戶端IP地址相同,可能會調度到同一個ZooKeeper服務器節點上。這個配置項是爲了不DoS攻擊。默認值爲60,設置爲0表示不作任何限制。

  • clientPortAddress
    指定爲客戶端提供服務的監聽地址(ipv4/ipv6)。換句話說,clientPort將只綁定在地址上。若是不設置該選項,將默認監聽在全部地址上(0.0.0.0)。

  • minSessionTimeout
  • maxSessionTimeout
    客戶端和服務端會話保持的最小、最大超時時間。ZooKeeper的不少數據和狀態都和會話綁定。假如客戶端和服務端成功創建鏈接(會話)後,正常狀況下,客戶端會時不時地向服務端發送心跳,若是這個服務端或者客戶端掛了,它們之間的會話要保持多長時間。

  • fsync.warningthresholdms
    事務日誌輸出時,若是調用fsync方法超過此處指定的超時時間,那麼會在日誌中輸出警告信息。默認是1000ms。

  • autopurge.snapRetainCount
    該配置項指定開啓了ZooKeeper的自動清理功能後(見下一個配置項),每次自動清理時要保留的版本數量。默認值爲3,最小值也爲3。它表示在自動清理時,會保留最近3個快照以及這3個快照對應的事務日誌。其它的全部快照和日誌都清理。

  • autopurge.purgeInterval
    指定觸發自動清理功能的時間間隔,單位爲小時,值爲大於或等於1的整數,默認值爲0,表示不開啓自動清理功能。

  • syncEnabled
    指定觀察者(observers)是否像follower同樣,也記錄事務日誌和快照,以便在observers重啓時能加速恢復。默認值爲true,設置爲false表示禁用該功能,不記錄日誌和快照。

2.2 集羣選項

在配置ZooKeeper集羣時可能用到的配置項。

  • electionAlg
    指定leader選舉算法。默認值爲3,表示使用基於TCP的快速選舉。在之前的版本中,還有0/1/2三種算法,它們都是基於UDP的,已經廢棄了,之後的版本中會移除這三種算法。

  • initLimit
    followers啓動時須要鏈接leader,並從Leader處獲取它所缺失的那部分數據,以便它能和leader的數據保持同步。只有保持了同步,該follower才被標記爲ONLINE,而後才能提供服務。這個配置項限定從follower啓動到恢復完成的超時時間。通常狀況下,ZooKeeper保存的都是協調數據,數據量不會很大,但若是要同步的數據很大,能夠考慮增大這個選項的值。注意,這個值依賴於tickTime時間單元,例如tickTime=2000,initLimit=2表示4秒。

  • syncLimit
    follower和leader之間數據延遲的最大時間長度。例如,有個節點的更新操做緩慢,它的數據已經嚴重落後於leader,ZooKeeper就會將它從ZooKeeper集羣中踢出去。ZooKeeper使用時間來度量follower和leader之間數據的延遲,這個選項的值依賴於tickTime,例如tickTime=2000,syncLimit=2表示follower比leader延遲了4秒。

  • leaderServes
    默認值爲yes,表示leader也接受客戶端的鏈接,接受來自客戶端的讀、寫請求。leader的主要做用是協調ZooKeeper集羣服務器節點間的寫操做,若是想要獲取更高的寫吞吐量,能夠將其設置爲no,這樣leader將不容許客戶端的鏈接,它將專一於協調,但這會損失一點讀吞吐量。

  • server.x=[hostname]:port_A:port_B
    指定ZooKeeper集羣中的服務器節點。有幾個server節點,就給幾個這個配置項,全部節點上的這部分配置要一致。
    • X:整數。是ZooKeeper中服務器的一個簡單標識。這個數值須要和dataDir下的myid文件內容一致。在啓動ZooKeeper集羣中的每一個實例時,須要讀取dataDir中的myid文件,並將該文件中的數值和配置文件中的server.X作匹配,匹配到哪一個就表示是哪一個ZooKeeper服務器節點。
    • hostname:ZooKeeper服務器節點的地址。
    • port_A:這是第一個端口,用於Follower和Leader之間的數據同步和其它通訊。
    • port_B:這是第二個端口,用於Leader選舉過程當中投票通訊。

    若是要配置的ZooKeeper的僞集羣(多個ZooKeeper實例運行在同一機器上),每一個server.X中的X、port_A和port_B必須不能相同。

    例如,3個服務器節點的僞集羣ZooKeeper,數據目錄分別爲/zk/data1,/zk/data2,/zk/data3。能夠這樣配置。

    server.1=localhost:2881:3881
    server.2=localhost:2882:3882
    server.3=localhost:2883:3883

    而後在data1/myid、data2/myid、data3/myid中分別寫入一、二、3(須要和X值對應)。

  • group.x=A[:B]
  • weight.y=N
    這兩個一塊兒用,用於啓用分層仲裁功能。group命令用於將ZooKeeper集羣中的服務器節點進行分組。若是沒有使用group選項,則ZooKeeper默認將全部服務器節點納入一個默認組中。weight命令用於爲每一個服務器節點指定權重值,權重越高,投票時能投的票數越多。若是不配置weight命令,則全部節點的默認權重值爲1。
    • x:分組id。整數值。
    • A:B:C...:用冒號分隔的服務器節點列表,表示這幾個節點屬於同一個組。整數值,取自server.X中的X。例如,上面server.x中的示例,group.1=1:2:3表示將這3個節點放進一個id=1的組中。
    • y:取自server.X中的X。
    • N:爲該服務器節點指定的權重值。
      例如,9個節點的ZooKeeper集羣,分紅3組:
    server.1=aaaa
    server.2=aaaa
    server.3=aaaa
    server.4=aaaa
    server.5=aaaa
    server.6=aaaa
    server.7=aaaa
    server.8=aaaa
    server.9=aaaa
     
    group.1=1:2:3
    group.2=4:5:6
    group.3=7:8:9
     
    weight.1=1
    weight.2=1
    weight.3=1
    weight.4=1
    weight.5=1
    weight.6=1
    weight.7=1
    weight.8=1
    weight.9=1

    當須要仲裁時,首先過濾掉權重值爲0的組(即組中全部節點權重都爲0),而後判斷,若是組中有大多數節點投票的組達到了大多數組的要求,仲裁就經過。換個理解方式,就是先在組內投票,而後組自身投票。組內投票數達到了該組的大多數,這個組就有一票。若是投票的組數量達到了總組數的大多數(不考慮權重爲0的組),則整個仲裁就經過。

  • cnxTimeout
    在投票選舉新的leader時,須要經過選舉端口創建鏈接來發送通知信息。該配置項設置打開這個鏈接的超時時長。默認值爲5。

  • ipReachableTimeout
    3.4.11版本中才引入的配置項。當解析主機名時,爲可訪問的IP地址設置此超時值,單位毫秒。默認狀況下,ZooKeeper將使用主機名的第一個IP地址(不作任何reachable檢查)。設置ipReachableTimeout(大於0)後,ZooKeeper將嘗試獲取第一個可訪問的IP地址。這是經過調用Java API函數InetAddress.isreavailable(long timeout)實現的。其中使用了這個超時值。若是找不到這樣的IP地址,主機名的第一個IP地址將被使用。

2.3 其它配置項

還有一些配置項,用到的可能性很小,因此不解釋了。若有須要,參考官方手冊:http://zookeeper.apache.org/doc/r3.4.12/zookeeperAdmin.html#sc_configuration

相關文章
相關標籤/搜索