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 的檔案來將伺服器 ID 屬性給每台機器,每個伺服器一個,此檔案會駐留在該伺服器的資料目錄中,如設定檔參數 dataDir 所指定。
-
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) 個伺服器故障。如果具有 6 個伺服器的 ZooKeeper 叢集,則叢集也可以容忍最多 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 伺服器不會移除舊快照和記錄檔(請參閱下方的 autopurge),這是操作員的責任。每個服務環境都不同,因此管理這些檔案的要求可能會因安裝而異(例如備份)。
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 伺服器,可確保如果程序異常結束,它將自動重新啟動並快速重新加入叢集。
如果發生 OutOfMemoryError**,建議將 ZooKeeper 伺服器程序設定為終止並傾印其堆疊。這可透過在 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:單一 tick 的長度,這是 ZooKeeper 使用的基本時間單位,以毫秒為單位。用於調整心跳和逾時。例如,最短的會話逾時將為兩個 tick。
進階組態
此區段中的組態設定是選用的。你可以使用它們來進一步微調 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 更直接地控制。較大的 txn 記錄可能會在使用交易記錄進行同步時導致追隨者同步較慢。這是因為領導者必須掃描磁碟上的適當記錄檔,才能找到要開始同步的交易。此功能預設為關閉,而 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。注意:由於錯誤,伺服器 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) 領導人選舉中兩次連續通知檢查之間時間長度的下限。此間隔決定對等方等待檢查選舉票數集的時間,並影響選舉可以解決的速度。對於長時間選舉,此間隔會遵循從設定的最小值 (此值) 和設定的最大值 (fastleader.maxNotificationInterval) 進行遞減策略。
-
fastleader.maxNotificationInterval:(Java 系統屬性:zookeeper.fastleader.maxNotificationInterval) 領導人選舉中兩次連續通知檢查之間時間長度的上限。此間隔決定對等方等待檢查選舉票數集的時間,並影響選舉可以解決的速度。對於長時間選舉,此間隔會遵循從設定的最小值 (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 新增:啟用時,限制器會捨棄過期的要求,而不是將它們發佈到要求管線。過期的要求是由現在已關閉的連線所傳送的要求,和/或要求延遲時間高於 sessionTimeout 的要求。預設為 true。
-
requestStaleLatencyCheck : (Java 系統屬性:zookeeper.request_stale_latency_check) 3.6.0 新增:啟用時,如果要求延遲時間高於其關聯的 sessionTimeout,則會將要求視為過期。預設為停用。
-
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 的雜湊值會根據資料集的變更進行遞增更新。當負責人準備 txn 時,它會根據變更使用公式預先計算樹的雜湊
current_hash = current_hash + hash(new node data) - hash(old node data)
如果要建立新節點,hash(舊節點資料) 會是 0,如果要刪除節點,hash(新節點資料) 會是 0。
這個雜湊會與每個 txn 關聯,以表示將 txn 套用到資料樹後預期的雜湊值,它會與原始提案一起傳送給追隨者。學習者會在將 txn 套用到資料樹後,將實際雜湊值與 txn 中的雜湊值進行比較,如果不同,就會回報不符。
這些摘要值也會與每個 txn 和快照一起儲存在磁碟上,因此當伺服器重新啟動並從磁碟載入資料時,它會進行比較,查看是否有雜湊不符,這有助於偵測磁碟上的資料遺失問題。
對於實際雜湊函數,我們在內部使用 CRC,它不是無衝突雜湊函數,但與無衝突雜湊相比,它更有效率,而且衝突的可能性非常非常低,已經可以滿足我們的需求。
這個功能具有向後和向前相容性,因此可以安全地進行升級、降級、啟用和稍後停用,而不會有任何相容性問題。以下是有涵蓋和測試的場景
- 當負責人使用新程式碼執行,而追隨者使用舊程式碼執行時,摘要會附加到每個 txn 的結尾,追隨者只會讀取標頭和 txn 資料,txn 中的摘要值會被忽略。它不會影響追隨者讀取和處理下一個 txn。
- 當負責人使用舊程式碼執行,而追隨者使用新程式碼執行時,摘要不會與 txn 一起傳送,當追隨者嘗試讀取摘要時,它會擲出 EOF,而 EOF 會被捕捉並妥善處理,摘要值會設為 null。
- 載入舊快照時使用新程式碼,它會在嘗試讀取不存在的摘要值時拋出 IOException,並且會捕捉例外狀況,並將摘要設定為 null,這表示我們在載入此快照時不會比較摘要,這預計會在滾動升級期間發生
- 載入新快照時使用舊程式碼,它會在序列化資料樹後成功完成,快照檔案末端的摘要值將會被忽略
- 使用旗標變更進行滾動重新啟動的場景類似於上面討論的第一和第二個場景,如果啟用 leader 但未啟用 follower,摘要值將會被忽略,並且 follower 在執行期間不會比較摘要;如果停用 leader 但啟用 follower,follower 將會收到 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 新功能:學習器中封包的傳送和接收在臨界區中同步完成。不適時的網路問題可能會導致追隨者當機(請參閱 ZOOKEEPER-3575 和 ZOOKEEPER-4074)。新的設計將學習器中的封包傳送移到獨立執行緒,並非同步傳送封包。新的設計會透過此參數 (learner.asyncSending) 啟用。預設為 false。
-
forward_learner_requests_to_commit_processor_disabled(Java 系統屬性:zookeeper.forward_learner_requests_to_commit_processor_disabled)設定此屬性時,學習者的要求將不會排入 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 伺服器時,強烈建議開啟領導者選取。
- 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 系統屬性) 啟用階層式法定人數建構。「x」是群組識別碼,等號「=」後的數字對應伺服器識別碼。指定項目的左側是伺服器識別碼的冒號分隔清單。請注意,群組必須不相交,且所有群組的聯集必須是 ZooKeeper 叢集。您可以在 這裡 找到範例
-
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/
-
-
如何從一個 digest 演算法移轉到另一個演算法?
-
- 在移轉到新演算法時,重新產生
superDigest
。
- 在移轉到新演算法時,重新產生
-
- 為已具有舊演算法 digest 驗證的 znode
SetAcl
。
- 為已具有舊演算法 digest 驗證的 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 中的新增功能:指定一個 ensemble 的逗號分隔有效名稱/別名的清單。客戶端可以提供其打算連線的 ensemble 名稱作為架構「ensemble」的憑證。EnsembleAuthenticationProvider 將根據接收連線要求的 ensemble 名稱/別名清單檢查憑證。如果憑證不在清單中,連線要求將會被拒絕。這可以防止客戶端意外連線到錯誤的 ensemble。
-
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.2
-
ssl.enabledProtocols 和 ssl.quorum.enabledProtocols :(Java 系統屬性:zookeeper.ssl.enabledProtocols 和 zookeeper.ssl.quorum.enabledProtocols)3.5.5 中的新增功能:指定在用戶端和群集 TLS 協商中啟用的通訊協定。預設值:
protocol
屬性的值 -
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 新增:允許在檔案系統上的憑證變更時重新載入法定人數 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
記錄來參照組態檔中的伺服器,同時仍能啟用群集成員之間的 SASL Kerberos 驗證。它基本上是用戶端 zookeeper.sasl.client.canonicalize.hostname 屬性的群集等效項。預設值為 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 會執行 ICMP ECHO 要求或嘗試在目標主機的連接埠 7(Echo)上建立 TCP 連線,以找出可連線的位址。只有在您在組態中提供多個位址時,才會發生這種情況。在此屬性中,您可以設定可連線性檢查的逾時時間(毫秒)。檢查會並行針對不同的位址執行,因此您在此處設定的逾時時間是檢查所有位址的可連線性時所花的最大時間。預設值為 1000。
除非您透過設定 multiAddress.enabled=true 來啟用 MultiAddress 功能,否則此參數不會產生任何效果。
-
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,伺服器端將會收到 java.io.IOException: Len error
- 當用戶端中的 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) ZooKeeper 3.6.0 新功能:自 ZooKeeper 3.6.0 起,您也可以為每個 ZooKeeper 伺服器執行個體 指定多個位址(當叢集中可以平行使用多個實體網路介面時,這可以增加可用性)。ZooKeeper 會執行 ICMP ECHO 要求或嘗試在目的地主機的 7 號埠(Echo)上建立 TCP 連線,以找出可連線的位址。只有在設定檔中提供多個位址時,才會發生這種情況。如果您在嘗試在單一機器上為測試啟動大型(例如 11 個以上的)整體成員叢集時,遇到一些 ICMP 速率限制(例如在 macOS 上),則可連線性檢查可能會失敗。
預設值為 true。透過將此參數設定為「false」,您可以停用可連線性檢查。請注意,停用可連線性檢查會導致叢集在網路問題期間無法正確重新設定自身,因此建議僅在測試期間停用。
除非您透過設定 multiAddress.enabled=true 來啟用 MultiAddress 功能,否則此參數不會產生任何效果。
停用資料目錄自動建立
ZooKeeper 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,即可在直接從類別檔案執行 ZooKeeper 伺服器時啟用初始化驗證,亦即 -Dzookeeper.db.autocreate=false。執行 zkServer-initialize.sh 將會建立所需的初始化檔案。
效能調整選項
ZooKeeper 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 新功能:Commit 處理器工作執行緒數目。如果設定為 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) 用於啟用快照命令的旗標。預設為 true。
-
admin.restore.enabled: (Java 系統屬性:zookeeper.admin.restore.enabled) 用於啟用還原命令的旗標。預設為 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 Framework,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 記錄從目前為 leader 的法定人數同儕接收到的封包,不包含 ping 要求。 0b0000100000 記錄用戶端工作階段的加入、移除和驗證。 0b0001000000 記錄傳送監控事件至用戶端工作階段。 0b0010000000 記錄從目前為 leader 的法定人數同儕接收到的 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
ZooKeeper 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 四個字母的字詞介面仍然可用。
可用指令包括
-
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:如果此伺服器處於唯讀模式,則為真/假。傳回「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:觀察者連線至伺服器的資訊。始終在領導者上可用,如果追隨者擔任學習主控者,則在追隨者上可用。傳回「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 叢集介面時,這會非常有用。