ZooKeeper 管理員指南
部署與管理指南
- 部署
- 管理
部署
此區段包含有關部署 Zookeeper 的資訊,並涵蓋下列主題
前兩個區段假設您有興趣在生產環境(例如資料中心)中安裝 ZooKeeper。最後一個區段涵蓋您在有限的基礎上設定 ZooKeeper 的情況 - 評估、測試或開發 - 但不在生產環境中。
系統需求
支援的平台
ZooKeeper 包含多個元件。有些元件廣泛受到支援,而其他元件僅在較小的平台組上受到支援。
- 客戶端是 Java 客戶端程式庫,由應用程式用於連線到 ZooKeeper 陣列。
- 伺服器是執行於 ZooKeeper 叢集節點上的 Java 伺服器。
- 原生用戶端是使用 C 實作的用戶端,類似於 Java 用戶端,應用程式使用它來連線至 ZooKeeper 叢集。
- Contrib 指的是多個可選的附加元件。
下表說明在不同作業系統平台上執行各個元件時所承諾的支援層級。
支援矩陣
作業系統 | 用戶端 | 伺服器 | 原生用戶端 | Contrib |
---|---|---|---|---|
GNU/Linux | 開發與生產 | 開發與生產 | 開發與生產 | 開發與生產 |
Solaris | 開發與生產 | 開發與生產 | 不支援 | 不支援 |
FreeBSD | 開發與生產 | 開發與生產 | 不支援 | 不支援 |
Windows | 開發與生產 | 開發與生產 | 不支援 | 不支援 |
Mac OS X | 僅開發 | 僅開發 | 不支援 | 不支援 |
對於矩陣中未明確提及支援的任何作業系統,元件可能運作,也可能不運作。ZooKeeper 社群將修正其他平台回報的明顯錯誤,但不會提供完整支援。
所需的軟體
ZooKeeper 以 Java 執行,版本為 1.8 或更高(JDK 8 LTS、JDK 11 LTS、JDK 12 - 不支援 Java 9 和 10)。它以 ZooKeeper 伺服器的叢集方式執行。三個 ZooKeeper 伺服器是叢集建議的最小規模,我們也建議它們執行於不同的機器上。在 Yahoo! 中,ZooKeeper 通常部署於專用的 RHEL 機器上,配備雙核心處理器、2GB RAM 和 80GB IDE 硬碟。
叢集式(多伺服器)設定
對於可靠的 ZooKeeper 服務,您應該將 ZooKeeper 部署於稱為叢集的群集中。只要叢集中的大多數伺服器都運作,服務就會可用。由於 Zookeeper 需要大多數,最好使用奇數台機器。例如,使用四台機器時,ZooKeeper 只能處理一台機器的故障;如果兩台機器故障,剩餘的兩台機器不構成大多數。然而,使用五台機器時,ZooKeeper 可以處理兩台機器的故障。
注意
正如 ZooKeeper 入門指南 中所述,容錯叢集設定至少需要三台伺服器,強烈建議您使用奇數台伺服器。
通常三台伺服器對於生產安裝來說已經綽綽有餘,但為了在維護期間達到最大的可靠性,您可能希望安裝五台伺服器。使用三台伺服器時,如果您對其中一台伺服器執行維護,您會在維護期間面臨另一台伺服器故障的風險。如果您執行五台伺服器,您可以關閉一台伺服器進行維護,並知道如果其他四台伺服器之一突然故障,您仍然沒問題。
您的備援考量應包含環境的所有面向。如果您有三個 ZooKeeper 伺服器,但它們的網路纜線都插入同一個網路交換器,那麼該交換器的故障將會導致您的整個叢集停擺。
以下是如何設定將成為叢集一部分的伺服器的步驟。這些步驟應在叢集中的每一個主機上執行
-
安裝 Java JDK。您可以使用系統的原生封裝系統,或從以下位置下載 JDK:http://java.sun.com/javase/downloads/index.jsp
-
設定 Java 堆積大小。這對於避免換頁非常重要,換頁會嚴重降低 ZooKeeper 的效能。若要確定正確的值,請使用負載測試,並確保您遠低於會導致換頁的用量限制。保守一點 - 對於 4GB 的機器,使用 3GB 的最大堆積大小。
-
安裝 ZooKeeper 伺服器套件。它可以從以下位置下載:https://zookeeper.dev.org.tw/releases.html
-
建立設定檔。此檔案可以任意命名。使用下列設定作為起點
tickTime=2000 dataDir=/var/lib/zookeeper/ clientPort=2181 initLimit=5 syncLimit=2 server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
您可以在 設定參數 章節中找到這些和其他設定的意義。在此對一些詞彙進行說明:ZooKeeper 叢集中的每部機器都應該知道叢集中其他每部機器。您可以透過一系列 server.id=host:port:port 格式的指令來達成此目的。(host 和 port 參數很直觀,對於每部伺服器,您需要先指定一個通訊埠,然後再指定一個專門用於 ZooKeeper 領導者選舉的埠)。自 ZooKeeper 3.6.0 起,您也可以為每個 ZooKeeper 伺服器實例 指定多個位址 (當叢集中可以並行使用多個實體網路介面時,這可以提高可用性)。您可以透過建立一個名為 myid 的檔案,一個檔案對應一部伺服器,並將其儲存在該伺服器的資料目錄中,如設定檔參數 dataDir 所指定,來將伺服器 ID 歸因於每部機器。
-
myid 檔案包含一行,其中僅包含該機器 ID 的文字。因此,伺服器 1 的 myid 將包含文字「1」,沒有其他內容。ID 在叢集中必須是唯一的,且應該介於 1 到 255 之間。重要:如果您啟用 TTL 節點等延伸功能 (請見下方),由於內部限制,ID 必須介於 1 到 254 之間。
-
在與 myid 相同的目錄中建立一個初始化標記檔案 initialize。此檔案表示預期會有一個空的資料目錄。當此檔案存在時,會建立一個空的資料庫,並刪除標記檔案。當此檔案不存在時,一個空的資料目錄將表示這個對等方沒有投票權,而且它不會填入資料目錄,直到它與一個活動的領導者進行通訊。預期的用途是僅在建立新的叢集時建立此檔案。
-
如果您的設定檔已設定好,您可以啟動一個 ZooKeeper 伺服器
$ java -cp zookeeper.jar:lib/*:conf org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.conf
QuorumPeerMain 會啟動一個 ZooKeeper 伺服器,JMX 管理 Bean 也會註冊,允許透過 JMX 管理主控台進行管理。ZooKeeper JMX 文件 包含使用 JMX 管理 ZooKeeper 的詳細資訊。請參閱發行版中包含的腳本 bin/zkServer.sh,以取得啟動伺服器實例的範例。8. 透過連接到主機來測試您的部署:在 Java 中,您可以執行下列指令來執行簡單的操作
$ bin/zkCli.sh -server 127.0.0.1:2181
單一伺服器與開發人員設定
如果您想為開發目的設定 ZooKeeper,您可能會想設定一個 ZooKeeper 單一伺服器實例,然後在您的開發機器上安裝 Java 或 C 客户端程式庫和繫結。
設定單一伺服器實例的步驟與上述類似,但設定檔較為簡單。您可以在 在單一伺服器模式下安裝和執行 ZooKeeper 章節中找到 ZooKeeper 入門指南 的完整說明。
有關安裝用戶端程式庫的資訊,請參閱 繫結 部分的 ZooKeeper 程式設計指南。
管理
此部分包含有關執行和維護 ZooKeeper 的資訊,並涵蓋下列主題
- 設計 ZooKeeper 部署
- 提供
- 需要考量的事項:ZooKeeper 的優點與限制
- 管理
- 維護
- 監督
- 監控
- 記錄
- 疑難排解
- 設定參數
- ZooKeeper 指令
- 資料檔案管理
- 需要避免的事項
- 最佳實務
設計 ZooKeeper 部署
ZooKeeper 的可靠性建立在兩個基本假設上。
- 部署中只有少數伺服器會發生故障。在此情況下,「故障」表示機器崩潰,或網路中某些錯誤將伺服器與大多數伺服器隔離。
- 已部署的機器正常運作。正常運作表示正確執行程式碼、時鐘正常運作,以及儲存和網路元件持續執行。
下列部分包含 ZooKeeper 管理員應考量的因素,以最大化這些假設為真的機率。其中一些是跨機器考量,而其他則是您應考量部署中每部機器的因素。
跨機器需求
若要讓 ZooKeeper 服務保持作用中,必須有大多數未發生故障的機器可以彼此通訊。對於具有 N 個伺服器的 ZooKeeper 群組,如果 N 為奇數,則群組可以容忍多達 N/2 個伺服器故障,而不會遺失任何 znode 資料;如果 N 為偶數,則群組可以容忍多達 N/2-1 個伺服器故障。
例如,如果我們有一個具有 3 個伺服器的 ZooKeeper 群組,則群組可以容忍多達 1 (3/2) 個伺服器故障。如果我們有一個具有 5 個伺服器的 ZooKeeper 群組,則群組可以容忍多達 2 (5/2) 個伺服器故障。如果 ZooKeeper 群組具有 6 個伺服器,則群組也可以容忍多達 2 (6/2-1) 個伺服器故障,而不會遺失資料並防止「腦裂」問題。
ZooKeeper 群組通常具有奇數個伺服器。這是因為對於偶數個伺服器,容錯容量與伺服器少一個的群組相同(5 節點群組和 6 節點群組都為 2 個故障),但群組必須為另一個伺服器維護額外的連線和資料傳輸。
若要達成容忍故障的最高機率,您應嘗試讓機器故障保持獨立。例如,如果大多數機器共用同一個交換器,則該交換器故障可能會導致相關故障並中斷服務。共用電源電路、冷卻系統等也是如此。
單一機器需求
如果 ZooKeeper 必須與其他應用程式競爭存取資源(例如儲存媒體、CPU、網路或記憶體),其效能將會明顯下降。ZooKeeper 有強大的耐用性保證,這表示它會在負責變更的作業完成之前,使用儲存媒體來記錄變更。因此,您應該注意這個依賴關係,如果您想要確保 ZooKeeper 作業不會被您的媒體延誤,請特別小心。以下是一些您可以執行的動作,以將這種劣化降到最低
- ZooKeeper 的交易記錄必須在專用裝置上。(專用的分割區還不夠。)ZooKeeper 會循序寫入記錄,而不尋求與其他程序共用您的記錄裝置可能會導致尋求和競爭,而這反過來會導致數秒鐘的延遲。
- 請勿將 ZooKeeper 置於可能導致交換的情況中。為了讓 ZooKeeper 能夠以任何準時的方式運作,絕對不能允許它交換。因此,請確定提供給 ZooKeeper 的最大堆積大小,不會大於 ZooKeeper 可用的實際記憶體量。有關這方面的更多資訊,請參閱下方 應避免的事項。
提供
需要考量的事項:ZooKeeper 的優點與限制
管理
維護
ZooKeeper 集群只需要很少的長期維護,但您必須注意以下事項
持續的資料目錄清理
ZooKeeper 資料目錄 包含檔案,這些檔案是特定服務組儲存的 znode 的持續性副本。這些是快照和交易記錄檔案。當對 znode 進行變更時,這些變更會附加到交易記錄。偶爾,當記錄變大時,所有 znode 的目前狀態快照會寫入檔案系統,並為未來的交易建立新的交易記錄檔案。在快照期間,ZooKeeper 可能會持續將輸入的交易附加到舊的記錄檔案。因此,某些比快照新的交易可能會出現在快照之前的最後一個交易記錄中。
使用預設組態時,ZooKeeper 伺服器不會移除舊的快照和記錄檔案(請參閱下方的自動清除),這是操作員的責任。每個服務環境都不同,因此管理這些檔案的要求可能會因安裝而異(例如備份)。
PurgeTxnLog 程式實作一個簡單的保留原則,管理員可以使用它。API 文件 包含有關呼叫慣例(引數等)的詳細資料。
在以下範例中,保留最後計數的快照及其對應的記錄,並刪除其他快照。
java -cp zookeeper.jar:lib/slf4j-api-1.7.30.jar:lib/logback-classic-1.2.10.jar:lib/logback-core-1.2.10.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir> <snapDir> -n <count>
在版本 3.4.0 中引入了自動清除快照和對應的交易記錄,並可透過下列組態參數啟用:autopurge.snapRetainCount 和 autopurge.purgeInterval。如需進一步了解,請參閱以下的 進階組態。
偵錯記錄清理(logback)
請參閱此文件中的 記錄 區段。預期您會使用內建的 logback 功能設定一個滾動檔案附加程式。發行 tar 檔中的範例組態檔案 conf/logback.xml
提供了範例。
監督
您會希望有一個監督程序來管理您的每個 ZooKeeper 伺服器程序 (JVM)。ZK 伺服器設計為「快速失敗」,意即如果發生無法復原的錯誤,它會關閉 (程序退出)。由於 ZooKeeper 服務叢集高度可靠,這表示即使伺服器可能發生故障,叢集整體仍會保持作用中並提供服務。此外,由於叢集具有「自我修復」功能,因此一旦重新啟動,失敗的伺服器會自動重新加入整體,而無需手動介入。
擁有 daemontools 或 SMF 等監督程序 (還有其他監督程序選項可供使用,您可以選擇您想使用的選項,這只是兩個範例) 來管理您的 ZooKeeper 伺服器,可確保如果程序異常退出,它會自動重新啟動並快速重新加入叢集。
也建議將 ZooKeeper 伺服器程序組態為在發生 OutOfMemoryError** 時終止並傾印其堆積。這可透過在 Linux 和 Windows 分別使用下列參數啟動 JVM 來達成。隨 ZooKeeper 附帶的 zkServer.sh 和 zkServer.cmd 腳本會設定這些選項。
-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p'
"-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f"
監控
ZooKeeper 服務可以用三種主要方式之一來監控
- 透過使用 4 個字母的字 來命令埠
- 使用 JMX
- 使用
zkServer.sh status
命令
記錄
ZooKeeper 使用 SLF4J 版本 1.7 作為其記錄基礎架構。預設情況下,ZooKeeper 會隨附 LOGBack 作為記錄後端,但您可以使用您選擇的任何其他支援的記錄架構。
ZooKeeper 預設的 logback.xml 檔案位於 conf 目錄中。Logback 要求 logback.xml 位於工作目錄 (執行 ZooKeeper 的目錄) 中或可從類別路徑存取。
如需進一步了解 SLF4J,請參閱 其手冊。
如需進一步了解 Logback,請參閱 Logback 網站。
疑難排解
- 伺服器因檔案損毀而無法啟動:伺服器可能無法讀取其資料庫,且因 ZooKeeper 伺服器的交易記錄檔中出現檔案損毀而無法啟動。您將會在載入 ZooKeeper 資料庫時看到一些 IOException。在這種情況下,請確定您的叢集中的所有其他伺服器都已啟動且運作正常。請在命令埠上使用「stat」命令,以查看它們是否運作正常。驗證叢集中的所有其他伺服器都已啟動後,您可以繼續清除損毀伺服器的資料庫。刪除 datadir/version-2 和 datalogdir/version-2/ 中的所有檔案。重新啟動伺服器。
設定參數
ZooKeeper 的行為由 ZooKeeper 組態檔所管理。此檔案的設計方式,讓組成 ZooKeeper 伺服器的所有伺服器都能使用完全相同的檔案,假設磁碟配置相同。如果伺服器使用不同的組態檔,則必須小心確保所有不同組態檔中的伺服器清單相符。
注意
在 3.5.0 及更新版本中,其中一些參數應放置在動態組態檔中。如果將它們放置在靜態組態檔中,ZooKeeper 會自動將它們移至動態組態檔。請參閱 動態重新組態 以取得更多資訊。
最低設定
以下是組態檔中必須定義的最低組態關鍵字
-
clientPort:偵聽用戶端連線的埠,亦即用戶端嘗試連線的埠。
-
secureClientPort:使用 SSL 偵聽安全用戶端連線的埠。clientPort 指定純文字連線的埠,而 secureClientPort 指定 SSL 連線的埠。同時指定兩者會啟用混合模式,而略過任一者會停用該模式。請注意,當使用者將 zookeeper.serverCnxnFactory、zookeeper.clientCnxnSocket 插入 Netty 時,SSL 功能會啟用。
-
observerMasterPort:偵聽觀察者連線的埠,亦即觀察者嘗試連線的埠。如果設定此屬性,則伺服器在追隨者模式中時,除了在領導者模式中時,還會主控觀察者連線,並在觀察者模式中時嘗試連線至任何投票對等方。
-
dataDir:ZooKeeper 將儲存記憶體中資料庫快照的位置,且除非另有指定,否則也會儲存資料庫更新的交易記錄檔。
注意
請小心放置交易記錄檔的位置。專用的交易記錄檔裝置是持續良好效能的關鍵。將記錄檔放置在忙碌的裝置上會對效能造成負面影響。
- tickTime:單一刻度的長度,這是 ZooKeeper 使用的基本時間單位,以毫秒為單位測量。它用於調整心跳和逾時。例如,最短的會話逾時將為兩個刻度。
進階設定
本節中的組態設定為選用。您可以使用它們進一步微調 ZooKeeper 伺服器的行為。有些也可以使用 Java 系統屬性設定,通常為 zookeeper.keyword 格式。當有可用時,確切的系統屬性會註明在下方。
- dataLogDir:(沒有 Java 系統屬性) 此選項會引導機器將交易記錄寫入 dataLogDir,而不是 dataDir。這允許使用專用的記錄裝置,並有助於避免記錄和快照之間的競爭。
注意
擁有專用的記錄裝置會對吞吐量和穩定的延遲造成重大影響。強烈建議專用一個記錄裝置,並將 dataLogDir 設定為指向該裝置上的目錄,然後確保將 dataDir 指向不位於該裝置上的目錄。
- globalOutstandingLimit:(Java 系統屬性:zookeeper.globalOutstandingLimit.) 尤其是當有大量用戶端時,用戶端可以比 ZooKeeper 處理得更快地提交要求。為了防止 ZooKeeper 因排隊要求而耗盡記憶體,ZooKeeper 會限制用戶端,使其在整個集合中最多只有 globalOutstandingLimit 未完成的要求,並平均分配。預設限制為 1,000,例如,對於 3 個成員,每個成員將有 1000 / 2 = 500 的個別限制。
-
preAllocSize:(Java 系統屬性:zookeeper.preAllocSize) 為避免尋找,ZooKeeper 會以 preAllocSize 千位元組的區塊在交易記錄檔案中分配空間。預設區塊大小為 64M。變更區塊大小的原因之一是,如果更常擷取快照,則減少區塊大小。(另請參閱 snapCount 和 snapSizeLimitInKb)。
-
snapCount:(Java 系統屬性:zookeeper.snapCount) ZooKeeper 使用快照和交易記錄 (想想寫入前記錄) 來記錄其交易。在可以擷取快照 (並滾動交易記錄) 之前,在交易記錄中記錄的交易數目由 snapCount 決定。為了防止法定人數中的所有機器同時擷取快照,每個 ZooKeeper 伺服器會在交易記錄中的交易數目達到 [snapCount/2+1, snapCount] 範圍內執行時產生的隨機值時擷取快照。預設的 snapCount 為 100,000。
-
commitLogCount *:(Java 系統屬性:zookeeper.commitLogCount) Zookeeper 會維護一個最近提交要求的記憶體內清單,以便在追隨者沒有落後太多時,與追隨者快速同步。如果您的快照很大(>100,000),這將改善同步效能。預設值為 500,這是建議的最小值。
-
snapSizeLimitInKb:(Java 系統屬性:zookeeper.snapSizeLimitInKb) ZooKeeper 使用快照和交易記錄(想想寫入前記錄)來記錄其交易。在可以建立快照(並滾動交易記錄)之前,交易記錄中所記錄的交易集允許的總位元組大小由 snapSize 決定。為了防止法定人數中的所有機器同時建立快照,每個 ZooKeeper 伺服器將在交易記錄中的交易集位元組大小達到 [snapSize/2+1, snapSize] 範圍內執行時產生的隨機值時建立快照。每個檔案系統都有最小標準檔案大小,為了有效執行此功能,所選擇的數字必須大於該值。預設的 snapSizeLimitInKb 為 4,194,304(4GB)。非正值會停用此功能。
-
txnLogSizeLimitInKb:(Java 系統屬性:zookeeper.txnLogSizeLimitInKb) Zookeeper 交易記錄檔也可以使用 txnLogSizeLimitInKb 更直接地控制。較大的交易記錄可能會導致使用交易記錄進行同步時追隨者同步速度較慢。這是因為引導者必須掃描磁碟上的適當記錄檔,以尋找要從中開始同步的交易。此功能預設關閉,而 snapCount 和 snapSizeLimitInKb 是唯一限制交易記錄大小的值。啟用後,Zookeeper 會在達到任何限制時滾動記錄。請注意,實際記錄大小可能會超過此值,具體取決於序列化的交易大小。另一方面,如果將此值設定得過於接近(或小於)preAllocSize,可能會導致 Zookeeper 為每個交易滾動記錄。雖然這不是正確性的問題,但可能會導致效能嚴重降低。為了避免這種情況並充分利用此功能,建議將值設定為 N * preAllocSize,其中 N >= 2。
-
maxCnxns:(Java 系統屬性:zookeeper.maxCnxns) 限制可以與 Zookeeper 伺服器建立的並發連線總數(每個伺服器的每個用戶端埠)。這用於防止某些類型的 DoS 攻擊。預設值為 0,將其設定為 0 會完全取消對並發連線總數的限制。serverCnxnFactory 和 secureServerCnxnFactory 的連線數會分開計算,因此只要類型適當,對等方就可以容納多達 2*maxCnxns。
-
maxClientCnxns:(沒有 Java 系統屬性) 限制由 IP 位址識別的單一用戶端可以與 ZooKeeper 組合中的單一成員建立的並發連線數(在 socket 層級)。這用於防止某些類型的 DoS 攻擊,包括檔案描述符耗盡。預設值為 60。將其設定為 0 會完全取消對並發連線的限制。
-
clientPortAddress:3.3.0 中的新增功能:偵聽用戶端連線的位址(ipv4、ipv6 或主機名稱);也就是說,用戶端嘗試連線的位址。這是選用的,預設情況下,我們會以一種方式繫結,使伺服器上任何位址/介面/網卡的任何連線到clientPort都會被接受。
-
minSessionTimeout:(無 Java 系統屬性) 3.3.0 新功能:伺服器允許用戶端協商的最小會話逾時(毫秒)。預設值為 tickTime 的 2 倍。
-
maxSessionTimeout:(無 Java 系統屬性) 3.3.0 新功能:伺服器允許用戶端協商的最大會話逾時(毫秒)。預設值為 tickTime 的 20 倍。
-
fsync.warningthresholdms:(Java 系統屬性:zookeeper.fsync.warningthresholdms) 3.3.4 新功能:當交易記錄 (WAL) 中的 fsync 花費的時間超過此值時,會將警告訊息輸出至記錄檔。此值以毫秒為單位,預設值為 1000。此值只能設定為系統屬性。
-
maxResponseCacheSize:(Java 系統屬性:zookeeper.maxResponseCacheSize) 設定為正整數時,會決定儲存最近讀取記錄序列化形式的快取大小。有助於節省熱門 znode 的序列化成本。指標 response_packet_cache_hits 和 response_packet_cache_misses 可用於調整此值以符合特定工作負載。此功能預設開啟,值為 400,設定為 0 或負整數可關閉此功能。
-
maxGetChildrenResponseCacheSize:(Java 系統屬性:zookeeper.maxGetChildrenResponseCacheSize) 3.6.0 新功能:類似於 maxResponseCacheSize,但適用於取得子節點要求。指標 response_packet_get_children_cache_hits 和 response_packet_get_children_cache_misses 可用於調整此值以符合特定工作負載。此功能預設開啟,值為 400,設定為 0 或負整數可關閉此功能。
-
autopurge.snapRetainCount:(無 Java 系統屬性) 3.4.0 新功能:啟用時,ZooKeeper 自動清除功能會保留 autopurge.snapRetainCount 個最新的快照,以及 dataDir 和 dataLogDir 中對應的交易記錄,並刪除其餘部分。預設值為 3。最小值為 3。
-
autopurge.purgeInterval:(無 Java 系統屬性) 3.4.0 新功能:觸發清除任務的時間間隔(小時)。設定為正整數(1 以上)以啟用自動清除。預設值為 0。
-
syncEnabled:(Java 系統屬性:zookeeper.observer.syncEnabled) 3.4.6、3.5.0 新功能:觀察者現在預設會記錄交易並將快照寫入磁碟,就像參與者一樣。這會減少觀察者重新啟動時的復原時間。設定為「false」以停用此功能。預設值為「true」
-
extendedTypesEnabled:(僅限 Java 系統屬性:zookeeper.extendedTypesEnabled) 3.5.4、3.6.0 新功能:定義為
true
以啟用延伸功能,例如建立 TTL 節點。它們預設為停用。重要事項:啟用時,伺服器 ID 必須小於 255,這是由於內部限制所致。 -
emulate353TTLNodes:(僅限 Java 系統屬性:zookeeper.emulate353TTLNodes)。3.5.4、3.6.0 中的新增功能:由於 [ZOOKEEPER-2901] (https://issues.apache.org/jira/browse/ZOOKEEPER-2901),在版本 3.5.3 中建立的 TTL 節點不受 3.5.4/3.6.0 支援。不過,我們透過 zookeeper.emulate353TTLNodes 系統屬性提供了一個解決方法。如果您在 ZooKeeper 3.5.3 中使用 TTL 節點,且需要維持相容性,請將 zookeeper.emulate353TTLNodes 設為
true
,並將 zookeeper.extendedTypesEnabled 也設為true
。注意:由於錯誤,伺服器 ID 必須為 127 或更小。此外,支援的 TTL 值上限為1099511627775
,小於 3.5.3 中允許的值 (1152921504606846975
) -
watchManagerName:(僅限 Java 系統屬性:zookeeper.watchManagerName) 3.6.0 中的新增功能:新增於 ZOOKEEPER-1179 中。新增了新的監視器管理員 WatchManagerOptimized,用於最佳化大量使用監視器時的記憶體負擔。此設定用於定義要使用的監視器管理員。目前,我們僅支援 WatchManager 和 WatchManagerOptimized。
-
watcherCleanThreadsNum:(僅限 Java 系統屬性:zookeeper.watcherCleanThreadsNum) 3.6.0 中的新增功能:新增於 ZOOKEEPER-1179 中。新的監視器管理員 WatchManagerOptimized 會延後清除失效的監視器,此設定用於決定在 WatcherCleaner 中使用多少執行緒。執行緒越多,通常表示清除速度越快。預設值為 2,即使在大量且持續關閉/重新建立工作階段的情況下,此值也已足夠。
-
watcherCleanThreshold:(僅限 Java 系統屬性:zookeeper.watcherCleanThreshold) 3.6.0 中的新增功能:新增於 ZOOKEEPER-1179 中。新的監視器管理員 WatchManagerOptimized 會延後清除失效的監視器,清除程序相對繁重,批次處理將降低成本並提升效能。此設定用於決定批次大小。預設值為 1000,如果沒有記憶體或清除速度問題,我們不需要變更此值。
-
watcherCleanIntervalInSeconds:(僅限 Java 系統屬性:zookeeper.watcherCleanIntervalInSeconds) 3.6.0 中的新增功能:新增於 ZOOKEEPER-1179 中。新的監視器管理員 WatchManagerOptimized 會延後清除失效的監視器,清除程序相對繁重,批次處理將降低成本並提升效能。除了 watcherCleanThreshold 之外,此設定用於在特定時間後清除失效的監視器,即使失效的監視器未超過 watcherCleanThreshold,這樣我們就不會讓失效的監視器停留在系統中太久。預設設定為 10 分鐘,通常不需要變更。
-
maxInProcessingDeadWatchers:(僅限 Java 系統屬性:zookeeper.maxInProcessingDeadWatchers) 3.6.0 中的新增功能:新增於 ZOOKEEPER-1179 中。這用於控制 WatcherCleaner 中可以有多少待處理項目,當達到此數量時,它會減慢將失效的監視器加入 WatcherCleaner 的速度,進而減慢加入和關閉監視器,這樣我們就可以避免發生 OOM 問題。預設沒有限制,您可以將其設為 watcherCleanThreshold * 1000 等值。
-
bitHashCacheSize:(僅限 Java 系統屬性:zookeeper.bitHashCacheSize) 新增於 3.6.0:新增於 ZOOKEEPER-1179 這是用於決定 BitHashSet 實作中 HashSet 快取大小的設定。沒有 HashSet 的話,我們需要使用 O(N) 時間來取得元素,N 是 elementBits 中的位元數。但是我們需要保持大小較小,以確保它不會在記憶體中花費太多,在記憶體和時間複雜度之間需要權衡。預設值為 10,這似乎是一個相對合理的快取大小。
-
fastleader.minNotificationInterval:(Java 系統屬性:zookeeper.fastleader.minNotificationInterval) 連續兩次在 leader 選舉中進行通知檢查之間的時間長度下限。此區間決定了對等方等待檢查選舉投票組的時間長度,並影響選舉可以解決的速度。對於長時間選舉,此區間會遵循從設定的最小值 (此值) 和設定的最大值 (fastleader.maxNotificationInterval) 開始的遞減策略。
-
fastleader.maxNotificationInterval:(Java 系統屬性:zookeeper.fastleader.maxNotificationInterval) 連續兩次在 leader 選舉中進行通知檢查之間的時間長度上限。此區間決定了對等方等待檢查選舉投票組的時間長度,並影響選舉可以解決的速度。對於長時間選舉,此區間會遵循從設定的最小值 (fastleader.minNotificationInterval) 和設定的最大值 (此值) 開始的遞減策略。
-
connectionMaxTokens:(Java 系統屬性:zookeeper.connection_throttle_tokens) 新增於 3.6.0:這是調整伺服器端連線限制器的參數之一,這是一種基於權杖的速率限制機制,具有可選的機率性丟棄。此參數定義權杖桶中的最大權杖數。設定為 0 時,會停用限制。預設值為 0。
-
connectionTokenFillTime:(Java 系統屬性:zookeeper.connection_throttle_fill_time) 新增於 3.6.0:這是調整伺服器端連線限制器的參數之一,這是一種基於權杖的速率限制機制,具有可選的機率性丟棄。此參數定義以毫秒為單位的區間,其中權杖桶會重新填滿 connectionTokenFillCount 個權杖。預設值為 1。
-
connectionTokenFillCount:(Java 系統屬性:zookeeper.connection_throttle_fill_count) 新增於 3.6.0:這是調整伺服器端連線限制器的參數之一,這是一種基於權杖的速率限制機制,具有可選的機率性丟棄。此參數定義每隔 connectionTokenFillTime 毫秒要新增到權杖桶的權杖數。預設值為 1。
-
connectionFreezeTime:(Java 系統屬性:zookeeper.connection_throttle_freeze_time) 新增於 3.6.0:這是調整伺服器端連線限制器的參數之一,這是一種基於權杖的速率限制機制,具有可選的機率性丟棄。此參數定義以毫秒為單位的區間,其中會調整丟棄機率。設定為 -1 時,會停用機率性丟棄。預設值為 -1。
-
connectionDropIncrease : (Java 系統屬性:zookeeper.connection_throttle_drop_increase) 3.6.0 新功能:這是調整伺服器端連線節流器的其中一個參數,而連線節流器是一種基於權杖的速率限制機制,並可選擇機率性丟棄。此參數定義要增加的丟棄機率。節流器每隔 connectionFreezeTime 毫秒檢查一次,如果權杖儲存區為空,丟棄機率就會增加 connectionDropIncrease。預設值為 0.02。
-
connectionDropDecrease : (Java 系統屬性:zookeeper.connection_throttle_drop_decrease) 3.6.0 新功能:這是調整伺服器端連線節流器的其中一個參數,而連線節流器是一種基於權杖的速率限制機制,並可選擇機率性丟棄。此參數定義要減少的丟棄機率。節流器每隔 connectionFreezeTime 毫秒檢查一次,如果權杖儲存區的權杖多於一個閾值,丟棄機率就會減少 connectionDropDecrease。閾值為 connectionMaxTokens * connectionDecreaseRatio。預設值為 0.002。
-
connectionDecreaseRatio : (Java 系統屬性:zookeeper.connection_throttle_decrease_ratio) 3.6.0 新功能:這是調整伺服器端連線節流器的其中一個參數,而連線節流器是一種基於權杖的速率限制機制,並可選擇機率性丟棄。此參數定義減少丟棄機率的閾值。預設值為 0。
-
zookeeper.connection_throttle_weight_enabled : (僅限 Java 系統屬性) 3.6.0 新功能:節流時是否考量連線權重。僅在啟用連線節流時有用,也就是說,connectionMaxTokens 大於 0。預設值為 false。
-
zookeeper.connection_throttle_global_session_weight : (僅限 Java 系統屬性) 3.6.0 新功能:全域工作階段的權重。這是全域工作階段要求通過連線節流器所需的權杖數目。它必須是不小於本機工作階段權重的正整數。預設值為 3。
-
zookeeper.connection_throttle_local_session_weight : (僅限 Java 系統屬性) 3.6.0 新功能:本機工作階段的權重。這是本機工作階段要求通過連線節流器所需的權杖數目。它必須是不大於全域工作階段或更新工作階段權重的正整數。預設值為 1。
-
zookeeper.connection_throttle_renew_session_weight : (僅限 Java 系統屬性) 3.6.0 新功能:更新工作階段的權重。這也是重新連線要求通過節流器所需的權杖數目。它必須是不小於本機工作階段權重的正整數。預設值為 2。
-
clientPortListenBacklog : (無 Java 系統屬性) 3.4.14、3.5.5、3.6.0 中的新增功能:ZooKeeper 伺服器 Socket 的 Socket 積壓長度。這會控制伺服器端排隊等候 ZooKeeper 伺服器處理的要求數量。超過此長度的連線會收到網路逾時 (30 秒),這可能會導致 ZooKeeper 會話過期問題。預設情況下,此值未設定 (
-1
),在 Linux 上會使用50
的積壓。此值必須是正數。 -
serverCnxnFactory : (Java 系統屬性:zookeeper.serverCnxnFactory) 指定 ServerCnxnFactory 實作。應將此設定為
NettyServerCnxnFactory
以使用基於 TLS 的伺服器通訊。預設為NIOServerCnxnFactory
。 -
flushDelay : (Java 系統屬性:zookeeper.flushDelay) 延遲提交記錄沖刷的時間(毫秒)。不會影響 maxBatchSize 定義的限制。預設為停用(值為 0)。寫入速率高的集合可能透過 10-20 毫秒的值來提升處理量。
-
maxWriteQueuePollTime : (Java 系統屬性:zookeeper.maxWriteQueuePollTime) 如果啟用 flushDelay,這會決定在沒有新的要求排隊時,等待沖刷前要等待的時間(毫秒)。預設設定為 flushDelay/3(預設為隱式停用)。
-
maxBatchSize : (Java 系統屬性:zookeeper.maxBatchSize) 在觸發提交記錄沖刷之前,伺服器允許的交易數量。不會影響 flushDelay 定義的限制。預設為 1000。
-
enforceQuota : (Java 系統屬性:zookeeper.enforceQuota) 3.7.0 中的新增功能:強制執行配額檢查。當啟用此功能,且用戶端超過 znode 下的總位元組或子代計數硬配額時,伺服器會拒絕要求,並強制回覆用戶端
QuotaExceededException
。預設值為:false。探索 配額功能 以取得更多詳細資料。 -
requestThrottleLimit : (Java 系統屬性:zookeeper.request_throttle_max_requests) 3.6.0 中的新增功能:在 RequestThrottler 開始延遲之前允許的未完成要求總數。設定為 0 時,會停用節流。預設為 0。
-
requestThrottleStallTime : (Java 系統屬性:zookeeper.request_throttle_stall_time) 3.6.0 中的新增功能:執行緒等待通知才能繼續處理要求的最長時間(毫秒)。預設為 100。
-
requestThrottleDropStale:(Java 系統屬性:request_throttle_drop_stale) 3.6.0 中的新增功能:啟用時,節流器將會捨棄過期的要求,而不是將它們發佈到要求管線。過期的要求是由現在已關閉的連線所傳送的要求,和/或要求延遲時間高於會話逾時的要求。預設為 true。
-
requestStaleLatencyCheck:(Java 系統屬性:zookeeper.request_stale_latency_check) 3.6.0 中的新增功能:啟用時,如果要求延遲時間高於其相關聯的會話逾時,則要求會被視為過期。預設為停用。
-
requestStaleConnectionCheck:(Java 系統屬性:zookeeper.request_stale_connection_check) 3.6.0 中的新增功能:啟用時,如果要求的連線已關閉,則要求會被視為過期。預設為啟用。
-
zookeeper.request_throttler.shutdownTimeout:(僅限 Java 系統屬性) 3.6.0 中的新增功能:RequestThrottler 在強制關閉之前,等待要求佇列在關閉期間排出的時間(以毫秒為單位)。預設為 10000。
-
advancedFlowControlEnabled:(Java 系統屬性:zookeeper.netty.advancedFlowControl.enabled) 使用基於 ZooKeeper 管線狀態的精確流控,以避免直接緩衝區 OOM。它會停用 Netty 中的 AUTO_READ。
-
enableEagerACLCheck:(僅限 Java 系統屬性:zookeeper.enableEagerACLCheck) 設定為「true」時,會在將要求傳送至法定人數之前,針對每個本機伺服器上的寫入要求啟用急切 ACL 檢查。預設為「false」。
-
maxConcurrentSnapSyncs:(Java 系統屬性:zookeeper.leader.maxConcurrentSnapSyncs) 一個領導者或追隨者可以同時處理的最大快照同步數。預設為 10。
-
maxConcurrentDiffSyncs:(Java 系統屬性:zookeeper.leader.maxConcurrentDiffSyncs) 一個領導者或追隨者可以同時處理的最大差異同步數。預設為 100。
-
digest.enabled:(僅限 Java 系統屬性:zookeeper.digest.enabled) 3.6.0 中的新增功能:已新增摘要功能,以在從磁碟載入資料庫、追趕和追隨領導者時偵測 ZooKeeper 內部的資料不一致,其會根據 adHash 論文中所述,針對 DataTree 執行遞增雜湊檢查
https://cseweb.ucsd.edu/~daniele/papers/IncHash.pdf
這個概念很簡單,DataTree 的雜湊值會根據資料集的變更遞增更新。當領導者準備交易時,它會根據變更使用公式預先計算樹的雜湊
current_hash = current_hash + hash(new node data) - hash(old node data)
如果它正在建立新的節點,則 hash(舊節點資料) 會為 0,如果它是刪除節點的運算,則 hash(新節點資料) 會為 0。
此雜湊將與每個交易相關聯,以表示將交易套用至資料樹後預期的雜湊值,它將與原始提案一起傳送給追隨者。學習者會在將交易套用至資料樹後,將實際雜湊值與交易中的雜湊值進行比較,如果不同,則回報不符。
這些摘要值也會與每個交易和快照一起保留在磁碟上,因此當伺服器重新啟動並從磁碟載入資料時,它會進行比較並查看是否有雜湊不符,這將有助於偵測磁碟上的資料遺失問題。
對於實際雜湊函數,我們在內部使用 CRC,它不是無碰撞雜湊函數,但與無碰撞雜湊相比,它更有效率,而且碰撞可能性非常非常罕見,已經可以滿足我們在此處的需求。
此功能具有向後和向前相容性,因此可以安全地進行升級、降級、啟用和稍後停用,而不會有任何相容性問題。以下是已涵蓋和測試的場景
- 當引導程式使用新程式碼執行,而追隨者使用舊程式碼執行時,摘要將附加到每個交易的結尾,追隨者將只讀取標頭和交易資料,交易中的摘要值將被忽略。它不會影響追隨者讀取和處理下一個交易。
- 當引導程式使用舊程式碼執行,而追隨者使用新程式碼執行時,摘要不會隨交易一起傳送,當追隨者嘗試讀取摘要時,它會擲出 EOF,該 EOF 會被捕捉並以將摘要值設定為 null 的方式妥善處理。
- 當使用新程式碼載入舊快照時,它會在嘗試讀取不存在的摘要值時擲出 IOException,而且例外情況會被捕捉,摘要會設定為 null,這表示我們在載入此快照時不會比較摘要,預期會在滾動升級期間發生。
- 當使用舊程式碼載入新快照時,它會在反序列化資料樹後成功完成,快照檔案結尾的摘要值將被忽略
- 使用旗標變更進行滾動重新啟動的場景類似於上面討論的第一和第二個場景,如果引導程式已啟用,但追隨者未啟用,摘要值將被忽略,追隨者在執行期間不會比較摘要;如果引導程式已停用,但追隨者已啟用,追隨者將收到 EOF 例外,該例外會被妥善處理。
注意:目前的摘要計算排除 /zookeeper 下的節點,因為 /zookeeper/quota 統計節點中潛在的不一致性,我們可以在問題修復後包含該節點。
預設情況下,此功能已啟用,設定為「false」以停用。
-
snapshot.compression.method: (Java 系統屬性:zookeeper.snapshot.compression.method) 3.6.0 中的新增功能:此屬性控制 ZooKeeper 是否在將快照儲存在磁碟上之前壓縮快照(請參閱 ZOOKEEPER-3179)。可能的值為
-
snapshot.trust.empty: (Java 系統屬性:zookeeper.snapshot.trust.empty) 3.5.6 中的新增功能:此屬性控制 ZooKeeper 是否將遺失的快照檔案視為無法復原的致命狀態。設定為 true 以允許 ZooKeeper 伺服器在沒有快照檔案的情況下復原。這應該只在從舊版本的 ZooKeeper(3.4.x,3.5.3 之前)升級期間設定,在該期間 ZooKeeper 可能只有交易記錄檔案,但沒有快照檔案。如果在升級期間設定值,我們建議在升級和重新啟動 ZooKeeper 程序後將值設定回 false,以便 ZooKeeper 能在復原程序期間繼續進行正常的資料一致性檢查。預設值為 false。
-
audit.enable: (Java 系統屬性:zookeeper.audit.enable) 3.6.0 中的新增功能:預設情況下,稽核記錄已停用。設定為「true」以啟用。預設值為「false」。請參閱 ZooKeeper 稽核記錄 以取得更多資訊。
-
audit.impl.class: (Java 系統屬性:zookeeper.audit.impl.class) 3.6.0 中的新增功能:實作稽核記錄器的類別。預設情況下,使用基於 logback 的稽核記錄器 org.apache.zookeeper.audit .Slf4jAuditLogger。請參閱 ZooKeeper 稽核記錄 以取得更多資訊。
-
largeRequestMaxBytes: (Java 系統屬性:zookeeper.largeRequestMaxBytes) 3.6.0 中的新增功能:所有正在進行的大型請求的位元組最大數量。如果即將進行的大型請求導致超過限制,則會關閉連線。預設值為 100 * 1024 * 1024。
-
largeRequestThreshold: (Java 系統屬性:zookeeper.largeRequestThreshold) 3.6.0 中的新增功能:請求被視為大型請求的尺寸閾值。如果為 -1,則所有請求都被視為小型請求,有效地關閉大型請求限制。預設值為 -1。
-
outstandingHandshake.limit(僅限 Java 系統屬性:zookeeper.netty.server.outstandingHandshake.limit)ZooKeeper 中可能有的最大進行中 TLS 握手連線,超過此限制的連線會在開始握手之前遭到拒絕。此設定不會限制最大 TLS 並行性,但有助於在進行中 TLS 握手過多時避免因 TLS 握手逾時而產生的羊群效應。將其設定為 250 左右就足以避免羊群效應。
-
netty.server.earlyDropSecureConnectionHandshakes(Java 系統屬性:zookeeper.netty.server.earlyDropSecureConnectionHandshakes)如果 ZooKeeper 伺服器尚未完全啟動,請在執行 TLS 握手之前中斷 TCP 連線。這有助於在重新啟動後防止伺服器因大量同時 TLS 握手而過載。請注意,如果您啟用此旗標,伺服器在尚未完全啟動時將不會回應「ruok」指令。
中斷連線的行為已在 ZooKeeper 3.7 中引入,而且無法停用。自 3.7.1 和 3.8.0 起,此功能預設為停用。
-
throttledOpWaitTime(Java 系統屬性:zookeeper.throttled_op_wait_time)RequestThrottler 佇列中請求會被標記為受限的時間長度。受限請求不會被處理,只會傳送到其所屬伺服器的管線中,以保留所有請求的順序。FinalProcessor 會針對這些未消化的請求發出錯誤回應(新的錯誤代碼:ZTHROTTLEDOP)。目的是讓用戶端不要立即重試這些請求。設定為 0 時,不會限制任何請求。預設值為 0。
-
learner.closeSocketAsync(Java 系統屬性:zookeeper.learner.closeSocketAsync)(Java 系統屬性:learner.closeSocketAsync)(為向後相容性而新增)3.7.0 中的新增功能:啟用時,學習器會非同步關閉法定人數通訊埠。這對於 TLS 連線很有用,因為關閉通訊埠可能需要很長的時間,會阻擋關閉程序,可能會延遲新的領導人選舉,並讓法定人數無法使用。非同步關閉通訊埠可避免在通訊埠關閉時間很長的情況下阻擋關閉程序,而且可以在通訊埠關閉時啟動新的領導人選舉。預設值為 false。
-
leader.closeSocketAsync(Java 系統屬性:zookeeper.leader.closeSocketAsync)(Java 系統屬性:leader.closeSocketAsync)(為向後相容性而新增)3.7.0 中的新增功能:啟用時,領導人會非同步關閉法定人數通訊埠。這對於 TLS 連線很有用,因為關閉通訊埠可能需要很長的時間。如果在 ping() 中因為 SyncLimitCheck 失敗而中斷追隨者,那麼長時間的通訊埠關閉時間會阻擋傳送 ping 給其他追隨者。在沒有收到 ping 的情況下,其他追隨者不會將工作階段資訊傳送給領導人,這會導致工作階段過期。將此旗標設定為 true 可確保定期傳送 ping。預設值為 false。
-
learner.asyncSending(Java 系統屬性:zookeeper.learner.asyncSending)(Java 系統屬性:learner.asyncSending)(為向後相容性而新增)3.7.0 中的新增功能:Learner 中的傳送和接收封包在臨界區中同步執行。不適時的網路問題可能會導致追隨者當機(請參閱 ZOOKEEPER-3575 和 ZOOKEEPER-4074)。新的設計將 Learner 中的封包傳送移至獨立執行緒,並非同步傳送封包。新的設計已使用此參數(learner.asyncSending)啟用。預設值為 false。
-
forward_learner_requests_to_commit_processor_disabled(Java 系統屬性:zookeeper.forward_learner_requests_to_commit_processor_disabled)設定此屬性後,Learner 的要求將不會排入 CommitProcessor 佇列,這將有助於節省領導者的資源和 GC 時間。
預設值為 false。
-
serializeLastProcessedZxid.enabled(Java 系統屬性:zookeeper.serializeLastProcessedZxid.enabled)3.9.0 中的新增功能:如果啟用,ZooKeeper 會在快照時序列化 lastProcessedZxid,並在還原時反序列化。預設值為 true。需要啟用才能透過管理員伺服器命令執行快照和還原,因為沒有快照檔名稱可供擷取 lastProcessedZxid。
此功能具有向後和向前相容性。以下是不同的情境。
-
由伺服器內部觸發的快照 a. 在使用新程式碼載入舊快照時,嘗試讀取不存在的 lastProcessedZxid 值時,將會擲出 EOFException,並會捕捉到例外狀況。將使用快照檔名稱設定 lastProcessedZxid。
b. 在使用舊程式碼載入新快照時,反序列化摘要值後將會順利完成,快照檔結尾的 lastProcessedZxid 將會被忽略。將使用快照檔名稱設定 lastProcessedZxid。
- 領導者和追隨者之間的同步 lastProcessedZxid 在新舊程式碼中都不會由領導者序列化,也不會由追隨者反序列化。它將設定為透過 QuorumPacket 從領導者傳送的 lastProcessedZxid。
-
透過管理員伺服器 API 觸發的快照 此功能標記需要啟用才能讓快照命令運作。
叢集選項
此區段中的選項設計為與伺服器組合作使用,亦即在部署伺服器叢集時使用。
- electionAlg:(沒有 Java 系統屬性)要使用的選舉實作。值「1」對應於快速領導者選舉的非驗證 UDP 版本,「2」對應於快速領導者選舉的驗證 UDP 版本,而「3」對應於快速領導者選舉的 TCP 版本。演算法 3 在 3.2.0 中設為預設值,而較早版本(3.0.0 和 3.1.0)則使用演算法 1 和 2。
注意
領導者選舉 1 和 2 的實作已在 3.4.0 中標示為已淘汰。自 3.6.0 起,僅 FastLeaderElection 可用,在升級時,您必須關閉所有伺服器,並使用 electionAlg=3(或從組態檔中移除該行)重新啟動它們。>
- maxTimeToWaitForEpoch:(Java 系統屬性:zookeeper.leader.maxTimeToWaitForEpoch) 3.6.0 中的新增功能:啟動領導者時,從投票者等待 epoch 的最長時間。如果領導者從其中一個投票者收到 LOOKING 通知,且在 maxTimeToWaitForEpoch 內未從多數投票者收到 epoch 封包,則會轉為 LOOKING 並再次選出領導者。這可以調整為減少法定人數或伺服器不可用時間,可以設定為遠小於 initLimit * tickTime。在跨資料中心環境中,可以設定為 2 秒左右。
-
initLimit:(無 Java 系統屬性) 允許追隨者連線並同步至領導者的時間量,以刻度為單位(請參閱 tickTime)。如果 ZooKeeper 管理的資料量很大,請視需要增加此值。
-
connectToLearnerMasterLimit:(Java 系統屬性:zookeeper.connectToLearnerMasterLimit) 選出領導者後,允許追隨者連線至領導者的時間量,以刻度為單位(請參閱 tickTime)。預設為 initLimit 的值。在 initLimit 較高時使用,這樣連線至學習主控端就不會導致較高的逾時。
-
leaderServes:(Java 系統屬性:zookeeper.leaderServes) 領導者接受用戶端連線。預設值為「yes」。領導者機器會協調更新。為了在讀取量略微犧牲的情況下提高更新量,可以將領導者設定為不接受用戶端並專注於協調。此選項的預設值為 yes,表示領導者會接受用戶端連線。
注意
當一個 ZooKeeper 群集中有超過三個 ZooKeeper 伺服器時,強烈建議開啟領導者選取。
- server.x=[hostname]:nnnnn[:nnnnn] 等:(無 Java 系統屬性) 組成 ZooKeeper 群集的伺服器。當伺服器啟動時,它會透過在資料目錄中尋找檔案 myid 來判斷自己是哪個伺服器。該檔案包含伺服器編號(以 ASCII 碼表示),且應與此設定左側的 server.x 中的 x 相符。用戶端使用的 ZooKeeper 伺服器清單必須與每個 ZooKeeper 伺服器擁有的 ZooKeeper 伺服器清單相符。有兩個埠號 nnnnn。第一個用於追隨者連線至領導者,第二個用於領導者選取。如果您想在單一機器上測試多個伺服器,則可以使用不同的埠號給每個伺服器。
自從 ZooKeeper 3.6.0 起,可以為每個 ZooKeeper 伺服器指定多個位址(請參閱 ZOOKEEPER-3188)。若要啟用此功能,您必須將 multiAddress.enabled 組態屬性設定為 true。這有助於提高可用性,並為 ZooKeeper 增加網路層級的復原能力。當伺服器使用多個實體網路介面時,ZooKeeper 能夠繫結至所有介面,並在發生網路錯誤時執行時間切換至運作中的介面。不同的位址可以使用直線 (|) 字元在組態中指定。使用多個位址的有效組態如下所示
server.1=zoo1-net1:2888:3888|zoo1-net2:2889:3889 server.2=zoo2-net1:2888:3888|zoo2-net2:2889:3889 server.3=zoo3-net1:2888:3888|zoo3-net2:2889:3889
注意
啟用此功能後,Quorum 通訊協定(ZooKeeper 伺服器對伺服器通訊協定)會變更。使用者不會注意到這項變更,當有人使用新的組態啟動 ZooKeeper 群集時,所有功能都會正常運作。不過,如果舊的 ZooKeeper 群集不支援 multiAddress 功能(和新的 Quorum 通訊協定),則無法在執行滾動升級期間啟用此功能並指定多個位址。如果您需要此功能,但您也需要從早於 3.6.0 的 ZooKeeper 群集執行滾動升級,則您必須先在未啟用 MultiAddress 功能的情況下執行滾動升級,然後再使用新的組態進行單獨的滾動重新啟動,其中 multiAddress.enabled 設定為 true,並提供多個位址。
- syncLimit:(沒有 Java 系統屬性) 允許追隨者與 ZooKeeper 同步的時間量,以刻度為單位(請參閱 tickTime)。如果追隨者落後領導者太多,則會將其移除。
-
group.x=nnnnn[:nnnnn]:(沒有 Java 系統屬性) 啟用階層式 Quorum 建構。「x」是群組識別碼,等號 (=) 後面的數字對應於伺服器識別碼。指定項目的左側是伺服器識別碼的冒號分隔清單。請注意,群組必須不相交,且所有群組的聯集必須是 ZooKeeper 聯合體。您會在此處找到範例 here
-
weight.x=nnnnn : (無 Java 系統屬性) 與「group」一起使用時,它會在形成法定人數時為伺服器指定權重。此值對應於伺服器在投票時的權重。ZooKeeper 有幾個部分需要投票,例如領導者選舉和原子廣播通訊協定。預設伺服器的權重為 1。如果組態定義群組,但未定義權重,則會將值 1 指定給所有伺服器。您可以在這裡找到範例
-
cnxTimeout : (Java 系統屬性:zookeeper.cnxTimeout) 設定開啟領導者選舉通知連線的逾時值。僅適用於使用 electionAlg 3 的情況。
注意
預設值為 5 秒。
- quorumCnxnTimeoutMs : (Java 系統屬性:zookeeper.quorumCnxnTimeoutMs) 設定領導者選舉通知連線的讀取逾時值。僅適用於使用 electionAlg 3 的情況。
注意
預設值為 -1,然後會使用 syncLimit * tickTime 作為逾時時間。
- standaloneEnabled : (無 Java 系統屬性) 3.5.0 新增:設定為 false 時,可以在複製模式下啟動單一伺服器,單一參與者可以使用觀察者執行,而叢集可以重新組態為一個節點,也可以從一個節點擴充。預設值為 true 以維持向後相容性。可以使用 QuorumPeerConfig 的 setStandaloneEnabled 方法設定,或將「standaloneEnabled=false」或「standaloneEnabled=true」新增到伺服器的組態檔中。
-
reconfigEnabled : (無 Java 系統屬性) 3.5.3 新增:這會控制啟用或停用動態重新組態功能。啟用此功能後,使用者可以透過 ZooKeeper 伺服器端 API 或 ZooKeeper 命令列工具執行重新組態作業,前提是使用者有權執行此類作業。停用此功能後,沒有任何使用者,包括超級使用者,可以執行重新組態。任何重新組態的嘗試都會傳回錯誤。可以將「reconfigEnabled」選項設定為「reconfigEnabled=false」或「reconfigEnabled=true」到伺服器的組態檔,或使用 QuorumPeerConfig 的 setReconfigEnabled 方法。預設值為 false。如果存在,整個集合中每個伺服器的值都應該一致。在某些伺服器上將值設定為 true,而在其他伺服器上將值設定為 false,會導致不一致的行為,具體取決於哪個伺服器被選為領導者。如果領導者的設定為「reconfigEnabled=true」,則集合會啟用重新組態功能。如果領導者的設定為「reconfigEnabled=false」,則集合會停用重新組態功能。因此,建議在集合中的伺服器上將「reconfigEnabled」設定為一致的值。
-
4lw.commands.whitelist : (Java 系統屬性:zookeeper.4lw.commands.whitelist) 3.5.3 新增:使用者想要使用的逗號分隔四個字母的字命令清單。有效的四個字母的字命令必須放在此清單中,否則 ZooKeeper 伺服器不會啟用該命令。預設白名單只包含 zkServer.sh 使用的「srvr」命令。其他四個字母的字命令預設停用:嘗試使用它們會收到「.... 未執行,因為它不在白名單中」的回應。以下範例說明了在停用其他四個字母的字命令的同時,啟用 stat、ruok、conf 和 isro 命令的組態
4lw.commands.whitelist=stat, ruok, conf, isro
如果你真的需要預設啟用所有四個字母的指令,你可以使用星號選項,這樣就不必在清單中逐一包含每個指令。例如,這將啟用所有四個字母的指令
4lw.commands.whitelist=*
-
tcpKeepAlive:(Java 系統屬性:zookeeper.tcpKeepAlive) 3.5.4 中的新增功能:將此設定為 true 會在過半數成員用來執行選舉的 socket 上設定 TCP keepAlive 旗標。這將允許過半數成員之間的連線在可能會中斷連線的網路基礎架構中保持連線。某些 NAT 和防火牆可能會終止或遺失長時間執行或閒置連線的狀態。啟用此選項仰賴作業系統層級設定才能正常運作,請查看作業系統關於 TCP keepalive 的選項以取得更多資訊。預設為 false。
-
clientTcpKeepAlive:(Java 系統屬性:zookeeper.clientTcpKeepAlive) 3.6.1 中的新增功能:將此設定為 true 會在用戶端 socket 上設定 TCP keepAlive 旗標。某些中斷的網路基礎架構可能會遺失從關閉用戶端傳送的 FIN 封包。這些從未關閉的用戶端 socket 會造成作業系統資源外洩。啟用此選項會透過閒置檢查終止這些僵屍 socket。啟用此選項仰賴作業系統層級設定才能正常運作,請查看作業系統關於 TCP keepalive 的選項以取得更多資訊。預設為 false。請注意它與 tcpKeepAlive 之間的區別。它套用於用戶端 socket,而 tcpKeepAlive 則套用於過半數成員使用的 socket。目前此選項僅在使用預設
NIOServerCnxnFactory
時可用。 -
electionPortBindRetry:(僅限 Java 系統屬性:zookeeper.electionPortBindRetry) 當 Zookeeper 伺服器無法繫結領導選舉埠時,屬性會設定最大重試次數。此類錯誤可能是暫時的且可復原的,例如 ZOOKEEPER-3320 中所述的 DNS 問題,或無法重試的,例如埠已在使用中。在暫時錯誤的情況下,此屬性可以提升 Zookeeper 伺服器的可用性,並協助其自行復原。預設值為 3。在容器環境中,特別是在 Kubernetes 中,此值應增加或設定為 0(無限重試)以克服與 DNS 名稱解析相關的問題。
-
observer.reconnectDelayMs:(Java 系統屬性:zookeeper.observer.reconnectDelayMs) 當觀察者失去與領導者的連線時,它會等待指定的值,然後再嘗試重新連線到領導者,這樣整個觀察者艦隊就不會嘗試執行領導者選舉並同時重新連線到領導者。預設為 0 毫秒。
-
observer.election.DelayMs:(Java 系統屬性:zookeeper.observer.election.DelayMs) 延遲觀察者在中斷連線後參與領導者選舉,以防止在過程中對投票對等方造成意外的額外負載。預設為 200 毫秒。
-
localSessionsEnabled 和 localSessionsUpgradingEnabled:3.5 中的新增功能:可選值為 true 或 false。其預設值為 false。透過設定 localSessionsEnabled=true 來開啟本機階段功能。開啟 localSessionsUpgradingEnabled 可以根據需要自動將本機階段升級為全域階段(例如建立臨時節點),這僅在啟用 localSessionsEnabled 時才重要。
加密、驗證、授權選項
本節中的選項允許控制服務執行的加密/驗證/授權。
除了此頁面外,您還可以在 程式設計人員指南 中找到有關用戶端側組態的實用資訊。ZooKeeper Wiki 也有關於 ZooKeeper SSL 支援 和 ZooKeeper 的 SASL 驗證 的實用頁面。
-
DigestAuthenticationProvider.enabled:(Java 系統屬性:zookeeper.DigestAuthenticationProvider.enabled) 3.7 中的新增功能:決定是否啟用
digest
驗證提供者。預設值為 true 以維持向後相容性,但如果未使用,最好停用此提供者,因為它可能會導致誤導性條目出現在稽核記錄中(請參閱 ZOOKEEPER-3979) -
DigestAuthenticationProvider.superDigest:(Java 系統屬性:zookeeper.DigestAuthenticationProvider.superDigest) 預設情況下,此功能已停用 3.2 中的新增功能:允許 ZooKeeper 整合管理員以「超級」用戶的身分存取 znode 層級。特別是,對於驗證為超級用戶的用戶,不會執行任何 ACL 檢查。org.apache.zookeeper.server.auth.DigestAuthenticationProvider 可用於產生 superDigest,使用一個「super:
」參數呼叫它。在啟動整合的每個伺服器時,提供產生的「super:」作為系統屬性值。當對 ZooKeeper 伺服器進行驗證(來自 ZooKeeper 用戶端)時,傳遞「digest」的架構和「super: 」的驗證資料。請注意,digest 驗證會以純文字將驗證資料傳遞到伺服器,建議僅在 localhost(而非透過網路)或透過加密連線使用此驗證方法。 -
DigestAuthenticationProvider.digestAlg:(Java 系統屬性:zookeeper.DigestAuthenticationProvider.digestAlg) 3.7.0 中的新增功能:設定 ACL digest 演算法。預設值為:
SHA1
,未來將因安全性問題而棄用。在所有伺服器中設定此屬性為相同的值。-
如何支援其他更多演算法?
-
透過指定:
security.provider.<n>=<提供者類別名稱>
,修改$JAVA_HOME/jre/lib/security/java.security
下的java.security
組態檔。For example: set zookeeper.DigestAuthenticationProvider.digestAlg=RipeMD160 security.provider.3=org.bouncycastle.jce.provider.BouncyCastleProvider
-
將 jar 檔案複製到
$JAVA_HOME/jre/lib/ext/
。For example: copy bcprov-jdk18on-1.60.jar to $JAVA_HOME/jre/lib/ext/
-
-
如何從一個摘要演算法移轉到另一個摘要演算法?
-
- 移轉到新演算法時,重新產生
superDigest
。
- 移轉到新演算法時,重新產生
-
- 對已經有舊演算法摘要驗證的 znode
SetAcl
。
- 對已經有舊演算法摘要驗證的 znode
-
-
-
X509AuthenticationProvider.superUser:(Java 系統屬性:zookeeper.X509AuthenticationProvider.superUser) SSL 支援的方式,讓 ZooKeeper 叢集管理員可以「超級」使用者的身分存取 znode 階層。當此參數設定為 X500 主體名稱時,只有經過驗證且具有該主體的用戶端才能繞過 ACL 檢查,並對所有 znode 擁有完整權限。
-
zookeeper.superUser:(Java 系統屬性:zookeeper.superUser) 類似於 zookeeper.X509AuthenticationProvider.superUser,但適用於基於 SASL 的登入。它會儲存一個使用者名稱,該使用者可以「超級」使用者的身分存取 znode 階層。您可以使用 zookeeper.superUser.[suffix] 符號指定多個 SASL 超級使用者,例如:
zookeeper.superUser.1=...
。 -
ssl.authProvider:(Java 系統屬性:zookeeper.ssl.authProvider) 指定 org.apache.zookeeper.auth.X509AuthenticationProvider 的子類別,用於安全的用戶端驗證。這在不使用 JKS 的憑證金鑰基礎架構中很有用。可能需要延伸 javax.net.ssl.X509KeyManager 和 javax.net.ssl.X509TrustManager,才能從 SSL 堆疊中取得所需的行為。若要設定 ZooKeeper 伺服器使用自訂的提供者進行驗證,請為自訂的 AuthenticationProvider 選擇一個架構名稱,並將屬性 zookeeper.authProvider.[scheme] 設定為自訂實作的完整類別名稱。這會將提供者載入 ProviderRegistry。然後設定此屬性 zookeeper.ssl.authProvider=[scheme],該提供者將用於安全驗證。
-
zookeeper.ensembleAuthName:(僅限 Java 系統屬性:zookeeper.ensembleAuthName) 3.6.0 中的新增功能:指定叢集的有效名稱/別名的逗號分隔清單。用戶端可以提供它打算連線的叢集名稱,作為「叢集」架構的憑證。EnsembleAuthenticationProvider 會根據接收連線要求的叢集名稱/別名清單,檢查憑證。如果憑證不在清單中,連線要求將會被拒絕。這可以防止用戶端意外連線到錯誤的叢集。
-
sessionRequireClientSASLAuth: (Java 系統屬性:zookeeper.sessionRequireClientSASLAuth) 3.6.0 中的新增功能:設定為 true 時,ZooKeeper 伺服器只會接受已透過 SASL 向伺服器驗證身分的用戶端連線和要求。未設定 SASL 驗證或已設定 SASL 但驗證失敗(例如憑證無效)的用戶端將無法與伺服器建立工作階段。此種情況下會傳送型別錯誤碼 (-124),Java 和 C 用戶端之後會關閉與伺服器的連線,不再嘗試重新連線。
此設定是 enforce.auth.enabled=true 和 enforce.auth.scheme=sasl 的簡寫。
此功能預設為停用。想要啟用此功能的使用者可以將 sessionRequireClientSASLAuth 設定為 true。
此功能會覆寫
zookeeper.allowSaslFailedClients 選項,因此即使伺服器設定為允許 SASL 驗證失敗的用戶端登入,如果啟用此功能,用戶端仍無法與伺服器建立工作階段。 -
enforce.auth.enabled: (Java 系統屬性:zookeeper.enforce.auth.enabled) 3.7.0 中的新增功能:設定為 true 時,ZooKeeper 伺服器只會接受已透過設定的驗證機制向伺服器驗證身分的用戶端連線和要求。驗證機制可以使用屬性 enforce.auth.schemes 設定。未設定伺服器設定的任何驗證機制或已設定但驗證失敗(例如憑證無效)的用戶端將無法與伺服器建立工作階段。此種情況下會傳送型別錯誤碼 (-124),Java 和 C 用戶端之後會關閉與伺服器的連線,不再嘗試重新連線。
此功能預設為停用。想要啟用此功能的使用者可以將 enforce.auth.enabled 設定為 true。
當 enforce.auth.enabled=true 且 enforce.auth.schemes=sasl 時,
zookeeper.allowSaslFailedClients 設定會被覆寫。因此即使伺服器設定為允許 SASL 驗證失敗的用戶端登入,如果啟用此功能且驗證機制為 sasl,用戶端仍無法與伺服器建立工作階段。 -
enforce.auth.schemes: (Java 系統屬性:zookeeper.enforce.auth.schemes) 3.7.0 中的新增功能:驗證機制的逗號分隔清單。用戶端必須至少使用一種驗證機制驗證身分,才能執行任何 zookeeper 作業。此屬性僅在 enforce.auth.enabled 為 true 時使用。
-
sslQuorum : (Java 系統屬性:zookeeper.sslQuorum) 3.5.5 新功能:啟用加密的群集通訊。預設為
false
。啟用此功能時,請同時考慮啟用 leader.closeSocketAsync 和 learner.closeSocketAsync,以避免關閉 SSL 連線時可能出現的長時間 Socket 關閉問題。 -
ssl.keyStore.location 和 ssl.keyStore.password 以及 ssl.quorum.keyStore.location 和 ssl.quorum.keyStore.password : (Java 系統屬性:zookeeper.ssl.keyStore.location 和 zookeeper.ssl.keyStore.password 以及 zookeeper.ssl.quorum.keyStore.location 和 zookeeper.ssl.quorum.keyStore.password) 3.5.5 新功能:指定包含要使用於用戶端和群集 TLS 連線的本地憑證的 Java 儲存庫檔案路徑,以及用於解鎖檔案的密碼。
-
ssl.keyStore.passwordPath 和 ssl.quorum.keyStore.passwordPath : (Java 系統屬性:zookeeper.ssl.keyStore.passwordPath 和 zookeeper.ssl.quorum.keyStore.passwordPath) 3.8.0 新功能:指定包含儲存庫密碼的檔案路徑。從檔案讀取密碼優先於明確的密碼屬性。
-
ssl.keyStore.type 和 ssl.quorum.keyStore.type : (Java 系統屬性:zookeeper.ssl.keyStore.type 和 zookeeper.ssl.quorum.keyStore.type) 3.5.5 新功能:指定用戶端和群集儲存庫的檔案格式。值:JKS、PEM、PKCS12 或 null(根據檔名偵測)。預設值:null。3.5.10、3.6.3、3.7.0 新功能:已新增 BCFKS 格式。
-
ssl.trustStore.location 和 ssl.trustStore.password 以及 ssl.quorum.trustStore.location 和 ssl.quorum.trustStore.password : (Java 系統屬性:zookeeper.ssl.trustStore.location 和 zookeeper.ssl.trustStore.password 以及 zookeeper.ssl.quorum.trustStore.location 和 zookeeper.ssl.quorum.trustStore.password) 3.5.5 新功能:指定包含要使用於用戶端和群集 TLS 連線的遠端憑證的 Java 信任儲存庫檔案路徑,以及用於解鎖檔案的密碼。
-
ssl.trustStore.passwordPath 和 ssl.quorum.trustStore.passwordPath : (Java 系統屬性:zookeeper.ssl.trustStore.passwordPath 和 zookeeper.ssl.quorum.trustStore.passwordPath) 3.8.0 新功能:指定包含信任儲存庫密碼的檔案路徑。從檔案讀取密碼優先於明確的密碼屬性。
-
ssl.trustStore.type 和 ssl.quorum.trustStore.type : (Java 系統屬性:zookeeper.ssl.trustStore.type 和 zookeeper.ssl.quorum.trustStore.type) 3.5.5 新功能:指定用戶端和群集信任儲存庫的檔案格式。值:JKS、PEM、PKCS12 或 null(根據檔名偵測)。預設值:null。3.5.10、3.6.3、3.7.0 新功能:已新增 BCFKS 格式。
-
ssl.protocol 和 ssl.quorum.protocol : (Java 系統屬性:zookeeper.ssl.protocol 和 zookeeper.ssl.quorum.protocol) 3.5.5 新功能:指定要在用戶端和群集 TLS 協商中使用的協定。預設值:TLSv1.3 或 TLSv1.2,視所使用的 Java 執行時間版本而定。
-
ssl.enabledProtocols 和 ssl.quorum.enabledProtocols:(Java 系統屬性:zookeeper.ssl.enabledProtocols 和 zookeeper.ssl.quorum.enabledProtocols) 3.5.5 中的新增功能:指定在用戶端和法定人數 TLS 協商中啟用的協定。預設值:TLSv1.3,如果
protocol
屬性的值為 TLSv1.3。如果protocol
為 TLSv1.2,則為 TLSv1.2。 -
ssl.ciphersuites 和 ssl.quorum.ciphersuites:(Java 系統屬性:zookeeper.ssl.ciphersuites 和 zookeeper.ssl.quorum.ciphersuites) 3.5.5 中的新增功能:指定在用戶端和法定人數 TLS 協商中使用的已啟用加密套件。預設值:已啟用的加密套件取決於所使用的 Java 執行時間版本。
-
ssl.context.supplier.class 和 ssl.quorum.context.supplier.class:(Java 系統屬性:zookeeper.ssl.context.supplier.class 和 zookeeper.ssl.quorum.context.supplier.class) 3.5.5 中的新增功能:指定用於在用戶端和法定人數 SSL 通訊中建立 SSL 環境的類別。這允許您使用自訂 SSL 環境並實作以下場景
- 使用硬體金鑰儲存庫,使用 PKCS11 或類似方法載入。
- 您無法存取軟體金鑰儲存庫,但可以從其容器中擷取已建構的 SSLContext。預設值:null
-
ssl.hostnameVerification 和 ssl.quorum.hostnameVerification:(Java 系統屬性:zookeeper.ssl.hostnameVerification 和 zookeeper.ssl.quorum.hostnameVerification) 3.5.5 中的新增功能:指定是否在用戶端和法定人數 TLS 協商過程中啟用主機名稱驗證。僅建議在測試目的時停用它。預設值:true
-
ssl.crl 和 ssl.quorum.crl:(Java 系統屬性:zookeeper.ssl.crl 和 zookeeper.ssl.quorum.crl) 3.5.5 中的新增功能:指定是否在用戶端和法定人數 TLS 協定中啟用憑證吊銷清單。預設值:false
-
ssl.ocsp 和 ssl.quorum.ocsp:(Java 系統屬性:zookeeper.ssl.ocsp 和 zookeeper.ssl.quorum.ocsp) 3.5.5 中的新增功能:指定是否在用戶端和法定人數 TLS 協定中啟用線上憑證狀態協定。預設值:false
-
ssl.clientAuth 和 ssl.quorum.clientAuth:(Java 系統屬性:zookeeper.ssl.clientAuth 和 zookeeper.ssl.quorum.clientAuth) 在 3.5.5 中新增,但在 3.5.7 之前損壞:指定從用戶端驗證 ssl 連線的選項。有效值為
- "none": 伺服器不會要求用戶端驗證
- "want": 伺服器將「要求」用戶端驗證
- "need": 伺服器將「需要」用戶端驗證
預設值:"need"
-
ssl.handshakeDetectionTimeoutMillis 和 ssl.quorum.handshakeDetectionTimeoutMillis :(Java 系統屬性:zookeeper.ssl.handshakeDetectionTimeoutMillis 和 zookeeper.ssl.quorum.handshakeDetectionTimeoutMillis)3.5.5 中的新增功能:待定
-
ssl.sslProvider :(Java 系統屬性:zookeeper.ssl.sslProvider)3.9.0 中的新增功能:允許在啟用 TLS 時在客戶端-伺服器通訊中選擇 SSL 提供者。Netty-tcnative 原生程式庫已在 ZooKeeper 3.9.0 版本中新增,允許我們在支援的平台上使用原生 SSL 程式庫,例如 OpenSSL。請參閱 Netty-tcnative 文件中的可用選項。預設值為「JDK」。
-
sslQuorumReloadCertFiles :(無 Java 系統屬性)3.5.5、3.6.0 中的新增功能:允許在檔案系統上的憑證變更時重新載入 Quorum SSL keyStore 和 trustStore,而無需重新啟動 ZK 程序。預設值:false
-
client.certReload :(Java 系統屬性:zookeeper.client.certReload)3.7.2、3.8.1、3.9.0 中的新增功能:允許在檔案系統上的憑證變更時重新載入客戶端 SSL keyStore 和 trustStore,而無需重新啟動 ZK 程序。預設值:false
-
client.portUnification: (Java 系統屬性:zookeeper.client.portUnification)指定客戶端埠應接受 SSL 連線(使用與安全客戶端埠相同的組態)。預設值:false
-
authProvider: (Java 系統屬性:zookeeper.authProvider)您可以為 ZooKeeper 指定多個驗證提供者類別。通常您使用這個參數來指定 SASL 驗證提供者,例如:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
-
kerberos.removeHostFromPrincipal (Java 系統屬性:zookeeper.kerberos.removeHostFromPrincipal)您可以在驗證期間指示 ZooKeeper 從客戶端主體名稱中移除主機。(例如,zk/myhost@EXAMPLE.COM 客戶端主體將在 ZooKeeper 中驗證為 zk@EXAMPLE.COM)預設值:false
-
kerberos.removeRealmFromPrincipal (Java 系統屬性:zookeeper.kerberos.removeRealmFromPrincipal)您可以在驗證期間指示 ZooKeeper 從客戶端主體名稱中移除領域。(例如,zk/myhost@EXAMPLE.COM 客戶端主體將在 ZooKeeper 中驗證為 zk/myhost)預設值:false
-
kerberos.canonicalizeHostNames (Java 系統屬性:zookeeper.kerberos.canonicalizeHostNames)3.7.0 中的新增功能:指示 ZooKeeper 將從 server.x 行中提取的伺服器主機名稱正規化。這允許使用例如
CNAME
記錄來參考組態檔案中的伺服器,同時仍能啟用 Quorum 成員之間的 SASL Kerberos 驗證。這基本上是客戶端的 zookeeper.sasl.client.canonicalize.hostname 屬性的 Quorum 等效項。為了向後相容,預設值為 false。 -
multiAddress.enabled :(Java 系統屬性:zookeeper.multiAddress.enabled)3.6.0 中的新增功能:從 ZooKeeper 3.6.0 開始,您也可以為每個 ZooKeeper 伺服器執行個體指定多個位址(當叢集中可以平行使用多個實體網路介面時,這可以提高可用性)。將此參數設定為 true 將會啟用此功能。請注意,如果舊 ZooKeeper 叢集的版本早於 3.6.0,則您無法在滾動升級期間啟用此功能。預設值為 false。
-
multiAddress.reachabilityCheckTimeoutMs:(Java 系統屬性:zookeeper.multiAddress.reachabilityCheckTimeoutMs) 3.6.0 中的新增功能:自 ZooKeeper 3.6.0 起,您也可以為每個 ZooKeeper 伺服器執行個體指定多個位址(當叢集中可以並行使用多個實體網路介面時,這可以提高可用性)。ZooKeeper 會對目標主機的 7 號埠(Echo)執行 ICMP ECHO 要求或嘗試建立 TCP 連線,以找出可存取的位址。只有當您在組態中提供多個位址時,才會發生這種情況。在此屬性中,您可以設定可存取性檢查的逾時時間(以毫秒為單位)。檢查會針對不同的位址並行執行,因此您在此設定的逾時時間是檢查所有位址的可存取性時所需的最大時間。預設值為1000。
除非您透過設定 multiAddress.enabled=true 來啟用多位址功能,否則此參數不會產生任何作用。
-
fips-mode:(Java 系統屬性:zookeeper.fips-mode) 3.8.2 中的新增功能:在 ZooKeeper 中啟用 FIPS 相容性模式。如果已啟用,則會停用用於主機名稱驗證的客製化信任管理員 (
ZKTrustManager
),以符合 FIPS 需求。因此,叢集通訊協定中不提供主機名稱驗證,但仍可以在用戶端伺服器通訊中設定。預設值:true (3.9.0 以上),false (3.8.x)
實驗選項/功能
目前被視為實驗性質的新功能。
-
唯讀模式伺服器:(Java 系統屬性:readonlymode.enabled) 3.4.0 中的新增功能:將此值設定為 true 會啟用唯讀模式伺服器支援(預設為停用)。唯讀模式允許要求唯讀模式支援的用戶端會話連線到伺服器,即使伺服器可能與叢集隔離。在此模式中,唯讀模式用戶端仍可以從 ZK 服務讀取值,但無法寫入值和查看其他用戶端的變更。有關詳細資訊,請參閱 ZOOKEEPER-784。
-
zookeeper.follower.skipLearnerRequestToNextProcessor:(Java 系統屬性:zookeeper.follower.skipLearnerRequestToNextProcessor) 當我們的叢集具有與 ObserverMaster 連線的觀察者時,開啟此標記可能有助於您降低 Observer Master 上的一些記憶體壓力。如果您的叢集沒有任何觀察者,或者他們沒有與 ObserverMaster 連線,或者您的觀察者沒有進行大量寫入,那麼使用此標記對您沒有幫助。目前,此處的變更受到標記保護,以幫助我們對記憶體獲益獲得更多信心。從長遠來看,我們可能希望移除此標記,並將其行為設定為預設程式碼路徑。
不安全的選項
下列選項可能很有用,但請在使用時小心。每個選項的風險會連同變數功能的說明一起說明。
-
forceSync:(Java 系統屬性:zookeeper.forceSync) 要求在完成更新處理之前,將更新同步到交易記錄的媒體。如果此選項設定為否,ZooKeeper 就不會要求將更新同步到媒體。
-
jute.maxbuffer:(Java 系統屬性:jute.maxbuffer)。
- 此選項只能設為 Java 系統屬性。其上沒有 zookeeper 前綴。它指定可儲存在 znode 中的資料最大大小。單位:位元組。預設值為 0xfffff(1048575) 位元組,或略小於 1M。
- 如果變更此選項,則必須在所有伺服器和用戶端上設定系統屬性,否則會產生問題。
- 當用戶端中的 jute.maxbuffer 大於伺服器端中的 jute.maxbuffer 時,用戶端想要寫入的資料超過伺服器端中的 jute.maxbuffer,伺服器端會收到 java.io.IOException: Len error
- 當用戶端中的 jute.maxbuffer 小於伺服器端中的 jute.maxbuffer 時,用戶端想要讀取的資料超過用戶端中的 jute.maxbuffer,用戶端會收到 java.io.IOException: Unreasonable length 或 Packet len is out of range!
- 這真的是一個健全性檢查。ZooKeeper 設計用於儲存千位元組大小的資料。在生產環境中,不建議將此屬性增加到超過預設值,原因如下
- 大型 znode 會造成不合理的延遲尖峰,惡化處理量
- 大型 znode 會讓 leader 和 follower 之間的同步時間無法預測且不收斂(有時會逾時),造成法定人數不穩定
-
jute.maxbuffer.extrasize:(Java 系統屬性:zookeeper.jute.maxbuffer.extrasize) 3.5.7 中的新增功能:處理用戶端要求時,ZooKeeper 伺服器會在將要求儲存為交易之前,將一些其他資訊新增到要求中。先前,此其他資訊大小固定為 1024 位元組。對於許多情況,特別是 jute.maxbuffer 值大於 1 MB 且要求類型為多重的情況,此固定大小不足夠。為了處理所有情況,其他資訊大小已從 1024 位元組增加到與 jute.maxbuffer 大小相同,且也可透過 jute.maxbuffer.extrasize 進行設定。通常不需要設定此屬性,因為預設值是最佳值。
-
skipACL:(Java 系統屬性:zookeeper.skipACL)略過 ACL 檢查。這會提升吞吐量,但會讓所有人完全存取資料樹。
-
quorumListenOnAllIPs:設為 true 時,ZooKeeper 伺服器會在所有可用的 IP 位址上聆聽同儕連線,而不會只聆聽組態檔伺服器清單中組態的位址。這會影響處理 ZAB 通訊協定和快速領導人選舉通訊協定的連線。預設值為 false。
-
multiAddress.reachabilityCheckEnabled:(Java 系統屬性:zookeeper.multiAddress.reachabilityCheckEnabled) 3.6.0 新增:自 ZooKeeper 3.6.0 起,您也可以為每個 ZooKeeper 伺服器執行個體指定多個位址(當叢集中可並行使用多個實體網路介面時,這可以提高可用性)。ZooKeeper 會執行 ICMP ECHO 要求,或嘗試在目標主機的 7 號埠(Echo)上建立 TCP 連線,以找出可存取的位址。這只會在您在組態中提供多個位址時發生。如果您在嘗試在單一機器上啟動大型(例如 11 個以上的)成員叢集進行測試時,遇到一些 ICMP 速率限制(例如在 macOS 上),可存取性檢查可能會失敗。
預設值為 true。將此參數設為「false」可以停用可存取性檢查。請注意,停用可存取性檢查會導致叢集在網路問題期間無法正確重新組態,因此建議只在測試期間停用。
除非您透過設定 multiAddress.enabled=true 來啟用多位址功能,否則此參數不會產生任何作用。
停用資料目錄自動建立
3.5 新增:ZooKeeper 伺服器的預設行為是在啟動時自動建立資料目錄(在組態檔中指定),如果該目錄尚未存在。在某些情況下,這可能會造成不便,甚至危險。假設對正在執行的伺服器進行組態變更,其中 dataDir 參數意外變更。當 ZooKeeper 伺服器重新啟動時,它會建立這個不存在的目錄並開始提供服務,但 znode 命名空間是空的。這個情況可能會導致實際的「腦裂」情況(亦即資料同時存在於新的無效目錄和原始有效的資料儲存區中)。因此,最好有一個選項可以關閉這個自動建立行為。一般來說,對於生產環境應該這麼做,但遺憾的是,預設的舊有行為目前無法變更,因此必須視情況而定。這留給使用者和 ZooKeeper 發行版的包裝人員處理。
執行 zkServer.sh 時,可透過將環境變數 ZOO_DATADIR_AUTOCREATE_DISABLE 設為 1 來停用自動建立。若要直接從類別檔案執行 ZooKeeper 伺服器,可在 java 命令列上設定 zookeeper.datadir.autocreate=false,例如 -Dzookeeper.datadir.autocreate=false
停用此功能後,如果 ZooKeeper 伺服器判斷所需的目錄不存在,它會產生錯誤訊息並拒絕啟動。
提供新的腳本 zkServer-initialize.sh 來支援此新功能。如果停用自動建立,使用者必須先安裝 ZooKeeper,然後建立資料目錄(以及可能的 txnlog 目錄),再啟動伺服器。否則,如前一段所述,伺服器將無法啟動。執行 zkServer-initialize.sh 會建立所需的目錄,並可選擇設定 myid 檔案(選擇性命令列參數)。即使未啟用自動建立功能,仍可使用此腳本,而且對使用者來說可能很有用,因為這(設定,包括建立 myid 檔案)在過去對使用者來說一直是個問題。請注意,此腳本僅確保資料目錄存在,它不會建立設定檔,而是需要設定檔才能執行。
啟用資料庫存在驗證
ZooKeeper 3.6.0 新增功能:啟動時找不到資料樹時,ZooKeeper 伺服器的預設行為是將 zxid 設為零,並以投票成員的身分加入法定人數。如果某些事件(例如惡意「rm -rf」)在伺服器停機時移除資料目錄,這可能會很危險,因為此伺服器可能會協助選出遺失交易記錄的領導者。啟用資料庫存在驗證會變更啟動時找不到資料樹的行為:伺服器會以非投票參與者的身分加入整體,直到它能夠與領導者同步並取得整體資料的最新版本。若要指出預期資料樹為空(建立整體),使用者應將檔案「initialize」置於與「myid」相同的目錄中。伺服器會在啟動時偵測並刪除此檔案。
在 java 命令列上設定 zookeeper.db.autocreate=false,例如 -Dzookeeper.db.autocreate=false,即可在直接從類別檔案執行 ZooKeeper 伺服器時啟用初始化驗證。執行 zkServer-initialize.sh 會建立所需的初始化檔案。
效能調整選項
3.5.0 新功能:已重新設計多個子系統以提升讀取吞吐量。這包括 NIO 通訊子系統和要求處理管線 (提交處理器) 的多執行緒。NIO 是預設的用戶端/伺服器通訊子系統。其執行緒模型包含 1 個接收器執行緒、1-N 個選擇器執行緒和 0-M 個 socket I/O 工作執行緒。在要求處理管線中,系統可設定為一次處理多個讀取要求,同時維持相同的相容性保證 (相同階段的寫入後讀取)。提交處理器執行緒模型包含 1 個主執行緒和 0-N 個工作執行緒。
預設值旨在最大化專用 ZooKeeper 電腦上的讀取吞吐量。兩個子系統都需要有足夠的執行緒才能達到最高讀取吞吐量。
-
zookeeper.nio.numSelectorThreads:(僅限 Java 系統屬性:zookeeper.nio.numSelectorThreads) 3.5.0 新功能:NIO 選擇器執行緒數量。至少需要 1 個選擇器執行緒。建議在大量用戶端連線時使用多個選擇器。預設值為 sqrt(cpu 核心數量 / 2)。
-
zookeeper.nio.numWorkerThreads:(僅限 Java 系統屬性:zookeeper.nio.numWorkerThreads) 3.5.0 新功能:NIO 工作執行緒數量。如果設定為 0 個工作執行緒,選擇器執行緒會直接執行 socket I/O。預設值為 cpu 核心數量乘以 2。
-
zookeeper.commitProcessor.numWorkerThreads:(僅限 Java 系統屬性:zookeeper.commitProcessor.numWorkerThreads) 3.5.0 新功能:提交處理器工作執行緒數量。如果設定為 0 個工作執行緒,主執行緒會直接處理要求。預設值為 cpu 核心數量。
-
zookeeper.commitProcessor.maxReadBatchSize:(僅限 Java 系統屬性:zookeeper.commitProcessor.maxReadBatchSize) 在切換至處理提交之前,從 queuedRequests 處理的讀取最大數量。如果值 < 0 (預設值),我們會在有本機寫入和待處理提交時切換。較高的讀取批次大小會延遲提交處理,導致提供過時資料。如果已知讀取會以固定大小的批次抵達,則將該批次大小與此屬性的值相符可以改善佇列效能。由於讀取會並行處理,因此建議將此屬性設定為與 zookeeper.commitProcessor.numWorkerThread 相符 (預設值為 cpu 核心數量) 或更低。
-
zookeeper.commitProcessor.maxCommitBatchSize:(僅限 Java 系統屬性:zookeeper.commitProcessor.maxCommitBatchSize) 在處理讀取之前要處理的提交最大數量。我們會嘗試處理儘可能多的遠端/本機提交,直到達到此數量。提交批次大小較大會在處理更多提交時延遲讀取。提交批次大小較小會優先讀取。建議僅在整體環境提供提交率很高的工作負載時才設定此屬性。如果已知寫入會以一定數量的批次抵達,則將該批次大小與此屬性的值相匹配可以改善佇列效能。一般方法是將此值設定為等於整體環境大小,如此一來,在處理每個批次時,目前伺服器可能會處理與其直接客戶端之一相關的寫入。預設為「1」。不支援負值和零值。
-
znode.container.checkIntervalMs:(僅限 Java 系統屬性) 3.6.0 中的新增功能:候選容器和 ttl 節點的每次檢查時間間隔(以毫秒為單位)。預設為「60000」。
-
znode.container.maxPerMinute:(僅限 Java 系統屬性) 3.6.0 中的新增功能:每分鐘可刪除的容器和 ttl 節點的最大數量。這可防止在刪除容器期間發生群聚。預設為「10000」。
-
znode.container.maxNeverUsedIntervalMs:(僅限 Java 系統屬性) 3.6.0 中的新增功能:從未有過任何子節點的容器保留的最大時間間隔(以毫秒為單位)。應足夠讓您的客戶端建立容器、執行任何必要的作業,然後建立子節點。預設為「0」,用於表示從未有過任何子節點的容器永遠不會被刪除。
偵錯可觀察性設定
3.6.0 中的新增功能:引入了以下選項,以簡化 zookeeper 的偵錯。
-
zookeeper.messageTracker.BufferSize:(僅限 Java 系統屬性) 控制儲存在 MessageTracker 中的訊息最大數量。值應為正整數。預設值為 10。MessageTracker 在 3.6.0 中引入,用於在伺服器(追隨者或觀察者)與領導者斷線時記錄伺服器之間的最後一組訊息。然後,這組訊息會傾印到 zookeeper 的日誌檔,並有助於重建伺服器在斷線時的狀態,且有助於偵錯目的。
-
zookeeper.messageTracker.Enabled:(僅限 Java 系統屬性) 設定為「true」時,會啟用 MessageTracker 來追蹤和記錄訊息。預設值為「false」。
AdminServer 設定
3.9.0 中的新增功能:以下選項用於設定 AdminServer。
-
admin.rateLimiterIntervalInMS:(Java 系統屬性:zookeeper.admin.rateLimiterIntervalInMS) 管理命令的速率限制時間間隔,以保護伺服器。預設為 5 分鐘。
-
admin.snapshot.enabled : (Java 系統屬性:zookeeper.admin.snapshot.enabled) 啟用 snapshot 指令的旗標。預設為 true。
-
admin.restore.enabled : (Java 系統屬性:zookeeper.admin.restore.enabled) 啟用 restore 指令的旗標。預設為 true。
-
admin.needClientAuth : (Java 系統屬性:zookeeper.admin.needClientAuth) 控制是否需要用戶端驗證的旗標。使用 x509 驗證需要設為 true。預設為 false。
3.7.1 新增:下列選項用於設定 AdminServer。
- admin.forceHttps : (Java 系統屬性:zookeeper.admin.forceHttps) 強制 AdminServer 使用 SSL,因此只允許 HTTPS 流量。預設為停用。會覆寫 admin.portUnification 設定。
3.6.0 新增:下列選項用於設定 AdminServer。
- admin.portUnification : (Java 系統屬性:zookeeper.admin.portUnification) 啟用管理埠同時接受 HTTP 和 HTTPS 流量。預設為停用。
3.5.0 新增:下列選項用於設定 AdminServer。
-
admin.enableServer : (Java 系統屬性:zookeeper.admin.enableServer) 設為「false」以停用 AdminServer。預設啟用 AdminServer。
-
admin.serverAddress : (Java 系統屬性:zookeeper.admin.serverAddress) 內嵌 Jetty 伺服器監聽的位址。預設為 0.0.0.0。
-
admin.serverPort : (Java 系統屬性:zookeeper.admin.serverPort) 內嵌 Jetty 伺服器監聽的埠號。預設為 8080。
-
admin.idleTimeout : (Java 系統屬性:zookeeper.admin.idleTimeout) 設定連線在傳送或接收資料前可以等待的最大閒置時間(毫秒)。預設為 30000 毫秒。
-
admin.commandURL : (Java 系統屬性:zookeeper.admin.commandURL) 相對於根 URL 的指令清單和發布 URL。預設為「/commands」。
指標提供者
3.6.0 新增:下列選項用於設定指標。
預設情況下,ZooKeeper 伺服器會使用 AdminServer 和 Four Letter Words 介面公開有用的指標。
從 3.6.0 開始,您可以設定不同的指標提供者,將指標匯出到您偏好的系統。
從 3.6.0 開始,ZooKeeper 二進位套件會與 Prometheus.io 整合。
-
metricsProvider.className : 設為「org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider」以啟用 Prometheus.io 匯出器。
-
metricsProvider.httpHost : 3.8.0 新增:Prometheus.io 匯出器將啟動 Jetty 伺服器並監聽此位址,預設為「0.0.0.0」
-
metricsProvider.httpPort : Prometheus.io 匯出器將啟動 Jetty 伺服器並繫結到此埠號,預設為 7000。Prometheus 端點將會是 http://hostname:httPort/metrics。
-
metricsProvider.exportJvmInfo : 如果此屬性設為 true,Prometheus.io 將會匯出關於 JVM 的有用指標。預設為 true。
-
metricsProvider.numWorkerThreads : 3.7.1 新增:回報 Prometheus 摘要指標的執行緒數。預設值為 1。如果數值小於 1,將會使用主執行緒。
-
metricsProvider.maxQueueSize : 3.7.1 新增:Prometheus 摘要指標報告任務的最大佇列大小。預設值為 1000000。
-
metricsProvider.workerShutdownTimeoutMs : 3.7.1 新增:Prometheus 工作執行緒關閉的逾時時間(毫秒)。預設值為 1000 毫秒。
使用 Netty 架構進行通訊
Netty 是一個基於 NIO 的客戶端/伺服器通訊架構,它簡化了許多 Java 應用程式在網路層級通訊中直接使用 NIO 的複雜性。此外,Netty 架構內建支援加密 (SSL) 和驗證 (憑證)。這些是選用功能,可以個別開啟或關閉。
在 3.5 以上的版本中,ZooKeeper 伺服器可以透過將環境變數 zookeeper.serverCnxnFactory 設定為 org.apache.zookeeper.server.NettyServerCnxnFactory 來使用 Netty 取代 NIO(預設選項);對於客戶端,將 zookeeper.clientCnxnSocket 設定為 org.apache.zookeeper.ClientCnxnSocketNetty。
法定人數 TLS
3.5.5 新增
基於 Netty 架構,ZooKeeper 叢集可以在其通訊頻道中設定使用 TLS 加密。本節說明如何在法定人數通訊中設定加密。
請注意,法定人數 TLS 封裝了保護領導者選舉和法定人數通訊協定的安全性。
- 建立 SSL 金鑰庫 JKS 來儲存本機憑證
應為每個 ZK 執行個體建立一個金鑰庫。
在此範例中,我們產生一個自簽憑證,並將其與私密金鑰一起儲存在 keystore.jks
中。這適用於測試目的,但您可能需要官方憑證來在生產環境中簽署您的金鑰。
請注意,別名 (-alias
) 和識別名稱 (-dname
) 必須與其關聯的機器主機名稱相符,否則主機名稱驗證將無法運作。
keytool -genkeypair -alias $(hostname -f) -keyalg RSA -keysize 2048 -dname "cn=$(hostname -f)" -keypass password -keystore keystore.jks -storepass password
- 從金鑰庫中擷取簽署的公開金鑰 (憑證)
此步驟可能僅適用於自簽憑證。
keytool -exportcert -alias $(hostname -f) -keystore keystore.jks -file $(hostname -f).cer -rfc
- 建立包含所有 ZooKeeper 執行個體憑證的 SSL 信任儲存庫 JKS
相同的信任儲存庫(儲存所有已接受的憑證)應由叢集參與者共用。您需要使用不同的別名來在同一個信任儲存庫中儲存多個憑證。別名的名稱並不重要。
keytool -importcert -alias [host1..3] -file [host1..3].cer -keystore truststore.jks -storepass password
- 您需要使用
NettyServerCnxnFactory
作為 serverCnxnFactory,因為 NIO 不支援 SSL。將下列組態設定新增至您的zoo.cfg
組態檔案
sslQuorum=true
serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
ssl.quorum.keyStore.location=/path/to/keystore.jks
ssl.quorum.keyStore.password=password
ssl.quorum.trustStore.location=/path/to/truststore.jks
ssl.quorum.trustStore.password=password
- 在記錄檔中驗證您的叢集在 TLS 上執行
INFO [main:QuorumPeer@1789] - Using TLS encrypted quorum communication
INFO [main:QuorumPeer@1797] - Port unification disabled
...
INFO [QuorumPeerListener:QuorumCnxManager$Listener@877] - Creating TLS-only quorum server socket
升級現有的非 TLS 叢集,且不中斷服務
3.5.5 新增
以下是透過利用埠統一功能,在不中斷服務的情況下將已執行的 ZooKeeper 叢集升級到 TLS 所需的步驟。
-
如前一節所述,為所有 ZK 參與者建立必要的金鑰庫和信任儲存庫
-
新增下列組態設定並重新啟動第一個節點
sslQuorum=false
portUnification=true
serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
ssl.quorum.keyStore.location=/path/to/keystore.jks
ssl.quorum.keyStore.password=password
ssl.quorum.trustStore.location=/path/to/truststore.jks
ssl.quorum.trustStore.password=password
請注意,TLS 尚未啟用,但我們開啟了埠統一。
- 在其他節點上重複步驟 #2。驗證您在記錄中看到下列項目
INFO [main:QuorumPeer@1791] - Using insecure (non-TLS) quorum communication
INFO [main:QuorumPeer@1797] - Port unification enabled
...
INFO [QuorumPeerListener:QuorumCnxManager$Listener@874] - Creating TLS-enabled quorum server socket
您還應該在每個節點重新啟動後仔細檢查,確認法定人數是否再次變為正常。
- 在每個節點上啟用法定人數 TLS 並執行滾動重新啟動
sslQuorum=true
portUnification=true
- 在您驗證整個組合在 TLS 上執行後,您可以停用埠統一並執行另一項滾動重新啟動
sslQuorum=true
portUnification=false
ZooKeeper 指令
四個字母的單字
ZooKeeper 回應一組簡短的指令。每個指令由四個字母組成。您透過 telnet 或 nc 在用戶端埠向 ZooKeeper 發出指令。
三個較有趣的指令:「stat」提供一些關於伺服器和已連線用戶端的資訊,而「srvr」和「cons」分別提供伺服器和連線的詳細資料。
3.5.3 新增:四個字母的字詞在使用前需要明確列入白名單。請參閱 叢集組態區段 中所述的 4lw.commands.whitelist 以取得詳細資料。未來,四個字母的字詞將會被棄用,請改用 AdminServer。
-
conf : 3.3.0 新增:列印關於服務組態的詳細資料。
-
cons : 3.3.0 新增:列出連線到此伺服器的所有用戶端的完整連線/工作階段詳細資料。包括收發封包數量、工作階段 ID、作業延遲、最後執行的作業等資訊...
-
crst : 3.3.0 新增:重設所有連線的連線/工作階段統計資料。
-
dump : 列出未完成的工作階段和暫時節點。
-
envi : 列印關於服務環境的詳細資料
-
ruok : 測試伺服器是否在非錯誤狀態下執行。當白名單啟用 ruok 時,如果伺服器正在執行,伺服器將回應
imok
,否則將完全不回應。當 ruok 停用時,伺服器回應:「ruok 未執行,因為它不在白名單中。」「imok」的回應並不一定表示伺服器已加入法定人數,僅表示伺服器處理程序處於活動狀態並與指定的用戶端埠連結。請使用「stat」取得關於法定人數和用戶端連線資訊的詳細資料。 -
srst : 重設伺服器統計資料。
-
srvr : 3.3.0 新增:列出伺服器的完整詳細資料。
-
stat : 列出伺服器和已連線用戶端的簡要詳細資料。
-
wchs : 3.3.0 新功能:列出伺服器手錶的簡要資訊。
-
wchc : 3.3.0 新功能:列出伺服器手錶的詳細資訊,依據階段。這會輸出一個階段(連線)清單,並附上相關手錶(路徑)。請注意,依據手錶數量,此操作可能會很耗資源(例如影響伺服器效能),請小心使用。
-
dirs : 3.5.1 新功能:顯示快照和日誌檔案的總大小(以位元組為單位)
-
wchp : 3.3.0 新功能:列出伺服器手錶的詳細資訊,依據路徑。這會輸出一個路徑(znode)清單,並附上相關階段。請注意,依據手錶數量,此操作可能會很耗資源(例如影響伺服器效能),請小心使用。
-
mntr : 3.4.0 新功能:輸出一個變數清單,可用於監控叢集的健康狀態。
$ echo mntr | nc localhost 2185 zk_version 3.4.0 zk_avg_latency 0.7561 - 保留四位小數 zk_max_latency 0 zk_min_latency 0 zk_packets_received 70 zk_packets_sent 69 zk_outstanding_requests 0 zk_server_state leader zk_znode_count 4 zk_watch_count 0 zk_ephemerals_count 0 zk_approximate_data_size 27 zk_followers 4 - 僅由 Leader 顯示 zk_synced_followers 4 - 僅由 Leader 顯示 zk_pending_syncs 0 - 僅由 Leader 顯示 zk_open_file_descriptor_count 23 - 僅在 Unix 平臺上可用 zk_max_file_descriptor_count 1024 - 僅在 Unix 平臺上可用
輸出與 java 屬性格式相容,且內容可能會隨著時間而變更(新增新金鑰)。您的腳本應預期會有變更。注意:有些金鑰是特定於平臺的,而有些金鑰僅由 Leader 匯出。輸出包含多行,格式如下
key \t value
-
isro : 3.4.0 新功能:測試伺服器是否以唯讀模式執行。如果處於唯讀模式,伺服器會回應「ro」;如果未處於唯讀模式,伺服器會回應「rw」。
-
hash : 3.6.0 新功能:傳回與 zxid 相關聯的樹狀摘要的最新記錄。
-
gtmk : 以十進位格式取得目前的追蹤遮罩,為 64 位元有號長整數值。請參閱
stmk
以了解可能的數值說明。 -
stmk : 設定目前的追蹤遮罩。追蹤遮罩為 64 位元,其中每個位元會啟用或停用伺服器上特定類別的追蹤記錄。必須先將 Logback 設定為啟用
TRACE
層級,才能看到追蹤記錄訊息。追蹤遮罩的位元對應於下列追蹤記錄類別。追蹤遮罩位元值 0b0000000000 未用,保留供未來使用。 0b0000000010 記錄用戶端要求,不包含 ping 要求。 0b0000000100 未用,保留供未來使用。 0b0000001000 記錄用戶端 ping 要求。 0b0000010000 記錄從目前為領導者的法定人數對等方收到的封包,不包含 ping 要求。 0b0000100000 記錄用戶端工作階段的加入、移除和驗證。 0b0001000000 記錄傳遞監控事件至用戶端工作階段。 0b0010000000 記錄從目前為領導者的法定人數對等方收到的 ping 封包。 0b0100000000 未用,保留供未來使用。 0b1000000000 未用,保留供未來使用。 64 位元值中的所有剩餘位元都未用,並保留供未來使用。透過計算記錄值的按位元 OR 來指定多個追蹤記錄類別。預設追蹤遮罩為 0b0100110010。因此,預設追蹤記錄包含用戶端要求、從領導者收到的封包和工作階段。若要設定不同的追蹤遮罩,請傳送包含
stmk
四個字母字詞的請求,後接表示為 64 位元有號長整數的追蹤遮罩。此範例使用 Perlpack
函數來建構追蹤遮罩,以啟用上述所有描述的追蹤記錄類別,並將其轉換為具有大端序位元組順序的 64 位元有號長整數。結果會附加至stmk
,並使用 netcat 傳送至伺服器。伺服器會以十進位格式回應新的追蹤遮罩。$ perl -e "print 'stmk', pack('q>', 0b0011111010)" | nc localhost 2181 250
以下是 ruok 指令的範例
$ echo ruok | nc 127.0.0.1 5111
imok
AdminServer
3.5.0 新增: AdminServer 是嵌入式 Jetty 伺服器,提供 HTTP 介面至四個字母字詞指令。預設情況下,伺服器會在埠 8080 上啟動,並透過前往 URL "/commands/[command name]",例如 https://127.0.0.1:8080/commands/stat 來發出指令。指令回應會以 JSON 回傳。與原始協定不同,指令不限於四個字母名稱,且指令可以有多個名稱;例如,「stmk」也可以稱為「set_trace_mask」。若要檢視所有可用指令的清單,請將瀏覽器指向 URL /commands(例如 https://127.0.0.1:8080/commands)。請參閱 AdminServer 組態選項,了解如何變更埠和 URL。
預設情況下會啟用 AdminServer,但可以透過下列方式停用
- 將 zookeeper.admin.enableServer 系統屬性設定為 false。
- 從類別路徑中移除 Jetty。(如果您想要覆寫 ZooKeeper 的 jetty 相依性,此選項很有用。)
請注意,如果 AdminServer 已停用,則 TCP 四個字母字詞介面仍可用。
為 AdminServer 組態 SSL/TLS
- 產生 keystore.jks 和 truststore.jks,可以在 法定人數 TLS 中找到。
- 將下列組態設定新增至
zoo.cfg
組態檔案
admin.portUnification=true
ssl.quorum.keyStore.location=/path/to/keystore.jks
ssl.quorum.keyStore.password=password
ssl.quorum.trustStore.location=/path/to/truststore.jks
ssl.quorum.trustStore.password=password
- 驗證記錄中可以看見下列項目
2019-08-03 15:44:55,213 [myid:] - INFO [main:JettyAdminServer@123] - Successfully loaded private key from /data/software/cert/keystore.jks
2019-08-03 15:44:55,213 [myid:] - INFO [main:JettyAdminServer@124] - Successfully loaded certificate authority from /data/software/cert/truststore.jks
2019-08-03 15:44:55,403 [myid:] - INFO [main:JettyAdminServer@170] - Started AdminServer on address 0.0.0.0, port 8080 and command URL /commands
可用指令包括
-
connection_stat_reset/crst:重設所有用戶端連線統計資料。沒有傳回新的欄位。
-
configuration/conf/config:列印提供設定的基本詳細資料,例如用戶端埠、資料目錄的絕對路徑。
-
connections/cons:有關用戶端連線到伺服器的資訊。請注意,根據用戶端連線的數量,這個操作可能會很耗資源(例如影響伺服器效能)。傳回「connections」,一個連線資訊物件的清單。
-
hash:歷史摘要清單中的交易摘要。每 128 個交易會記錄一個。傳回「digests」,一個交易摘要物件的清單。
-
dirs:關於日誌檔目錄和快照目錄大小(以位元組為單位)的資訊。傳回「datadir_size」和「logdir_size」。
-
dump:有關階段到期和暫存資料的資訊。請注意,根據全域階段和暫存資料的數量,這個操作可能會很耗資源(例如影響伺服器效能)。傳回「expiry_time_to_session_ids」和「session_id_to_ephemeral_paths」作為對應。
-
environment/env/envi:所有已定義的環境變數。傳回每個變數作為自己的欄位。
-
get_trace_mask/gtmk:目前的追蹤遮罩。set_trace_mask 的唯讀版本。請參閱四個字母指令 stmk 的說明以取得更多詳細資料。傳回「tracemask」。
-
initial_configuration/icfg:列印用於啟動對等節點的組態檔文字。傳回「initial_configuration」。
-
is_read_only/isro:如果這個伺服器處於唯讀模式,則為 true/false。傳回「read_only」。
-
last_snapshot/lsnp:zookeeper 伺服器已完成儲存到磁碟的最後一個快照的資訊。如果在伺服器啟動和伺服器完成儲存其第一個快照之間的初始時間期間呼叫,則指令會傳回啟動伺服器時讀取的快照資訊。傳回「zxid」和「timestamp」,後者使用秒為時間單位。
-
leader/lead:如果集合組態為法定人數模式,則會發出對等節點目前的領導者狀態和目前的領導者位置。傳回「is_leader」、「leader_id」和「leader_ip」。
-
monitor/mntr:發出各種有用的資訊以進行監控。包括效能統計資料、有關內部佇列的資訊和資料樹的摘要(以及其他資訊)。傳回每個資訊作為自己的欄位。
-
observer_connection_stat_reset/orst:重設所有觀察者連線統計資料。observers 的伴隨指令。沒有傳回新的欄位。
-
restore/rest:從目前伺服器上的快照輸入串流復原資料庫。在回應有效負載中傳回下列資料:「last_zxid」:字串。注意:這個 API 有速率限制(預設每 5 分鐘一次),以保護伺服器免於過度載入。
-
ruok:無操作命令,檢查伺服器是否正在執行。回應不一定表示伺服器已加入法定人數,僅表示管理伺服器已啟用並繫結至指定埠。無傳回新的欄位。
-
set_trace_mask/stmk:設定追蹤遮罩(因此,需要一個參數)。get_trace_mask 的寫入版本。請參閱四個字母命令 stmk 的說明,以取得更多詳細資料。傳回「tracemask」。
-
server_stats/srvr:伺服器資訊。傳回多個欄位,提供伺服器狀態的簡要概觀。
-
snapshot/snap:擷取 datadir 中目前伺服器的快照,並串流輸出資料。選用查詢參數:「streaming」:布林值(如果參數不存在,預設為 true)透過 Http 標頭傳回下列內容:「last_zxid」:字串「snapshot_size」:字串注意:此 API 有速率限制(預設為每 5 分鐘一次),以保護伺服器免於過載。
-
stats/stat:與 server_stats 相同,但也會傳回「connections」欄位(請參閱 connections 以取得詳細資料)。請注意,根據用戶端連線數,此操作可能會很耗費資源(例如影響伺服器效能)。
-
stat_reset/srst:重設伺服器統計資料。這是 server_stats 和 stats 傳回資訊的子集。無傳回新的欄位。
-
observers/obsr:伺服器觀察者連線資訊。始終在 Leader 上可用,如果 Follower 擔任學習主控,則在 Follower 上可用。傳回「synced_observers」(整數)和「observers」(每個觀察者屬性的清單)。
-
system_properties/sysp:所有已定義的系統屬性。傳回每個屬性作為自己的欄位。
-
voting_view:提供群集中的目前投票成員。傳回「current_config」作為一個映射。
-
watches/wchc:依據工作階段彙總的監控資訊。請注意,根據監控數,此操作可能會很耗費資源(例如影響伺服器效能)。傳回「session_id_to_watched_paths」作為一個映射。
-
watches_by_path/wchp:依據路徑彙總的監控資訊。請注意,根據監控數,此操作可能會很耗費資源(例如影響伺服器效能)。傳回「path_to_session_ids」作為一個映射。
-
watch_summary/wchs:已摘要的監控資訊。傳回「num_total_watches」、「num_paths」和「num_connections」。
-
zabstate:對等端正在執行的 Zab 協定的目前階段,以及它是否為投票成員。對等端可以處於下列階段之一:ELECTION(選舉)、DISCOVERY(發現)、SYNCHRONIZATION(同步化)、BROADCAST(廣播)。傳回欄位「voting」和「zabstate」。
資料檔案管理
ZooKeeper 將其資料儲存在資料目錄中,並將其交易記錄儲存在交易記錄目錄中。預設情況下,這兩個目錄是相同的。伺服器可以(而且應該)設定為將交易記錄檔案儲存在與資料檔案不同的目錄中。當交易記錄存在於專用記錄裝置上時,會增加吞吐量並減少延遲。
資料目錄
此目錄中有兩個或三個檔案
- myid - 包含以人類可讀的 ASCII 文字表示伺服器 ID 的單一整數。
- initialize - 存在表示預期沒有資料樹。在建立資料樹後清除。
- snapshot.
- 保存資料樹的模糊快照。
每個 ZooKeeper 伺服器都有唯一的 ID。此 ID 用於兩個地方:myid 檔案和設定檔。myid 檔案識別對應於特定資料目錄的伺服器。設定檔會列出由其伺服器 ID 識別的每個伺服器的連絡資訊。當 ZooKeeper 伺服器執行個體啟動時,它會從 myid 檔案讀取其 ID,然後使用該 ID 從設定檔讀取,查詢它應該監聽的埠。
儲存在資料目錄中的 snapshot 檔案是模糊快照,這是因為在 ZooKeeper 伺服器擷取快照期間,資料樹會發生更新。snapshot 檔案名稱的字尾是快照開始時最後提交交易的 ZooKeeper 交易 ID zxid。因此,快照包含在快照進行過程中發生的資料樹更新子集。然後,快照可能與實際存在的任何資料樹不符,因此我們將其稱為模糊快照。儘管如此,ZooKeeper 仍可使用此快照復原,因為它利用了其更新的冪等性質。透過對模糊快照重播交易記錄,ZooKeeper 會取得記錄結尾的系統狀態。
記錄目錄
記錄目錄包含 ZooKeeper 交易記錄。在進行任何更新之前,ZooKeeper 會確保代表更新的交易寫入非揮發性儲存體。當寫入目前記錄檔的交易數量達到(變數)閾值時,會啟動新的記錄檔。閾值是使用影響快照頻率的相同參數計算的(請參閱上方的 snapCount 和 snapSizeLimitInKb)。記錄檔的字尾是寫入該記錄檔的第一個 zxid。
檔案管理
快照和記錄檔的格式不會在獨立的 ZooKeeper 伺服器和複製的 ZooKeeper 伺服器的不同組態之間變更。因此,您可以將這些檔案從正在執行的複製 ZooKeeper 伺服器拉到具有獨立 ZooKeeper 伺服器的開發機器,以進行疑難排解。
使用較舊的記錄檔和快照檔,您可以查看 ZooKeeper 伺服器的先前狀態,甚至還原該狀態。
ZooKeeper 伺服器會建立快照和記錄檔,但絕不會刪除它們。資料和記錄檔的保留政策是在 ZooKeeper 伺服器外部實作的。伺服器本身僅需要最新的完整模糊快照、其後的所有記錄檔,以及其前一個最後的記錄檔。後者的需求是為了包含在這個快照啟動後發生,但當時進入現有記錄檔的更新。這是可能的,因為快照和記錄檔的翻轉在 ZooKeeper 中是以某種獨立的方式進行的。有關設定保留政策和維護 ZooKeeper 儲存體的更多詳細資訊,請參閱本文中的維護區段。
注意
儲存在這些檔案中的資料未加密。在 ZooKeeper 中儲存敏感資料時,需要採取必要的措施來防止未經授權的存取。此類措施是 ZooKeeper 的外部措施(例如,控制對檔案的存取),並取決於其所部署的個別設定。
復原 - TxnLogToolkit
更多詳細資訊可以在這裡找到
需要避免的事項
以下是透過正確組態 ZooKeeper 可以避免的一些常見問題
-
不一致的伺服器清單:客戶端使用的 ZooKeeper 伺服器清單必須與每個 ZooKeeper 伺服器所擁有的 ZooKeeper 伺服器清單相符。如果客戶端清單是實際清單的子集,則一切運作正常,但如果客戶端擁有不同 ZooKeeper 群集中的 ZooKeeper 伺服器清單,則一切將會變得非常奇怪。此外,每個 Zookeeper 伺服器設定檔中的伺服器清單應彼此一致。
-
交易記錄放置不正確:ZooKeeper 中效能最關鍵的部分是交易記錄。ZooKeeper 會在傳回回應之前將交易同步至媒體。專用的交易記錄裝置是持續良好效能的關鍵。將記錄放在忙碌的裝置上會對效能產生負面影響。如果您只有一個儲存裝置,請增加 snapCount 以減少產生快照檔案的頻率;這並不能消除問題,但可以為交易記錄提供更多資源。
-
Java 堆積大小不正確:您應特別注意正確設定 Java 最大堆積大小。特別是,您不應建立 ZooKeeper 會換至磁碟的情況。磁碟會讓 ZooKeeper 毀於一旦。所有內容都是依序的,因此如果處理一個要求會換至磁碟,則所有其他排隊的要求可能會執行相同的動作。磁碟。不要換頁。在估計時要保守:如果您有 4G 的 RAM,請勿將 Java 最大堆積大小設定為 6G,甚至 4G。例如,您較有可能為 4G 的機器使用 3G 堆積,因為作業系統和快取也需要記憶體。估計系統所需堆積大小的最佳且唯一建議做法是執行負載測試,然後確保您遠低於會導致系統換頁的使用限制。
-
可公開存取的部署:ZooKeeper 叢集預期會在受信任的運算環境中運作。因此建議在防火牆後部署 ZooKeeper。
最佳實務
為了獲得最佳結果,請注意下列 Zookeeper 良好做法清單
對於多租戶安裝,請參閱說明 ZooKeeper「chroot」支援的 區段,這在部署許多與單一 ZooKeeper 群集介接的應用程式/服務時非常有用。