暫時複製
暫時複製 (CASSANDRA-14404) 是一項實驗性功能,專為專家級 Apache Cassandra 使用者設計,他們能夠驗證資料庫的每個面向,以符合其應用程式和部署。這表示能夠檢查讀取、寫入、停用、移除、重建、修復和替換等作業,是否都能與您的查詢、資料、組態、操作實務和可用性需求配合運作。Apache Cassandra 4.0 具有暫時複製的初始實作。Cassandra 的未來版本會讓這項功能適合更廣泛的受眾。預期未來版本將支援暫時複製的單調讀取,以及 LWT、記錄批次和計數器。由於是實驗性質,因此不建議將暫時複製用於生產環境。 |
目標
暫時複製的目標是使用增量修復來將儲存需求與資料冗餘(或共識群組大小)脫鉤,以減少儲存開銷。特定節點會充當完整複本(儲存給定代幣範圍的所有資料),而有些節點會充當暫時複本,僅儲存相同代幣範圍的未修復資料。
暫時複製實現的最佳化稱為「便宜的定額」,這表示資料冗餘會增加,但儲存使用量並不會隨之增加。
當沒有足夠的完整複本可接收和儲存所有資料時,暫時複製會很有用。暫時複製允許您設定複本的子集,僅複製尚未增量修復的資料。作為最佳化,如果我們已成功將資料寫入完整複本,則可以避免將資料寫入暫時複本。
增量修復後,儲存在暫時複本上的暫時資料可以捨棄。
啟用暫時複製
暫時複製預設未啟用。暫時複製必須在叢集中的每個節點分別設定 cassandra.yaml
中的下列組態屬性才能啟用。
transient_replication_enabled: true
暫時複製可以使用 SimpleStrategy
和 NetworkTopologyStrategy
組態。暫時複製透過將複製因子設定為 <total_replicas>/<transient_replicas>
來組態。
舉例來說,建立一個複製因子 (RF) 為 3 的鍵空間。
CREATE KEYSPACE CassandraKeyspaceSimple WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 4/1};
另一個範例,some_keysopace keyspace
在 DC1 中會有 3 個複本,其中 1 個是暫時的,而在 DC2 中會有 5 個複本,其中 2 個是暫時的
CREATE KEYSPACE some_keysopace WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : '3/1'', 'DC2' : '5/2'};
暫時複製的鍵空間僅支援將 read_repair
設定為 NONE
的表格。
重要的限制
-
當某些端點不在正常狀態時 (沒有範圍移動),RF 無法變更。
-
如果有些暫時複本,你無法新增完整的複本。你必須先移除所有暫時複本,然後變更完整複本的數量,再新增暫時複本。
-
你只能一次安全地增加暫時複本的數量,並在每次增加之間執行增量修復。
此外,暫時複製無法用於
-
單調讀取
-
輕量級交易 (LWT)
-
記錄批次
-
計數器
-
使用實體化檢視的鍵空間
-
次要索引 (2i)
便宜的定額
便宜的過半數寫入是寫入路徑上的一組最佳化,用於避免寫入暫時副本,除非沒有足夠的完整副本可用來滿足請求的一致性等級。提示永遠不會寫入暫時副本。讀取路徑上的最佳化偏好從暫時副本讀取。當以過半數寫入設定為使用暫時複製的表格時,過半數將永遠偏好可用完整副本而非暫時副本,這樣暫時副本就不必處理寫入。當完整副本緩慢或不可用時,透過將寫入傳送至暫時副本,快速寫入保護(類似於快速讀取保護)可減少尾部延遲。暫時副本可以更快地提供讀取,因為如果它們沒有資料,它們不必執行任何超出布隆過濾器檢查的動作。使用虛擬節點和大型叢集大小,即使一個或多個完整副本發生故障,它們也不會擁有大量資料,而暫時副本會開始為其一些暫時複製的範圍提供穩定的寫入流量。
推測寫入選項
CREATE TABLE
為暫時副本新增選項 speculative_write_threshold
。選項類型為 simple
,預設值為 99PERCENTILE
。當副本緩慢或沒有回應時,speculative_write_threshold
會指定便宜過半數寫入將升級為包含暫時副本的閾值。
待處理範圍和暫時副本
待處理範圍是指暫時副本之間的令牌範圍移動。當暫時範圍移動時,會有段時間兩個暫時副本都需要接收任何針對邏輯暫時副本的寫入,這樣在移動生效後,讀取過半數才能傳回回應。節點在擴充期間不是暫時副本。在它們可以提供讀取之前,它們會串流資料,就像完整副本的暫時範圍一樣。會產生待處理狀態,類似於完整副本有待處理狀態的方式。暫時副本在待處理時也會永遠接收寫入。待處理暫時範圍會傳送更多資料,並避免從中讀取。
讀取修復和暫時副本
讀取修復永遠不會嘗試修復暫時副本。讀取將永遠包含至少一個完整副本。它們也應盡可能偏好暫時副本。範圍掃描確保整個掃描範圍執行副本選取,以滿足每個掃描範圍包含一個完整副本的要求。在增量和驗證修復處理期間,在暫時副本上,反壓縮不會為暫時範圍輸出任何資料,因為資料會在修復後刪除,而暫時副本永遠不會串流資料到它們。
在完整副本和暫時副本之間轉換
暫時複製引入的額外狀態轉換需要串流和 nodetool cleanup
以不同的方式運作。當資料串流時,會確保它從完整副本串流,而不是暫時副本。
從未複製轉換為暫時複製表示節點必須保持待處理,直到下一個增量修復完成,此時已知該範圍的資料在完整副本中可用。
從暫時複製過渡到完全複製需要從完整複本串流,且與從未複製過渡到複製時串流資料的方式相同。此過渡會受到管理,因此在串流完成之前,暫時複本不會作為完整複本讀取。它可以立即用於寫入法定人數。
從完全複製過渡到暫時複製需要清除,以從暫時複製的範圍中移除已修復的資料,以回收空間。它可以立即用於寫入法定人數。
從暫時複製過渡到未複製需要執行清除,以移除以前暫時複製的資料。
當暫時複製正在使用時,支援環狀變更,包括新增/移除節點、變更 RF、新增/移除 DC。
暫時複製支援 EACH_QUORUM
(CASSANDRA-14727) 新增對 EACH_QUORUM
的暫時複製支援。根據 (CASSANDRA-14768),我們確保至少寫入每個 DC 中的 QUORUM
節點,無論我們需要等待多少回應和我們要求的一致性層級為何。這是為了讓暫時複製的使用者感到最小的驚訝;對於一般寫入,我們透過寫入每個節點,來軟性確保我們到達所有我們能夠到達的 DC 中的 QUORUM
;即使我們沒有等待 ACK,我們在兩種情況下都已傳送足夠的訊息。