PolarDB PostgreSQL版集群自帶讀寫分離功能,通過一個集群地址(讀寫分離地址)實現讀寫請求的自動轉發。

背景信息

在對數據庫有少量寫請求,但有大量讀請求的應用場景下,單個節點可能無法承受讀取壓力,甚至對業務產生影響。使用集群地址(讀寫分離地址),就可以使寫請求自動轉發到主節點,讀請求自動轉發到各個只讀節點。從而實現讀取能力的彈性擴展,滿足大量的數據庫讀取需求。

功能優勢

  • 統一讀寫分離地址,方便維護。

    您未使用集群地址(讀寫分離地址)時,需要在應用程序中分別配置主節點和每個只讀節點的連接地址,才能實現將寫請求發往主節點而將讀請求發往只讀節點。PolarDB提供一個集群地址(讀寫分離地址),您連接該地址后即可對主節點和只讀節點進行讀寫操作,讀寫請求被自動轉發到對應節點,可降低維護成本。同時,您只需添加只讀節點的個數,即可不斷擴展系統的處理能力,應用程序無需做任何修改。

  • Session級別的讀一致性。

    當客戶端通過讀寫分離建立與后端的連接后,讀寫分離中間件會自動與主節點和各個只讀節點建立連接。在同一個連接內(同一個session內),讀寫分離中間件會根據各個數據庫節點的數據同步程度,來選擇合適的節點,在保證數據正確的基礎上(寫操作之后的讀有正確的結果),實現讀寫請求的負載均衡。

  • 擴展查詢(prepare語句或命令)的負載均衡。

    含寫操作的prepare語句只發到主庫,相應的execute也只發到主庫;純讀操作的prepare語句廣播到所有節點,相應的execute根據負載均衡進行路由,從而實現查詢請求的負載均衡。

  • 支持原生高安全鏈路,提升性能。

    如果您在云上自行搭建代理層實現讀寫分離,數據在到達數據庫之前需要經歷多個組件的語句解析和轉發,對響應延遲有較大的影響。而PolarDB讀寫分離中間件隸屬于集群組件,相比外部組件而言,能夠有效降低延遲,提升處理速度。

  • 節點健康檢查,提升數據庫系統的可用性。

    讀寫分離模塊將自動對主節點和只讀節點進行健康檢查,當發現某個節點出現宕機或者延遲超過閾值時,將不再分配讀請求給該節點,讀寫請求在剩余的健康節點間進行分配。以此確保單個只讀節點發生故障時,不會影響應用的正常訪問。當節點被修復后,該節點會自動被加入請求分配體系內。

功能限制

  • 暫不支持如下命令或功能:
    • 不支持Replication-mode方式進行建連,即不支持通過讀寫分離地址自行搭建主備復制集群。如需自行搭建主備復制集群,請使用主節點的連接地址。
    • 不支持臨時表的ROWTYPE。
      create temp table fullname (first text, last text);
      select '(Joe,von Blow)'::fullname, '(Joe,d''Blow)'::fullname;
    • 不支持函數中創建臨時資源。
      • 函數中創建臨時表,然后再執行對臨時表的查詢SQL可能會收到表不存在的錯誤信息。
      • 函數中帶有prepare語句,后續execute時可能會收到statement name不存在的錯誤信息。
  • 路由相關限制 :
    • 事務中的請求都路由到主節點,事務退出后,恢復負載均衡。
    • 所有使用函數(除聚合函數,例如,count、sum)的語句,會路由到主節點。

創建或修改集群地址

高級選項-事務拆分

詳情請參見事務拆分。

高級選項-一致性級別

詳情請參見一致性級別。

自定義路由-Hint

在SQL語句前加上/*FORCE_MASTER*//*FORCE_SLAVE*/可以強制指定這條SQL的路由方向。例如select * from test默認會路由到只讀節點,改為/*FORCE_MASTER*/ select * from test就會路由到主節點。

下一步

連接數據庫集群

說明 申請集群地址后,您只需在應用中配置該集群地址,即可實現自動讀寫分離。

相關API

API描述
CreateDBEndpointAddress創建PolarDB集群的公網地址。
DescribeDBClusterEndpoints查詢PolarDB集群的地址信息。
ModifyDBClusterEndpoint修改PolarDB集群地址屬性。
ModifyDBEndpointAddress修改PolarDB集群默認訪問地址前綴。
DeleteDBEndpointAddress釋放PolarDB集群地址(除了自定義集群地址的私網地址)。