《MariaDB Spider:實(shí)現(xiàn)MySQL橫縱向擴(kuò)展的小能手》要點(diǎn):
本文介紹了MariaDB Spider:實(shí)現(xiàn)MySQL橫縱向擴(kuò)展的小能手,希望對您有用。如果有疑問,可以聯(lián)系我們。
作者介紹
賀春旸,普惠金融MySQL專家,《MySQL管理之道》第一版、第二版作者.曾任職于中國移動飛信、機(jī)鋒安卓市場,擁有豐富的數(shù)據(jù)庫管理經(jīng)驗(yàn).目前致力于MySQL、Linux等開源技術(shù)的研究.
當(dāng)您的數(shù)據(jù)庫不斷增長時,您絕對需要考慮其它技術(shù),如數(shù)據(jù)庫分片.Spider是MariaDB內(nèi)置的一個可插拔用于MariaDB/MySQL數(shù)據(jù)庫分片的存儲引擎,充當(dāng)應(yīng)用服務(wù)器和遠(yuǎn)程后端DB之間的代理(中間件),它可以輕松實(shí)現(xiàn)MySQL的橫向和縱向擴(kuò)展,突破單臺MySQL的限制,支持范圍分區(qū)、列表分區(qū)、哈希分區(qū),支持XA分布式事務(wù),支持跨庫join.通過Spider,您可以跨多個數(shù)據(jù)庫后端有效訪問數(shù)據(jù),讓您的應(yīng)用程序一行代碼不改,即可輕松實(shí)現(xiàn)分庫分表!
分庫分表架構(gòu):
應(yīng)用程序連接Spider,Spider充當(dāng)中間件代理,將客戶端查詢的請求,按照事先定義好的分片規(guī)則,分發(fā)給后端數(shù)據(jù)庫,之后返回的數(shù)據(jù)匯總在Spider內(nèi)存里做聚合,最終返回客戶端請求,對于應(yīng)用程序而言是透明的.
典型案例—騰訊游戲
騰訊游戲的生產(chǎn)環(huán)境數(shù)據(jù)量達(dá)到了100TB,用了396個Spider節(jié)點(diǎn)做數(shù)據(jù)拆分,分片后的數(shù)據(jù)用了2800個MySQL節(jié)點(diǎn)存儲.
下面介紹一下我負(fù)責(zé)的一個項(xiàng)目,已通過Spider實(shí)現(xiàn)了歷史表的垂直拆分.
隨著業(yè)務(wù)的增長,單臺服務(wù)器磁盤空間有限,有些業(yè)務(wù)上的歷史數(shù)據(jù),DBA用工具pt-archiver歸檔后,歷史表就沒有用了,通常我們會把它單獨(dú)遷移到備份機(jī),主庫上就刪除了.但有的時候,BI統(tǒng)計部門來了一個需求,需要臨時關(guān)聯(lián)查詢這些歷史表,那么,DBA就需要從備份機(jī)上myloader導(dǎo)入到從庫上去,為了降低導(dǎo)數(shù)據(jù)引起的從庫CPU升高、磁盤IO的瞬間增大,可能造成主從復(fù)制的延遲.
為了減少這種重復(fù)性的體力工作,為了更快速地縮短可用時間,我們可以通過Spider引擎解決,通過它你可以將遠(yuǎn)程服務(wù)器上的表做一個映射,做一個軟連接,相當(dāng)于你操作本地的表一樣,簡單而便捷,省去了那么多麻煩,臨時提供給業(yè)務(wù)方用,也不用考慮過多的性能問題.
架構(gòu)圖如下:
實(shí)施這個方案,選擇Spider引擎是有優(yōu)勢的:
SQL解析和查詢優(yōu)化是個非常復(fù)雜且很難做好的工作,其它替代產(chǎn)品都是自己實(shí)現(xiàn),由于復(fù)雜性,這些產(chǎn)品都帶來了一些限制,比如不支持存儲過程、函數(shù)、視圖等,給使用和實(shí)施帶來了困難.而作為一個存儲引擎,這些工作都由MariaDB自身完成了,可以方便地將大表做分布式拆分,和Fabric相比,它的好處是對業(yè)務(wù)方使用是透明的,SQL語法沒有任何限制,在不改變現(xiàn)有DB架構(gòu)的方案中,侵入性最小.
內(nèi)部原理架構(gòu)圖如下:
我們在一臺從庫上,安裝上Spider引擎,只需兩條命令做一個表的“超鏈接”,分分鐘就解決了問題.
注:前提是你的從庫使用的是MariaDB10.
下面是官方的垂直拆分壓測報告:
而在我的壓測結(jié)果上,分庫分表的性能會降低70%,垂直拆分性能會降低40%,性能損耗的原因是在分布式場景下,要保證2pc的一致性和可用性,讀寫的表現(xiàn)就差,另外就是跨多個網(wǎng)絡(luò)傳輸這兩方面引起的,目前為RC公測版本V3.2.37,固在主庫上實(shí)現(xiàn)該功能要慎重!
# mysql -uroot -p </usr/local/mysql/share/install_spider.sql
1、定義后端服務(wù)器和數(shù)據(jù)庫名字
CREATESERVER backend1
FOREIGN DATA WRAPPER mysql
OPTIONS(
HOST ‘192.168.143.205’,
DATABASE ‘test’,
USER ‘user_readonly’,
PASSWORD ‘123456’,
PORT 3306
);
這里后端服務(wù)器的名字為backend1,數(shù)據(jù)庫名字為test,主機(jī)IP地址為192.168.143.205,用戶名為user_readonly,密碼為123456,端口為3306.
注:如配置錯誤,可直接DROP SERVERbackend1; 重新創(chuàng)建即可.
2、創(chuàng)建表的“超鏈接”
CREATETABLE `sbtest` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`k` int(10) unsigned NOT NULL DEFAULT ‘0’,
`c` char(120) NOT NULL DEFAULT ”,
`pad` char(60) NOT NULL DEFAULT ”,
PRIMARY KEY (`id`),
KEY `k` (`k`)
) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT=’wrapper “mysql”,table “sbtest”,srv “backend1″‘;
這里通過設(shè)置COMMENT注釋來調(diào)用后端的表,然后你就可以查看sbtest表了,是不是很簡單?
CREATETABLE `sbtest` (
`id` int(10) unsigned NOT NULLAUTO_INCREMENT,
`k` int(10) unsigned NOT NULL DEFAULT ‘0’,
`c` char(120) NOT NULL DEFAULT ”,
`pad` char(60) NOT NULL DEFAULT ”,
PRIMARY KEY (`id`),
KEY `k` (`k`)
)ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT=’wrapper “mysql”, table”sbtest”‘
PARTITION BY LIST (mod(id,2))
(PARTITIONp0 VALUES IN (0) COMMENT = ‘srv “backend1″‘ ENGINE = SPIDER,
PARTITION p1 VALUES IN (1)COMMENT = ‘srv “backend2″‘ ENGINE = SPIDER);
同上,但區(qū)別是分庫分表是采用了類似表分區(qū)的概念實(shí)現(xiàn).
spider_conn_recycle_mode= 1
連接復(fù)用,類似連接池這種功能
optimizer_switch= ‘engine_condition_pushdown=on’
引擎下推,查詢推送到后端數(shù)據(jù)庫,將查詢結(jié)果返回給Spider做聚合
由于Spider自身不保存數(shù)據(jù),只保存路由信息,是無狀態(tài)的,因而可以部署多個Spider做負(fù)載均衡,架構(gòu)圖如下:
后端MySQL可以結(jié)合MHA實(shí)現(xiàn)高可用故障切換.
注:在MariaDB10.2版本里,Spider準(zhǔn)備GA.
參考文獻(xiàn):
相關(guān)專題:
文章來自微信公眾號:DBApulus社群
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/4240.html