ZooKeeper系列(4):ZooKeeper的配置檔案詳解

駿馬金龍發表於2018-06-27

ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk

 


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項),一部分是非必須項。

1.必須配置項

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

  • clientPort
    向外提供服務的埠號。換句話說,是給客戶端連線的埠。

  • 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中分別寫入1、2、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

相關文章