Proxy下的Prepare透傳,讓GaussDB(for MySQL)更穩固,性能更卓越

来源:https://www.cnblogs.com/huaweiyun/archive/2023/11/09/17819617.html
-Advertisement-
Play Games

本文分享自華為雲社區《Proxy下的Prepare透傳,讓GaussDB(for MySQL)更穩固,性能更卓越》,作者: GaussDB 資料庫 。 1.引言 在很多業務場景下,資料庫應用程式處理大量相同的SQL語句——只需更改SQL語句中的文字或變數值。例如:使用相同的SQL模板進行WHERE查 ...


本文分享自華為雲社區《Proxy下的Prepare透傳,讓GaussDB(for MySQL)更穩固,性能更卓越》,作者: GaussDB 資料庫 。

1.引言

在很多業務場景下,資料庫應用程式處理大量相同的SQL語句——只需更改SQL語句中的文字或變數值。例如:使用相同的SQL模板進行WHERE查詢,SET 更新和VALUES 插入等操作。資料庫內部收到SQL語句後,需要對語句進行解析,即翻譯成機器可執行的語言,對大量相似的語句要做反覆的重覆翻譯。GaussDB(for MySQL)支持Prepare協議,來減少重覆翻譯的工作量。Prepare協議利用高效的客戶端/服務端二進位協議,在預處理語句中使用占位符代替參數值,使每個預處理語句只用解析一次,從而減少資料庫的開銷。

另外,由於程式員的水平及經驗參差不齊,相當大一部分程式員在編寫代碼的時候,並不會考慮SQL註入風險,使不法分子植入惡意SQL攻擊資料庫有了可乘之機。SQL註入通過將惡意的SQL查詢或更新語句插入到應用的輸入參數中,後臺資料庫做SQL解析時將遭受攻擊。由於Prepare協議在輸入參數之前已經完成了SQL的預編譯,因此將惡意的SQL當做參數插入時,資料庫不會重新編譯,因此可以防止SQL註入攻擊,具備更高的安全性。

綜上,Prepare協議可以帶來資料庫性能和穩固方面的雙重收益。

2.Prepare執行流程

Prepare協議分為兩個階段,第一階段是提交帶占位符的預編譯SQL,第二階段是傳輸數據,將占位符替換為數據進行執行。

Prepare協議應用代碼案例:

1.png

3.資料庫代理(Proxy)場景下的Prepare協議

在“高可用只讀,讓RDS for MySQL更穩定”一文中,我們曾提及了使用資料庫代理(Proxy)實現讀寫分離及高可靠的方案。GaussDB(for MySQL)同樣支持多Proxy,以實現讀寫分離,自動均衡負載及在只讀實例故障時自動路由至其他實例的高可靠和高性能方案。——GaussDB(for MySQL)同樣支持多Proxy,以實現讀寫分離,自動均衡負載及在只讀實例故障時自動路由至其他實例,具備高可靠和高性能能力。

資料庫代理是位於資料庫服務端和應用服務端之間的網路代理服務,其接收應用程式的連接,根據路由情況將SQL請求自動分發到GaussDB(for MySQL)節點上執行。資料庫代理(以下簡稱proxy)具有高可用、高性能、可運維、簡單易用等特點,提供自動讀寫分離、連接池、事務拆分、會話一致性等功能,詳細架構圖如下:

2.png

3.1 Proxy下的Prepare協議實現方案

未採用Proxy時,Prepare協議的兩階段(預編譯階段和執行階段)直接在資料庫節點上執行。Proxy加入後,由於資料庫代理會將同一個連接上的不同SQL分發到多個後端資料庫上,因此資料庫代理需要保存預編譯SQL和執行參數的對應關係,併在執行時,傳入至資料庫節點上執行。目前Proxy場景下的Prepare協議實現方案有兩種:

  • 文本模式(誕生較早的模式)
  • 透傳模式(現下流行的模式)

3.1.1 文本模式:

Proxy內部保存預編譯SQL的相關信息,將客戶端發送的二進位Prepare協議轉換為普通文本協議進行傳輸,即在Proxy側完成解析和替換,將解析和替換後的SQL發往後端資料庫,無需依賴資料庫進行解析轉換。

3.png

優勢:

  • 實現簡單,任何SQL無條件封裝成文本SQL直接執行。
  • 可以任意路由。
  • 當資料庫代理和後端資料庫連接斷開時,客戶端無感知,自動相容容災場景。

劣勢:

  • 需要解析類型結構,並拼裝原始SQL,對發過來的類型強依賴。例如:執行SELECT * FROM t1 LIMIT ?,當發送String類型數據時,會將其拼接成一個帶引號的String值:SELECT * FROM t1 LIMIT ‘10’, 資料庫不支持此種SQL語法導致執行報錯。
  • 由於每條SQL都需要在資料庫代理側進行拼接,且拼接時,Proxy側需要根據數據類型處理SQL註入問題,代理側性能損耗嚴重,容易成為瓶頸。

3.1.2透傳模式

透傳模式下Proxy側只做預編譯階段的事情,執行階段將預編譯語句和參數數據直接發往後端資料庫。即Proxy側不執行解析和編譯。透傳模式有兩種實現方式:

廣播式透傳(多數資料庫廠商在用的模式)

