数据库系列:业内主流MySQL数据中间件梳理
數據庫系列: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路由、多協議支持、可擴展性、安全性、監控和日志以及易于配置和管理等特性。具備輕量、高性能(千億級數據處理能力)等優勢,功能完善,能滿足中間件所需的絕大多數功能
相關鏈接
- 官網:http://www.proxysql.com/
- Github:https://github.com/sysown/proxysql/
特性介紹
- 連接池: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通過將其與基礎數據庫基礎架構分離,有助于簡化應用程序開發。
相關鏈接
- 官網:https://mariadb.com/
- Github:https://github.com/mariadb-corporation/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的眾多領域和公司。算是發展比較好的。
相關鏈接
- 官網:http://www.mycat.io/
- Github:https://github.com/MyCATApache
特性介紹
- 分布式架構:采用分布式架構,可以水平擴展,支持大規模數據存儲和處理。
- SQL解析和優化:對SQL進行解析和優化,可以提高查詢性能和效率。
- 數據分片:支持數據分片,可以將大表水平分割為多個小表,提高數據訪問的效率和可擴展性。
- 讀寫分離:支持讀寫分離,可以將讀操作和寫操作分發到不同的數據庫服務器上,提高系統的性能和可靠性。
- 故障切換:支持故障切換,當某個數據庫服務器出現故障時,可以自動將請求切換到其他可用的數據庫服務器上,保證系統的可用性和穩定性。
- 監控和管理:MyCat提供豐富的監控和管理功能,可以實時監控系統的運行狀態和性能指標,方便進行故障排查和性能優化。
3.5 TDDL
介紹:
TDDL是淘寶開發的一種基于Java語言的分布式數據庫系統,主要解決了分庫分表對應用的透明化以及異構數據庫之間的數據復制,它是一個基于集中式配置的jdbc datasource實現,具有線性水平擴展能力、海量數據存儲訪問能力、高性價比、數據存儲平滑擴容、分庫分表、透明讀寫分離、成熟的管控系統等特點。
相關鏈接
- Github:https://github.com/alibaba/tb_tddl
特性介紹
- 線性水平擴展能力:TDDL能夠實時提升數據庫處理能力,提高訪問效率,峰值TPS可達150萬+,輕松應對高并發的實時交易場景。
- 海量數據存儲訪問:企業客戶隨著業務的快速發展,業務數據增長迅猛,會產生超過單機數據庫存儲能力極限的數據,造成數據庫容量瓶頸,限制業務發展。TDDL可以線性擴展存儲空間,提供PB級存儲能力,可廣泛應用于工業制造、智能家居、車聯網等超大規模數據存儲訪問場景。
- 高性價比數據庫解決方案:初創型企業初期發展階段技術積累相對比較薄弱,資金投入有限,業務發展快,數據庫的穩定性風險高。TDDL能夠利用普通服務器提供阿里巴巴雙十一同等處理能力的高性價比國產數據庫解決方案。
- 數據存儲平滑擴容:當應用單機存儲(MySQL)出現容量或性能瓶頸時,TDDL提供在線數據擴容功能(該功能需要結合阿里其它內部中間件使用)。
- 分庫分表:TDDL支持分庫分表功能,只需選擇拆分鍵,就可以按照拆分鍵進行分庫分表的訪問。
- 透明讀寫分離:通過使用MySQL只讀實例或者MySQL備機實現讀寫分離,幫助應用解決事務、只讀實例或者備機掛掉、指定主備訪問等細節問題,對應用無侵入。
- 數據存儲平滑擴容:當出現數據存儲容量和訪問量瓶頸時,TDDL支持存儲容量在線擴展,擴容無需改造應用,擴容進度支持可視化跟蹤。
- 成熟的管控系統:通過數據庫運維支撐系統保障數據庫的正常有序運轉。
4 總結
大致介紹了互聯網場景下數據存儲服務的需求,以及當下業內知名MySQL中間件的功能特性。
后面我們對這些數據庫中間件一個個詳細拆解下,看看他能解決我們哪些痛點。
總結
以上是生活随笔為你收集整理的数据库系列:业内主流MySQL数据中间件梳理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel密码破解
- 下一篇: 消防crt是什么意思