微服務治理熱門技術揭秘:動態讀寫分離
作者 | 十眠
我們從應用的視角出發整理抽象了我們在訪問、使用數據庫時場景的一些穩定性治理、性能優化、提效等方面的實戰經驗,對于每一個后端應用來說,數據庫無疑是重中之重,我們希望通過我們的數據庫治理能力,可以幫助到大家更好地使用數據庫服務。
MSE 數據庫治理完整解決方案
本文將詳細介紹 MSE 數據庫治理的熱點功能,動態讀寫分離的設計與實現。
1.讀寫分離的概述
數據庫動態讀寫分離的常見場景:
- 一個大客戶的請求過來,查詢數據庫返回上萬條幾百 M 的數據,數據庫的 CPU 直接打滿。
- 微服務應用的某些業務并不是那么重要,卻存在大量查詢數據庫的邏輯,影響數據庫實例穩定性,從而導致整體服務質量的下降。
- 在業務處理過程中,如果對數據庫的讀操作遠多于寫操作,那么在做系統性能優化時就可以考慮引入讀寫分離的方案,一方面只讀庫可以承擔主庫的壓力,另一方面能夠有效的避免由數據更新導致的鎖等待,提升微服務應用的性能。
- 隨著業務的增長,我們在一定時機下需要對數據庫實例進行擴容。根據經驗大多數應用的讀寫比都在 5:1 以上,有些場景甚至大量的高于 10:1,在對數據庫有少量寫請求,但有大量讀請求的應用場景下,單個實例可能無法承受讀取壓力,甚至對業務產生影響。
可以了解到的是數據庫讀寫分離方案可以滿足阿里云上大多數公司的穩定性治理、性能提升以及數據庫擴容的需求。
如果了解讀寫分離實現的同學一定會關注以下這些問題:
- MSE 是如何解決讀寫分離對業務的侵入性?如何做到業務無需改動一行代碼,即可具備讀寫分離能力。
- MSE 如何做到精細化動態的讀寫分離控制?即使我們不知道這個業務接口真實的 SQL 是什么,但我們已經可以控制這個接口的讀 SQL 訪問只讀實例。
- MSE 是如何解決讀寫分離帶來的一致性問題?對于一致性敏感的業務,如何實現一致性的保障,滿足業務在不同場景下對一致性級別的要求。
2.MSE 讀寫分離技術揭秘
讀寫分離也就是將數據庫拆分為主庫和從庫,即主庫負責處理事務性的增刪改操作,從庫負責處理查詢操作的數據庫架構。單單看讀寫分離的概念,第一感覺就是對業務的侵入性一定不小,那么 MSE 是如何做到無侵入的呢?
(1)無侵入性:無需修改一行代碼
MSE 數據庫治理能力通過 JavaAgent 技術,動態增加用戶的數據源,注入動態讀寫分離能力,支持運行時動態將弱讀請求路由至只讀實例。
MSE 在數據源層面實現了抽象,其中 DynamicConnection、DynamicStatement 會根據具體規則從而實現 Master/Slaver 的切換,做到根據 SQL 的讀寫類型、事務的狀態以及用戶的業務規則來做 SQL 的路由,將符合條件的讀 SQL 請求轉發至 RDS 只讀實例中。
(2)精細化路由:按照請求條件、接口、SQL 多層次多條件
很多時候我們通過編寫 DAO 訪問數據庫,那么在一些復雜應用的場景下,我們很可能只知道 DAO 接口,在一些復雜場景下我們只知道微服務的接口,內部甚至搞不清楚到底調用的哪個 DAO 接口、SQL 語句,甚至如果是運維角色參與設計,我們很可能不知道哪個微服務接口導致的讀請求導致數據庫抖動,我們只知道入口應用的某個 uid。那么我們如何做到對業務接口內的讀請求路由至只讀實例呢?
MSE 數據庫治理提供了應用層面完整的 callStack 信息,可以讓我們站在應用的視角上清晰地看到哪些接口內部執行了哪些 SQL。
MSE 通過鏈路傳遞技術,支持在入口微服務、微服務接口、DAO 層面標記弱讀請求的標記,支持標記的當前線程內的 SQL 調用、當前微服務內的 SQL 調用、符合流量條件的請求鏈路級別的所有 SQL 調用等多個層面的弱讀標記傳遞,最終傳遞給讀寫分離組件的路由引擎進行 SQL 的路由依據的判斷。
(3)強一致性模式:指定接口、事務
當數據庫負載很高時,例如對大表執行 DDL(如加字段)操作或大批量插入數據的時候,延遲會非常嚴重,從而導致無法從只讀實例中讀取最新數據。MSE 提供了一些策略解決如上問題,某些接口或者某些業務對一致性比較非常高,我們可以通過規則配置告訴 MSE 在特定場景下,某些讀接口標記為強讀請求。MSE 內部會通過一些機制保證讀寫分離的強一致性效果。
(4)白屏化能力:通過 AccessLog 實時感知讀寫分離情況
有讀寫分離能力,那么我們如何知道讀寫分離的執行情況,到底哪些應用,哪些請求被分離至了只讀實例?MSE 白屏化能力提供了一套完整的 AccessLog。
- 讀請求路由至只讀實例
- 讀請求路由至主實例
3.總結
MSE 從應用的視角出發,結合微服務治理通用的技術,MSE 推出的是完整的數據庫治理解決方案,從 SQL 洞察、SQL 流控降級與容錯、連接池治理到數據庫灰度、動態讀寫分離。我們希望通過數據庫治理能力可以幫助用戶的微服務可以更好地使用數據庫,降低數據庫使用的成本,提升數據庫訪問的穩定性。
MSE 的數據庫治理能力也需要更多更加深入的客戶場景與落地實踐,如果您對 MSE 的數據庫治理能力感興趣,歡迎聯系我們,只有經過客戶打磨的產品才會愈發歷久彌新。
在建設數據庫治理能力的同時,我們也通過 OpenSergo 在與社區共同建設數據庫治理的標準。