廣播式透傳是將客戶端發的預編譯語句發送到所有的後端資料庫節點,即所有後端資料庫節點在接收到參數後都可以解析、編譯和執行語句。故發送參數時,只需要任意選擇一個已發送預編譯語句的節點傳輸即可。

4.png

優勢:

  • Proxy無需拼裝解析SQL。
  • Proxy無需維護預編譯語句和後端資料庫節點之間的映射關係,只需要負責廣播和轉發,實現簡單。

劣勢:

  • 所有資料庫節點承受了同等的壓力,同一條預編譯語句被多個資料庫節點執行,資源存在浪費,某個節點壓力大時,還會承受編譯語句的壓力。
  • 當多個節點異常後恢復時,Proxy需要在所有恢復的資料庫節點上重新執行預編譯語句,才能保證參數和預編譯語句之間的對應關係,此時會導致代理的壓力過大。
單節點透傳(GaussDB(for MySQL)代理使用的模式)

單節點透傳是資料庫代理將預編譯語句根據路由發往資料庫其中一個節點,並維護預編譯語句和資料庫節點之間的映射關係,當執行參數數據時,根據映射關係將參數發往指定節點執行。

5.png

優勢:

  • Proxy無需拼裝解析SQL。
  • 不會導致後端資料庫資源浪費和整體壓力過大。

劣勢:

客戶端存儲的預編譯語句單點透傳到了某資料庫節點,在執行階段需要將客戶端輸入的參數路由到對應的節點, Proxy需要處理此關係,功能實現複雜,給GaussDB(for MySQL)團隊編碼帶來更大挑戰。

6.png

4.性能對比

我們對Proxy場景下GaussDB(for MySQL)在文本模式和透傳模式下的Prepare協議做了性能測試對比。測試顯示透傳模式下的性能優於文本模式,性能提升約28%。

執行測試的軟硬體規格說明如下表所示:

7.png

8.png

由於現下條件所限,雖然我們沒有測試廣播透傳模式與單點透傳模式間的性能對比,但是從前文的方案對比中不難預見,單點透傳模式具有更高的穩固性,因為其更不容易在Proxy側和資料庫節點側產生資源消耗,帶來瓶頸。

5.總結

GaussDB(for MySQL) Proxy下的Prepare協議將原本文本模式的處理方式優化為透傳模式,其性能得到很大提升,解決了文本模式中對數據類型強依賴的問題。目前業界多採用廣播模式的透傳,而GaussDB(for MySQL) Proxy側則將廣播模式優化為單點傳輸模式,降低了資料庫的整體性能損耗。

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文:juejin.cn/post/7283798251403821056 本文筆者計劃從全局角度來對Mybatis的整體架構及進行一次回顧和總結,希望能幫助你更加透徹的理解Mybatis。 1、前言 MyBatis是一款ORM(Object-Relational Mapping)框架,其主要用於將 ...
  • 問題 運行Springboot測試類時,查詢資料庫裡面數據顯示如下白網頁 程式報如下錯誤 解決方案 Spring Boot應用未能啟動的原因是它沒有找到合適的資料庫配置具體來說,它需要一個數據源(DataSource),但未能在你的配置中找出,也沒有找到任何嵌入式資料庫(H2, HSQL 或 Der ...
  • 哈嘍大家好,我是鹹魚 不知道有沒有小伙伴跟我一樣,剛開始學習 Python 的時候都聽說過 Python 是一種解釋型語言,因為它在運行的時候會逐行解釋並執行,而 C++ 這種是編譯型語言 不過我今天看到了一篇文章,作者提出 Python 其實也有編譯的過程,解釋器會先編譯再執行 不但如此,作者還認 ...
  • 目錄 Welcome to YARP - 1.認識YARP並搭建反向代理服務 Welcome to YARP - 2.配置功能 2.1 - 配置文件(Configuration Files) 2.2 - 配置提供者(Configuration Providers) 2.3 - 配置過濾器(Confi ...
  • 一:背景 1. 講故事 這段時間分析了幾個和網路故障有關的.NET程式之後,真的越來越體會到電腦基礎課的重要,比如 電腦網路 課,如果沒有對 tcpip協議 的深刻理解,解決這些問題真的很難,因為你只能在高層做黑盒測試,你無法看到 tcp 層面的握手和psh通訊。 這篇我們通過兩個小例子來理解一 ...
  • FTP 介紹 FTP是File Transfer Protocol的縮寫,譯為文件傳輸協議,是基於CS結構的應用層協議。其主要作用是在網路上的兩台電腦之間傳輸文件。 FTP傳輸層使用的是TCP協議,它有一個很大的特點是採用雙埠的工作模式,即客戶端和服務端的通信是通過兩個通道進行的 命令通道用於服 ...
  • MySQL總共支持四種連接方式訪問資料庫,如下表格所示,其中Linux平臺環境下,主要有兩種連接方式,一種是TCP/IP連接方式,另外一種是socket方式。Name pipe和Share memory是Windows平臺下獨有的連接方式。 那麼,MySQL資料庫中,我們能否查看會話具體使用的連接方 ...
  • 近日,由天翼雲科技有限公司雲網產品事業部天璣實驗室撰寫的《關於公有雲區分負載QoS感知的記憶體資源動態超分管理優化》(Thoth:Provisioning Overcommitted Memory Resource with Differentiated QoS in Public Clouds)論文... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...