KunlunBase 讀寫分離方案

KunlunDB發表於2022-07-12

KunlunBase 資料庫叢集在資料庫內部支援讀寫分離,並且對應用透明,使用者應用程式不需要做任何修改就可以使用資料庫的讀寫分離功能,從而提高整個系統效能及投資回報率。

一、產品架構

KunlunBase 的整體架構主要由計算層和儲存層構成,計算層負責 SQL 響應、解釋、執行等,儲存層負責資料的儲存管理,儲存層的資料採用多副本儲存機制,備機(從副本)透過強同步技術保持資料與主節點一致性。

備機的儲存節點的硬體配置與主節點一致,在一般的生產使用過程中,備機節點的主要目的是作為主機出現故障後的替換節點,不接受應用程式的直接資料處理請求,因此,在非故障切換的情況下,備機的儲存節點資源利用率相對較低。

KunlunBase 的讀寫分離方案是透過路由只讀操作到備節點,從而可以減少計算節點的資源競爭,降低主節點負載。

1.png

二、實現原理

KunlunBase 的讀寫分離在計算層的遠端查詢最佳化器內實現的,當使用者的SQL同時滿足如下條件:

  1. 當前SQL型別為select;
  2. SQL中不包含使用者自定義函式(即create function語句建立的函式),除非當前事務為只讀事務;
  3. 如果不在事務中(autocommit=on),則允許讀寫分離;如果語句在顯示事務中,則要滿足:
  • 如果在只讀事務中,則允許讀寫分離;
  • 如果在讀寫事務中,則該事務尚未更新過任何資料;

遠端查詢最佳化器就會將相應的SQL 執行計劃下發到從備機的節點上執行

KunlunServer 會根據以下規則選擇傳送select語句到目標儲存叢集的哪個備機節點:

  • 根據節點權重值選擇 (ro_weight)
  • 根據網路延遲(ping)
  • 根據主從副本的資料一致性延遲(latency)

三、配置實施

場景說明:某 OLTP 業務系統有大量的查詢操作,在業務高峰期資料庫響應速度變慢,導致了業務的效能問題。經檢查發現儲存節點主節點的儲存節點的 IO 資源利用到達瓶頸,但備機節點的 IO 資源利用率低。

以上場景可以透過讀寫分離方案解決系統效能問題,不需要修改應用, 不需要增加硬體配置,透過讀寫分離的實施,可以解決效能問題。

實施步驟:

第一步:設定引數,啟用讀寫分離。(根據情況選一種級別)

設定 enable_replica_read = on (on 開啟讀寫, off 關閉)。

使用者級別開啟:(使用者登入後生效)

alter user abc set
enable_replica_read = true;

Session 級別開啟:(當前 session 生效)

set enable_replica_read=on;

資料庫級別開啟:(對該計算節點的所有session有效)

在 pg_hba.conf 檔案中設定

enable_replica_read=on;

第二步:登入資料庫,配置讀寫分離策略。

設定如下引數,啟動讀寫分離策略:

  • replica_read_ping_threshold,計算節點到備節點的ping延遲閾值,0表示不關心;
  • replica_read_latency_threshold,主備同步延遲的閾值,0表示不關係;
  • replica_read_order,選擇備機優先順序:0,按權重;1、按ping延遲;2、按主備同步延遲;
  • replica_read_fallback,備機選擇的回退策略(如果備機不能訪問);
  • replica_read_fallback=0,直接報錯, replica_read_fallback=1,任意選擇一個備機進行訪問, replica_read_fallback=2,選擇主機進行訪問。

2.png

第三步:檢查&設定權重(可選)。

在演示的環境中 ,資料叢集由兩個 shard 組成(shard1 , shard2) ,shard1 的shard_id=1, shard1 包含3個副本(id 為1,2, 3,id為1的是主節點,id為2和3的是備機。

透過配置, 可以設定只讀操作的首先備機

設定 Shard1 的 node3 主機的作為首先備機(因為node2節點位於不同機房,延遲太高):

update pg_shard_node set ro_weight=2 where
port=6006;
Select * from pg_shard_node ;

3.png

Shard1 的 node3 的權重最高(ro_weight=2)

第四步:執行查詢,驗證讀寫分離(可選)。

4.png

透過設定 log_min_messages to ‘debug1’ 可以將 SQL 語句的執行資訊輸出到日誌中, 以方便檢查 SQL 下發的目標儲存節點(生產系統不要設定,否則影響效能)。

檢視計算節點的日誌,確認讀寫分離。
5.png

SQL 只讀語句(select ti.id from t1) 被下發到 shard1,節點3上(該副本權重最高), 而update 語句(update t1 set id=3) 是在主節點 shard1 節點1上執行。

結論

以上過程驗證了該使用者的讀寫操作分離實現。只讀語句將被路由到從備機節點,降低了主節點的IO資源利用率,系統整體效能獲得提升。

END


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011764/viewspace-2905349/,如需轉載,請註明出處,否則將追究法律責任。

相關文章