資料庫系列:MySQL慢查詢分析和效能最佳化
資料庫系列:MySQL索引最佳化總結(綜合版)
資料庫系列:高併發下的資料欄位變更
資料庫系列:覆蓋索引和規避回表
資料庫系列:資料庫高可用及無損擴容
資料庫系列:使用高區分度索引列提升效能
資料庫系列:字首索引和索引長度的取捨
資料庫系列:MySQL引擎MyISAM和InnoDB的比較
資料庫系列:InnoDB下實現高併發控制
資料庫系列:事務的4種隔離級別
資料庫系列:RR和RC下,快照讀的區別
資料庫系列:MySQL InnoDB鎖機制介紹
資料庫系列:MySQL不同操作分別用什麼鎖?
1 背景
作為一線網際網路的架構師,資料庫儲存是必不可的一個知識領域,而MySQL是資料庫儲存層最常用的元件之一。
隨著網際網路的不斷髮展,大規模流量場景的廣泛應用,單單掌握MySQL技術是遠遠不夠的。資料持久化還需要能應對以下複雜場景:
- 讀寫分離場景:需要一主多從的架構(寫主讀從),支援讀寫請求的自動負載,支援故障驅逐和主從自動切換等,
- 分庫分表場景:隨著資料庫規模的變大,檢索效能會下降,所以需要,支援橫向(Scale Out)和 縱向(Scale Up)的分庫分表和跨庫跨表檢索
- 許可權控制:針對不同的使用者或者角色組進行操作許可權控制
- 監控告警:多維度對儲存服務的可用性、效能、讀寫比、請求量級變化 進行實時監控,如果感知異常,及時預警,避免線上故障擴大化
- 日誌審計:大規模業務場景,經常出現多業務公用儲存費服務,如果儲存層能夠自行進行日誌審計,那在每個業務側就可以避免重複造輪子
- 併發控制:網際網路下流量規模都是巨量的,具備併發控制能力,可以確保糾正由併發操作導致的錯誤,以保護資料庫的完整性。
當然這些能力並不是MySQL天然支援的,需要一些中介軟體的支援,所以我們調研了業內常用的一些中介軟體的,從業務需求驅動,看看各有哪些,是能夠滿足的。
2 業務需求驅動
從問題出發,看看行業內對儲存層有哪些共同的痛點,然後根據這些痛點輸出解決方案
問題 | 說明 | 解決方案 |
---|---|---|
連線池管理 | 客戶端連線無限制,不可複用,不可隔離,業務間互相影響(如單個服務超載呼叫可能導致雪崩) | 歸口到Proxy統一管理,提供連線池、連線數限制、重試、超時斷開保護等能力 |
讀寫分離機制 | 需要為業務提供讀寫分離機制 | 資料服務存在主從部署模式,業務在路有時Porxy自動區分讀寫,寫路由到主儲存服務,讀路由到從儲存服務 |
負載均衡機制 | 需要為業務提供備機負載均衡 | 讀能力能自動均衡的負載到多個從伺服器上 |
資料庫分庫分表sharding | 資料量比較大的場景下,需提供業務分庫分表能力 | 呼叫方遮蔽分表細節,跟單表操作一直。Proxy實現對分庫分表的核心細節,不同元件會有一些限制(如帶分表欄位,不支援跨庫join等) |
故障切換 | 主/備發生當機等故障,需業務來處理故障切換 | 遮蔽後端DB故障問題,自動故障切換 |
許可權 | 一方面賬號許可權放太開,沒有最小化許可權;另一方面機器遷移等都需手動申請許可權較麻煩 | 透過user/pwds/ip等做許可權控制,最小化許可權。機器遷移自動許可權擴縮容。 |
安全 | 需業務自己處理sql注入,核心資料加密等問題 | Proxy加一層保護,像sql注入,sql黑名單(如sleep/drop),資料加密等 |
日誌審計 | Mysql資料被修改了,找不到是被誰修改的 | 提供便捷的日誌審計,日誌流控和動態變更,方便定位查詢 |
監控告警 | 需業務根據自己需求搭建監控系統 | 提供連線數/慢查詢數/Sql延遲/Sql語句統計/DB負載等監控告警 |
事務 | 部分業務會使用事務能力 | 支援單機/分散式事務。事務是mysql中介軟體最難做的點,單機事務基本中介軟體都能支援到,分散式事務不同中介軟體實現程度也不同 |
快取 | 有DB資料快取的場景,都需業務單獨來做 | Proxy提供一些通用可配置的快取策略(如基於查詢、使用者、schema等) |
3 常用MySQL中介軟體介紹
3.1 ProxySQL
介紹:
ProxySQL是使用C++開發的一個功能強大的資料庫代理,具有連線池、讀寫分離、負載均衡、故障切換、SQL路由、多協議支援、可擴充套件性、安全性、監控和日誌以及易於配置和管理等特性。具備輕量、高效能(千億級資料處理能力)等優勢,功能完善,能滿足中介軟體所需的絕大多數功能
相關連結
特性介紹
- 連線池:ProxySQL支援連線池,可以有效地管理資料庫連線,減少連線和斷開連線的開銷。
- 讀寫分離:ProxySQL可以實現讀寫分離,將讀操作和寫操作分發到不同的資料庫伺服器上,提高系統的效能和可靠性。
- 負載均衡:ProxySQL支援負載均衡,可以將請求分發到多個資料庫伺服器上,實現負載均衡,提高系統的吞吐量和響應速度。
- 故障切換:ProxySQL支援故障切換,當某個資料庫伺服器出現故障時,可以自動將請求切換到其他可用的資料庫伺服器上,保證系統的可用性和穩定性。
- SQL路由:ProxySQL支援SQL路由,可以根據不同的SQL語句型別和條件,將請求分發到不同的資料庫伺服器上,實現精細化的路由控制。
- 多協議支援:ProxySQL支援多種資料庫協議,如MySQL、PostgreSQL、Oracle等,可以輕鬆地與其他資料庫系統整合。
- 可擴充套件性:ProxySQL支援橫向擴充套件,可以透過新增更多的代理例項來擴充套件系統的處理能力。
- 安全性:ProxySQL支援SSL/TLS加密通訊,可以保證資料傳輸的安全性。
- 監控和日誌:ProxySQL提供了豐富的監控和日誌功能,可以實時監控系統的執行狀態和效能指標,方便進行故障排查和效能最佳化。
- 易於配置和管理:ProxySQL的配置和管理相對簡單,可以透過配置檔案或命令列工具進行配置和管理。
3.2 MaxScale
介紹:
MaxScale是MariaDB開發的一個MySQL資料中介軟體。它是一種資料庫智慧代理服務,旨在擴充套件MariaDB Server的高可用性、可伸縮性和安全性。同時,MaxScale透過將其與基礎資料庫基礎架構分離,有助於簡化應用程式開發。
相關連結
特性介紹
特性介紹基於10.3.1以上版本
- 讀寫分離:支援讀寫分離模組,能夠解析SQL語句,從而把對應的請求轉發到對應的伺服器上。
- 自動切換:能夠根據主從狀態實現寫庫的自動切換。
- 外掛支援:支援多種外掛,如認證、協議、路由、監控和日誌與過濾外掛,這些外掛可以根據需要進行配置和擴充套件。
- 高可用性:透過路由外掛實現負載均衡的功能,同時監控外掛可以對各個資料庫伺服器進行監控,以確保系統的可用性和穩定性。
- 安全性:提供簡單的資料庫防火牆功能,對SQL進行過濾和容錯,以增強系統的安全性。
- 可擴充套件性:MaxScale的體系結構支援橫向擴充套件,可以透過新增更多的節點來提高系統的處理能力和容量。
3.3 DBProxy
介紹:
DBProxy是一個位於前端應用與後端MySQL資料庫之間的中介軟體,它使得應用程式設計師無需再關心讀寫分離、分表等與MySQL相關的細節,可以專注於編寫業務邏輯,同時使得DBA的運維工作對前端應用透明,上下線DB前端應用無感知。
DBProxy是由美團DBA團隊研發和維護的一個基於MySQL協議的資料中間層。它在奇虎360公司開源的Atlas基礎上,最佳化了部分問題,並且新增了很多特性。而Atlas是在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,新增了很多功能特性。
相關連結
- 介紹:https://tech.meituan.com/2016/09/09/dbproxy-introduction.html
- Github:https://github.com/Meituan-Dianping/DBProxy/
特性介紹
- 讀寫分離:DBProxy可以將讀操作和寫操作分發到不同的資料庫伺服器上,以提高系統的效能和可靠性。
- 負載均衡:DBProxy可以將請求分發到多個資料庫伺服器上,實現負載均衡,提高系統的吞吐量和響應速度。
- 支援分表:DBProxy可以支援分表,對資料進行水平和垂直拆分,以減輕單一資料庫的壓力。
- IP過濾:DBProxy可以設定IP過濾,限制特定IP的訪問許可權,提高系統的安全性。
- sql語句黑名單:DBProxy可以設定SQL語句黑名單,禁止執行某些特定的SQL語句,以防止潛在的安全風險。
- DBA平滑下線DB:DBProxy可以實現在不影響前端應用的情況下,平滑地下線某個資料庫伺服器。
- 從庫流量配置:DBProxy可以對從庫的流量進行配置,實現主從流量分離,提高系統的可用性。
- 動態載入配置項:DBProxy可以動態載入配置項,方便使用者根據實際需求進行靈活的配置和管理。
3.4 MyCat
介紹:
MyCat源於阿里巴巴的Cobar專案,國內開源軟體愛好者對Cobar專案進行了改進,加入了許多新的功能在其中,並將其命名為MyCat。目前MyCAT社群活躍度很高,有很多公司採用了MyCat技術,涵蓋銀行、電信、電子商務、物流、移動應用、O2O的眾多領域和公司。算是發展比較好的。
相關連結
特性介紹
- 分散式架構:採用分散式架構,可以水平擴充套件,支援大規模資料儲存和處理。
- SQL解析和最佳化:對SQL進行解析和最佳化,可以提高查詢效能和效率。
- 資料分片:支援資料分片,可以將大表水平分割為多個小表,提高資料訪問的效率和可擴充套件性。
- 讀寫分離:支援讀寫分離,可以將讀操作和寫操作分發到不同的資料庫伺服器上,提高系統的效能和可靠性。
- 故障切換:支援故障切換,當某個資料庫伺服器出現故障時,可以自動將請求切換到其他可用的資料庫伺服器上,保證系統的可用性和穩定性。
- 監控和管理:MyCat提供豐富的監控和管理功能,可以實時監控系統的執行狀態和效能指標,方便進行故障排查和效能最佳化。
3.5 TDDL
介紹:
TDDL是淘寶開發的一種基於Java語言的分散式資料庫系統,主要解決了分庫分表對應用的透明化以及異構資料庫之間的資料複製,它是一個基於集中式配置的jdbc datasource實現,具有線性水平擴充套件能力、海量資料儲存訪問能力、高價效比、資料儲存平滑擴容、分庫分表、透明讀寫分離、成熟的管控系統等特點。
相關連結
特性介紹
- 線性水平擴充套件能力:TDDL能夠實時提升資料庫處理能力,提高訪問效率,峰值TPS可達150萬+,輕鬆應對高併發的實時交易場景。
- 海量資料儲存訪問:企業客戶隨著業務的快速發展,業務資料增長迅猛,會產生超過單機資料庫儲存能力極限的資料,造成資料庫容量瓶頸,限制業務發展。TDDL可以線性擴充套件儲存空間,提供PB級儲存能力,可廣泛應用於工業製造、智慧家居、車聯網等超大規模資料儲存訪問場景。
- 高價效比資料庫解決方案:初創型企業初期發展階段技術積累相對比較薄弱,資金投入有限,業務發展快,資料庫的穩定性風險高。TDDL能夠利用普通伺服器提供阿里巴巴雙十一同等處理能力的高價效比國產資料庫解決方案。
- 資料儲存平滑擴容:當應用單機儲存(MySQL)出現容量或效能瓶頸時,TDDL提供線上資料擴容功能(該功能需要結合阿里其它內部中介軟體使用)。
- 分庫分表:TDDL支援分庫分表功能,只需選擇拆分鍵,就可以按照拆分鍵進行分庫分表的訪問。
- 透明讀寫分離:透過使用MySQL只讀例項或者MySQL備機實現讀寫分離,幫助應用解決事務、只讀例項或者備機掛掉、指定主備訪問等細節問題,對應用無侵入。
- 資料儲存平滑擴容:當出現資料儲存容量和訪問量瓶頸時,TDDL支援儲存容量線上擴充套件,擴容無需改造應用,擴容進度支援視覺化跟蹤。
- 成熟的管控系統:透過資料庫運維支撐系統保障資料庫的正常有序運轉。
4 總結
大致介紹了網際網路場景下資料儲存服務的需求,以及當下業內知名MySQL中介軟體的功能特性。
後面我們對這些資料庫中介軟體一個個詳細拆解下,看看他能解決我們哪些痛點。