数据库系列:业内主流MySQL数据中间件梳理
數(shù)據(jù)庫(kù)系列:MySQL慢查詢分析和性能優(yōu)化
數(shù)據(jù)庫(kù)系列:MySQL索引優(yōu)化總結(jié)(綜合版)
數(shù)據(jù)庫(kù)系列:高并發(fā)下的數(shù)據(jù)字段變更
數(shù)據(jù)庫(kù)系列:覆蓋索引和規(guī)避回表
數(shù)據(jù)庫(kù)系列:數(shù)據(jù)庫(kù)高可用及無(wú)損擴(kuò)容
數(shù)據(jù)庫(kù)系列:使用高區(qū)分度索引列提升性能
數(shù)據(jù)庫(kù)系列:前綴索引和索引長(zhǎng)度的取舍
數(shù)據(jù)庫(kù)系列:MySQL引擎MyISAM和InnoDB的比較
數(shù)據(jù)庫(kù)系列:InnoDB下實(shí)現(xiàn)高并發(fā)控制
數(shù)據(jù)庫(kù)系列:事務(wù)的4種隔離級(jí)別
數(shù)據(jù)庫(kù)系列:RR和RC下,快照讀的區(qū)別
數(shù)據(jù)庫(kù)系列:MySQL InnoDB鎖機(jī)制介紹
數(shù)據(jù)庫(kù)系列:MySQL不同操作分別用什么鎖?
1 背景
作為一線互聯(lián)網(wǎng)的架構(gòu)師,數(shù)據(jù)庫(kù)存儲(chǔ)是必不可的一個(gè)知識(shí)領(lǐng)域,而MySQL是數(shù)據(jù)庫(kù)存儲(chǔ)層最常用的組件之一。
隨著互聯(lián)網(wǎng)的不斷發(fā)展,大規(guī)模流量場(chǎng)景的廣泛應(yīng)用,單單掌握MySQL技術(shù)是遠(yuǎn)遠(yuǎn)不夠的。數(shù)據(jù)持久化還需要能應(yīng)對(duì)以下復(fù)雜場(chǎng)景:
- 讀寫分離場(chǎng)景:需要一主多從的架構(gòu)(寫主讀從),支持讀寫請(qǐng)求的自動(dòng)負(fù)載,支持故障驅(qū)逐和主從自動(dòng)切換等,
- 分庫(kù)分表場(chǎng)景:隨著數(shù)據(jù)庫(kù)規(guī)模的變大,檢索性能會(huì)下降,所以需要,支持橫向(Scale Out)和 縱向(Scale Up)的分庫(kù)分表和跨庫(kù)跨表檢索
- 權(quán)限控制:針對(duì)不同的用戶或者角色組進(jìn)行操作權(quán)限控制
- 監(jiān)控告警:多維度對(duì)存儲(chǔ)服務(wù)的可用性、性能、讀寫比、請(qǐng)求量級(jí)變化 進(jìn)行實(shí)時(shí)監(jiān)控,如果感知異常,及時(shí)預(yù)警,避免線上故障擴(kuò)大化
- 日志審計(jì):大規(guī)模業(yè)務(wù)場(chǎng)景,經(jīng)常出現(xiàn)多業(yè)務(wù)公用存儲(chǔ)費(fèi)服務(wù),如果存儲(chǔ)層能夠自行進(jìn)行日志審計(jì),那在每個(gè)業(yè)務(wù)側(cè)就可以避免重復(fù)造*
- 并發(fā)控制:互聯(lián)網(wǎng)下流量規(guī)模都是巨量的,具備并發(fā)控制能力,可以確保糾正由并發(fā)操作導(dǎo)致的錯(cuò)誤,以保護(hù)數(shù)據(jù)庫(kù)的完整性。
當(dāng)然這些能力并不是MySQL天然支持的,需要一些中間件的支持,所以我們調(diào)研了業(yè)內(nèi)常用的一些中間件的,從業(yè)務(wù)需求驅(qū)動(dòng),看看各有哪些,是能夠滿足的。
2 業(yè)務(wù)需求驅(qū)動(dòng)
從問題出發(fā),看看行業(yè)內(nèi)對(duì)存儲(chǔ)層有哪些共同的痛點(diǎn),然后根據(jù)這些痛點(diǎn)輸出解決方案
| 問題 | 說(shuō)明 | 解決方案 |
|---|---|---|
| 連接池管理 | 客戶端連接無(wú)限制,不可復(fù)用,不可隔離,業(yè)務(wù)間互相影響(如單個(gè)服務(wù)超載調(diào)用可能導(dǎo)致雪崩) | 歸口到Proxy統(tǒng)一管理,提供連接池、連接數(shù)限制、重試、超時(shí)斷開保護(hù)等能力 |
| 讀寫分離機(jī)制 | 需要為業(yè)務(wù)提供讀寫分離機(jī)制 | 數(shù)據(jù)服務(wù)存在主從部署模式,業(yè)務(wù)在路有時(shí)Porxy自動(dòng)區(qū)分讀寫,寫路由到主存儲(chǔ)服務(wù),讀路由到從存儲(chǔ)服務(wù) |
| 負(fù)載均衡機(jī)制 | 需要為業(yè)務(wù)提供備機(jī)負(fù)載均衡 | 讀能力能自動(dòng)均衡的負(fù)載到多個(gè)從服務(wù)器上 |
| 數(shù)據(jù)庫(kù)分庫(kù)分表sharding | 數(shù)據(jù)量比較大的場(chǎng)景下,需提供業(yè)務(wù)分庫(kù)分表能力 | 調(diào)用方屏蔽分表細(xì)節(jié),跟單表操作一直。Proxy實(shí)現(xiàn)對(duì)分庫(kù)分表的核心細(xì)節(jié),不同組件會(huì)有一些限制(如帶分表字段,不支持跨庫(kù)join等) |
| 故障切換 | 主/備發(fā)生宕機(jī)等故障,需業(yè)務(wù)來(lái)處理故障切換 | 屏蔽后端DB故障問題,自動(dòng)故障切換 |
| 權(quán)限 | 一方面賬號(hào)權(quán)限放太開,沒有最小化權(quán)限;另一方面機(jī)器遷移等都需手動(dòng)申請(qǐng)權(quán)限較麻煩 | 通過user/pwds/ip等做權(quán)限控制,最小化權(quán)限。機(jī)器遷移自動(dòng)權(quán)限擴(kuò)縮容。 |
| 安全 | 需業(yè)務(wù)自己處理sql注入,核心數(shù)據(jù)加密等問題 | Proxy加一層保護(hù),像sql注入,sql黑名單(如sleep/drop),數(shù)據(jù)加密等 |
| 日志審計(jì) | Mysql數(shù)據(jù)被修改了,找不到是被誰(shuí)修改的 | 提供便捷的日志審計(jì),日志流控和動(dòng)態(tài)變更,方便定位查詢 |
| 監(jiān)控告警 | 需業(yè)務(wù)根據(jù)自己需求搭建監(jiān)控系統(tǒng) | 提供連接數(shù)/慢查詢數(shù)/Sql延遲/Sql語(yǔ)句統(tǒng)計(jì)/DB負(fù)載等監(jiān)控告警 |
| 事務(wù) | 部分業(yè)務(wù)會(huì)使用事務(wù)能力 | 支持單機(jī)/分布式事務(wù)。事務(wù)是mysql中間件最難做的點(diǎn),單機(jī)事務(wù)基本中間件都能支持到,分布式事務(wù)不同中間件實(shí)現(xiàn)程度也不同 |
| 緩存 | 有DB數(shù)據(jù)緩存的場(chǎng)景,都需業(yè)務(wù)單獨(dú)來(lái)做 | Proxy提供一些通用可配置的緩存策略(如基于查詢、用戶、schema等) |
3 常用MySQL中間件介紹
3.1 ProxySQL
介紹:
ProxySQL是使用C++開發(fā)的一個(gè)功能強(qiáng)大的數(shù)據(jù)庫(kù)代理,具有連接池、讀寫分離、負(fù)載均衡、故障切換、SQL路由、多協(xié)議支持、可擴(kuò)展性、安全性、監(jiān)控和日志以及易于配置和管理等特性。具備輕量、高性能(千億級(jí)數(shù)據(jù)處理能力)等優(yōu)勢(shì),功能完善,能滿足中間件所需的絕大多數(shù)功能
相關(guān)鏈接
- 官網(wǎng):http://www.proxysql.com/
- Github:https://github.com/sysown/proxysql/
特性介紹
- 連接池:ProxySQL支持連接池,可以有效地管理數(shù)據(jù)庫(kù)連接,減少連接和斷開連接的開銷。
- 讀寫分離:ProxySQL可以實(shí)現(xiàn)讀寫分離,將讀操作和寫操作分發(fā)到不同的數(shù)據(jù)庫(kù)服務(wù)器上,提高系統(tǒng)的性能和可靠性。
- 負(fù)載均衡:ProxySQL支持負(fù)載均衡,可以將請(qǐng)求分發(fā)到多個(gè)數(shù)據(jù)庫(kù)服務(wù)器上,實(shí)現(xiàn)負(fù)載均衡,提高系統(tǒng)的吞吐量和響應(yīng)速度。
- 故障切換:ProxySQL支持故障切換,當(dāng)某個(gè)數(shù)據(jù)庫(kù)服務(wù)器出現(xiàn)故障時(shí),可以自動(dòng)將請(qǐng)求切換到其他可用的數(shù)據(jù)庫(kù)服務(wù)器上,保證系統(tǒng)的可用性和穩(wěn)定性。
- SQL路由:ProxySQL支持SQL路由,可以根據(jù)不同的SQL語(yǔ)句類型和條件,將請(qǐng)求分發(fā)到不同的數(shù)據(jù)庫(kù)服務(wù)器上,實(shí)現(xiàn)精細(xì)化的路由控制。
- 多協(xié)議支持:ProxySQL支持多種數(shù)據(jù)庫(kù)協(xié)議,如MySQL、PostgreSQL、Oracle等,可以輕松地與其他數(shù)據(jù)庫(kù)系統(tǒng)集成。
- 可擴(kuò)展性:ProxySQL支持橫向擴(kuò)展,可以通過添加更多的代理實(shí)例來(lái)擴(kuò)展系統(tǒng)的處理能力。
- 安全性:ProxySQL支持SSL/TLS加密通信,可以保證數(shù)據(jù)傳輸?shù)陌踩浴?/li>
- 監(jiān)控和日志:ProxySQL提供了豐富的監(jiān)控和日志功能,可以實(shí)時(shí)監(jiān)控系統(tǒng)的運(yùn)行狀態(tài)和性能指標(biāo),方便進(jìn)行故障排查和性能優(yōu)化。
- 易于配置和管理:ProxySQL的配置和管理相對(duì)簡(jiǎn)單,可以通過配置文件或命令行工具進(jìn)行配置和管理。
3.2 MaxScale
介紹:
MaxScale是MariaDB開發(fā)的一個(gè)MySQL數(shù)據(jù)中間件。它是一種數(shù)據(jù)庫(kù)智能代理服務(wù),旨在擴(kuò)展MariaDB Server的高可用性、可伸縮性和安全性。同時(shí),MaxScale通過將其與基礎(chǔ)數(shù)據(jù)庫(kù)基礎(chǔ)架構(gòu)分離,有助于簡(jiǎn)化應(yīng)用程序開發(fā)。
相關(guān)鏈接
- 官網(wǎng):https://mariadb.com/
- Github:https://github.com/mariadb-corporation/MaxScale/
特性介紹
特性介紹基于10.3.1以上版本
- 讀寫分離:支持讀寫分離模塊,能夠解析SQL語(yǔ)句,從而把對(duì)應(yīng)的請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)的服務(wù)器上。
- 自動(dòng)切換:能夠根據(jù)主從狀態(tài)實(shí)現(xiàn)寫庫(kù)的自動(dòng)切換。
- 插件支持:支持多種插件,如認(rèn)證、協(xié)議、路由、監(jiān)控和日志與過濾插件,這些插件可以根據(jù)需要進(jìn)行配置和擴(kuò)展。
- 高可用性:通過路由插件實(shí)現(xiàn)負(fù)載均衡的功能,同時(shí)監(jiān)控插件可以對(duì)各個(gè)數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行監(jiān)控,以確保系統(tǒng)的可用性和穩(wěn)定性。
- 安全性:提供簡(jiǎn)單的數(shù)據(jù)庫(kù)防火墻功能,對(duì)SQL進(jìn)行過濾和容錯(cuò),以增強(qiáng)系統(tǒng)的安全性。
- 可擴(kuò)展性:MaxScale的體系結(jié)構(gòu)支持橫向擴(kuò)展,可以通過添加更多的節(jié)點(diǎn)來(lái)提高系統(tǒng)的處理能力和容量。
3.3 DBProxy
介紹:
DBProxy是一個(gè)位于前端應(yīng)用與后端MySQL數(shù)據(jù)庫(kù)之間的中間件,它使得應(yīng)用程序員無(wú)需再關(guān)心讀寫分離、分表等與MySQL相關(guān)的細(xì)節(jié),可以專注于編寫業(yè)務(wù)邏輯,同時(shí)使得DBA的運(yùn)維工作對(duì)前端應(yīng)用透明,上下線DB前端應(yīng)用無(wú)感知。
DBProxy是由美團(tuán)DBA團(tuán)隊(duì)研發(fā)和維護(hù)的一個(gè)基于MySQL協(xié)議的數(shù)據(jù)中間層。它在奇虎360公司開源的Atlas基礎(chǔ)上,優(yōu)化了部分問題,并且添加了很多特性。而Atlas是在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎(chǔ)上,修改了大量bug,添加了很多功能特性。
相關(guān)鏈接
- 介紹:https://tech.meituan.com/2016/09/09/dbproxy-introduction.html
- Github:https://github.com/Meituan-Dianping/DBProxy/
特性介紹
- 讀寫分離:DBProxy可以將讀操作和寫操作分發(fā)到不同的數(shù)據(jù)庫(kù)服務(wù)器上,以提高系統(tǒng)的性能和可靠性。
- 負(fù)載均衡:DBProxy可以將請(qǐng)求分發(fā)到多個(gè)數(shù)據(jù)庫(kù)服務(wù)器上,實(shí)現(xiàn)負(fù)載均衡,提高系統(tǒng)的吞吐量和響應(yīng)速度。
- 支持分表:DBProxy可以支持分表,對(duì)數(shù)據(jù)進(jìn)行水平和垂直拆分,以減輕單一數(shù)據(jù)庫(kù)的壓力。
- IP過濾:DBProxy可以設(shè)置IP過濾,限制特定IP的訪問權(quán)限,提高系統(tǒng)的安全性。
- sql語(yǔ)句黑名單:DBProxy可以設(shè)置SQL語(yǔ)句黑名單,禁止執(zhí)行某些特定的SQL語(yǔ)句,以防止?jié)撛诘陌踩L(fēng)險(xiǎn)。
- DBA平滑下線DB:DBProxy可以實(shí)現(xiàn)在不影響前端應(yīng)用的情況下,平滑地下線某個(gè)數(shù)據(jù)庫(kù)服務(wù)器。
- 從庫(kù)流量配置:DBProxy可以對(duì)從庫(kù)的流量進(jìn)行配置,實(shí)現(xiàn)主從流量分離,提高系統(tǒng)的可用性。
- 動(dòng)態(tài)加載配置項(xiàng):DBProxy可以動(dòng)態(tài)加載配置項(xiàng),方便用戶根據(jù)實(shí)際需求進(jìn)行靈活的配置和管理。
3.4 MyCat
介紹:
MyCat源于阿里巴巴的Cobar項(xiàng)目,國(guó)內(nèi)開源軟件愛好者對(duì)Cobar項(xiàng)目進(jìn)行了改進(jìn),加入了許多新的功能在其中,并將其命名為MyCat。目前MyCAT社區(qū)活躍度很高,有很多公司采用了MyCat技術(shù),涵蓋銀行、電信、電子商務(wù)、物流、移動(dòng)應(yīng)用、O2O的眾多領(lǐng)域和公司。算是發(fā)展比較好的。
相關(guān)鏈接
- 官網(wǎng):http://www.mycat.io/
- Github:https://github.com/MyCATApache
特性介紹
- 分布式架構(gòu):采用分布式架構(gòu),可以水平擴(kuò)展,支持大規(guī)模數(shù)據(jù)存儲(chǔ)和處理。
- SQL解析和優(yōu)化:對(duì)SQL進(jìn)行解析和優(yōu)化,可以提高查詢性能和效率。
- 數(shù)據(jù)分片:支持?jǐn)?shù)據(jù)分片,可以將大表水平分割為多個(gè)小表,提高數(shù)據(jù)訪問的效率和可擴(kuò)展性。
- 讀寫分離:支持讀寫分離,可以將讀操作和寫操作分發(fā)到不同的數(shù)據(jù)庫(kù)服務(wù)器上,提高系統(tǒng)的性能和可靠性。
- 故障切換:支持故障切換,當(dāng)某個(gè)數(shù)據(jù)庫(kù)服務(wù)器出現(xiàn)故障時(shí),可以自動(dòng)將請(qǐng)求切換到其他可用的數(shù)據(jù)庫(kù)服務(wù)器上,保證系統(tǒng)的可用性和穩(wěn)定性。
- 監(jiān)控和管理:MyCat提供豐富的監(jiān)控和管理功能,可以實(shí)時(shí)監(jiān)控系統(tǒng)的運(yùn)行狀態(tài)和性能指標(biāo),方便進(jìn)行故障排查和性能優(yōu)化。
3.5 TDDL
介紹:
TDDL是淘寶開發(fā)的一種基于Java語(yǔ)言的分布式數(shù)據(jù)庫(kù)系統(tǒng),主要解決了分庫(kù)分表對(duì)應(yīng)用的透明化以及異構(gòu)數(shù)據(jù)庫(kù)之間的數(shù)據(jù)復(fù)制,它是一個(gè)基于集中式配置的jdbc datasource實(shí)現(xiàn),具有線性水平擴(kuò)展能力、海量數(shù)據(jù)存儲(chǔ)訪問能力、高性價(jià)比、數(shù)據(jù)存儲(chǔ)平滑擴(kuò)容、分庫(kù)分表、透明讀寫分離、成熟的管控系統(tǒng)等特點(diǎn)。
相關(guān)鏈接
- Github:https://github.com/alibaba/tb_tddl
特性介紹
- 線性水平擴(kuò)展能力:TDDL能夠?qū)崟r(shí)提升數(shù)據(jù)庫(kù)處理能力,提高訪問效率,峰值TPS可達(dá)150萬(wàn)+,輕松應(yīng)對(duì)高并發(fā)的實(shí)時(shí)交易場(chǎng)景。
- 海量數(shù)據(jù)存儲(chǔ)訪問:企業(yè)客戶隨著業(yè)務(wù)的快速發(fā)展,業(yè)務(wù)數(shù)據(jù)增長(zhǎng)迅猛,會(huì)產(chǎn)生超過單機(jī)數(shù)據(jù)庫(kù)存儲(chǔ)能力極限的數(shù)據(jù),造成數(shù)據(jù)庫(kù)容量瓶頸,限制業(yè)務(wù)發(fā)展。TDDL可以線性擴(kuò)展存儲(chǔ)空間,提供PB級(jí)存儲(chǔ)能力,可廣泛應(yīng)用于工業(yè)制造、智能家居、車聯(lián)網(wǎng)等超大規(guī)模數(shù)據(jù)存儲(chǔ)訪問場(chǎng)景。
- 高性價(jià)比數(shù)據(jù)庫(kù)解決方案:初創(chuàng)型企業(yè)初期發(fā)展階段技術(shù)積累相對(duì)比較薄弱,資金投入有限,業(yè)務(wù)發(fā)展快,數(shù)據(jù)庫(kù)的穩(wěn)定性風(fēng)險(xiǎn)高。TDDL能夠利用普通服務(wù)器提供阿里巴巴雙十一同等處理能力的高性價(jià)比國(guó)產(chǎn)數(shù)據(jù)庫(kù)解決方案。
- 數(shù)據(jù)存儲(chǔ)平滑擴(kuò)容:當(dāng)應(yīng)用單機(jī)存儲(chǔ)(MySQL)出現(xiàn)容量或性能瓶頸時(shí),TDDL提供在線數(shù)據(jù)擴(kuò)容功能(該功能需要結(jié)合阿里其它內(nèi)部中間件使用)。
- 分庫(kù)分表:TDDL支持分庫(kù)分表功能,只需選擇拆分鍵,就可以按照拆分鍵進(jìn)行分庫(kù)分表的訪問。
- 透明讀寫分離:通過使用MySQL只讀實(shí)例或者M(jìn)ySQL備機(jī)實(shí)現(xiàn)讀寫分離,幫助應(yīng)用解決事務(wù)、只讀實(shí)例或者備機(jī)掛掉、指定主備訪問等細(xì)節(jié)問題,對(duì)應(yīng)用無(wú)侵入。
- 數(shù)據(jù)存儲(chǔ)平滑擴(kuò)容:當(dāng)出現(xiàn)數(shù)據(jù)存儲(chǔ)容量和訪問量瓶頸時(shí),TDDL支持存儲(chǔ)容量在線擴(kuò)展,擴(kuò)容無(wú)需改造應(yīng)用,擴(kuò)容進(jìn)度支持可視化跟蹤。
- 成熟的管控系統(tǒng):通過數(shù)據(jù)庫(kù)運(yùn)維支撐系統(tǒng)保障數(shù)據(jù)庫(kù)的正常有序運(yùn)轉(zhuǎn)。
4 總結(jié)
大致介紹了互聯(lián)網(wǎng)場(chǎng)景下數(shù)據(jù)存儲(chǔ)服務(wù)的需求,以及當(dāng)下業(yè)內(nèi)知名MySQL中間件的功能特性。
后面我們對(duì)這些數(shù)據(jù)庫(kù)中間件一個(gè)個(gè)詳細(xì)拆解下,看看他能解決我們哪些痛點(diǎn)。
總結(jié)
以上是生活随笔為你收集整理的数据库系列:业内主流MySQL数据中间件梳理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel密码破解
- 下一篇: 消防crt是什么意思