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


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM