京東智聯雲MySQL讀寫分離最佳實踐 ,輕鬆搞定數據庫高性能擴展

數字化時代,數據庫對任何企業而言都是其應用的核心資源。MySQL做爲當前最流行的關係型數據庫,雖然是開源軟件,可是其簡單易懂、易於部署管理,且具備ACID特性、強大的SQL查詢等特色,被各類業務系統做爲關鍵的核心存儲。java

隨着業務量的發展和數據量的增加,單機版本的數據庫很難知足業務須要,而MySQL最多見的性能擴展方法是「讀寫分離」,其本質是將訪問壓力分散到多個MySQL節點上,但存儲壓力並無分散,「分庫分表」能夠分散訪問和存儲壓力,可是實現難度維護成本都會大幅增長。算法

▲讀寫分離架構圖▲數據庫

  • 須要主從的集羣架構,一主一從或者一主多從;
  • 主庫響應寫請求,從庫響應讀請求;
  • 主庫經過複製將數據同步到從庫,每一個節點都保存一份業務數據。

-後端

-架構

業界實現MySQL的「讀寫分離」有兩種常見方法,_客戶端實現和代理實現,_兩種方法各有利弊,須要結合各自業務特色、系統架構、運維能力來選擇實現。由於引入代理會使系統架構更加複雜,同時代理自身要考慮性能、高可用、穩定性等因素,中小公司通常使用客戶端方法實現讀寫分離。而大公司有資源去投入數據庫代理的開發和維護,當接入的業務越多,帶來的價值就越明顯。負載均衡

首先說下客戶端實現方法,例如java語言能夠基於MyBatis和Hibernate簡單封裝後,便可實現讀寫分離,架構圖以下:運維

代理實現方法,須要引入數據庫代理,實現讀寫分離和數據庫管理功能,代理兼容SQL協議,對於客戶端來講代理就是數據庫,架構圖以下:異步

對比兩種架構的優缺點:性能

不管哪一種架構,實現邏輯並不複雜,可是有一個細節須要特別注意:_MySQL主從複製延遲。_優化

MySQL的複製是異步的,儘管針對不一樣延遲的緣由有響應的優化方案,可是延遲是客觀存在的,是不可能百分百避免的。當只讀出現較大延遲的時候,就會出現數據不一致,讀到的數據是主庫提交前的,稱之爲「過時讀」,這時業務上可能就會出現問題。常見的解決方法有:

  • 核心業務讀寫都指向主庫,非核心業務採用讀寫分離。好比金融類業務,爲了保證數據的一致性,犧牲擴展性。好比論壇業務,發帖後會晚一些查詢到,它帶來的影響會小不少,是能夠忍受的;
  • 二次讀取,讀失敗後再查一遍,它和業務邏輯無關,只須要對數據庫訪問層從新封裝便可,實現代價小。不過某些場景下,它擴大的讀請求的數量,增長了數據庫的壓力,好比DDoS攻擊,很容易把數據庫壓垮;
  • 判斷延遲再讀取,讀取從庫前判斷是否有延遲,沒有延遲再從庫查詢,若是有延遲到主庫查詢。MySQL自身提供判斷延遲的監控方法,若是開啓了GTID,直接比較從庫的Retrieved_Gtid_Set和Executed_Gtid_Set值,它們相同則表示從庫沒有延遲;沒有開啓GTID的狀況下,須要比較兩組值, Master_Log_File和Relay_Master_Log_File、Read_Master_Log_Pos和Exec_Master_Log_Pos這兩組值徹底相同,則表示從庫沒有延遲。

京東智聯雲RDS-MySQL支持「讀寫分離代理」功能,建立只讀實例後,開啓讀寫分離代理,就能夠在程序中配置讀寫代理的地址,由讀寫代理實現讀請求被自動轉發到只讀實例,寫請求被自動轉發到主實例。目前MySQL5.6-8.0,Percona和Mariadb都支持開啓只讀代理。詳細介紹信息見:https://docs.jdcloud.com/cn/r...

下面從該功能的數據面和控制面來介紹下基本原理和最佳實踐。

用戶在建立讀寫分離代理的時候會配置只讀庫延遲、健康檢查、負載均衡策略等參數,根據用戶業務特色,實現讀寫分離功能。

京東智聯雲「讀寫分離代理」建立界面以下:

  1. _只讀實例延遲閾值:_只讀實例與主實例的延遲超過閾值後,只讀實例將從讀寫代理後端被移除。
  2. 負載均衡策略:讀寫代理分發讀寫請求的負載均衡策略,支持最少活躍鏈接數、最少鏈接數、最小同步時延、平均響應時延。
  3. 鏈接超時時間:只讀實例健康檢查的方法。超時後只讀實例將從讀寫代理後端被移除。
  4. _重複次數:_只讀實例健康檢查的方法。重試次數超過指定次數後,只讀實例健康檢查失敗,將從讀寫代理後端被移除。
  5. 檢查時間間隔:只讀實例健康檢查的方法,根據時間間隔對讀寫代理後端的只讀實例進行健康檢查。

最佳實踐:只讀實例延遲閾值根據業務特色配置,默認時間是100s,強烈建議該值_大於_檢查時間間隔時間。

經過RDS控制檯,能夠管理「讀寫分離代理」的整個生命週期,包括建立、修改配置、刪除和開啓公網訪問。除此以外,「讀寫分離代理」還能夠感知轉發MySQL實例的高可用切換、修改配置流程、只讀實例的建立和刪除。

  1. 高可用切換,當轉發的MySQL發生主從高可用切換的時候,「讀寫分離代理」會自動調整寫請求轉發到新的主庫上;
  2. 修改配置,當轉發的MySQL主從實例或者只讀實例觸發擴容、縮容的業務流程時,「讀寫分離代理」會自動調整將讀寫請求轉發到新的實例;
  3. 只讀實例的建立和刪除,「讀寫分離代理」會在用戶添加新只讀實例後,根據負載均衡算法,自動轉發請求到新只讀實例;當用戶刪除只讀實例後,「讀寫分離代理」會自動中止轉發請求到已刪除的只讀實例。

「讀寫分離代理」雖然會在客戶端與數據庫之間引入代理轉發請求,會有性能損耗,可是後端是有多個只讀節點響應請求,京東智聯雲的只讀實例數據量最大是8個,因此在用戶業務讀請求很大的狀況下,使用「讀寫分離代理」是提高性能的最佳方法。

經過上述內容,想必你們已經對MySQL是如何用讀寫分離的方法保障高性能擴展有了初步瞭解,若是還想進一步體驗MySQL 服務,請點擊_【閱讀原文】_連接體驗試用。

相關文章
相關標籤/搜索