《用Spider引擎解決數(shù)據(jù)庫(kù)垂直和水平拆分的問(wèn)題》要點(diǎn):
本文介紹了用Spider引擎解決數(shù)據(jù)庫(kù)垂直和水平拆分的問(wèn)題,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
作者介紹
張秀云,網(wǎng)名飛鴻無(wú)痕,現(xiàn)任職于騰訊,負(fù)責(zé)騰訊金融數(shù)據(jù)庫(kù)的運(yùn)維和優(yōu)化工作.2007年開(kāi)始從事運(yùn)維方面的工作,經(jīng)歷過(guò)網(wǎng)絡(luò)管理員、Linux運(yùn)維工程師、DBA、分布式存儲(chǔ)運(yùn)維等多個(gè)IT職位.對(duì)Linux運(yùn)維、MySQL數(shù)據(jù)庫(kù)、分布式存儲(chǔ)有豐富的經(jīng)驗(yàn).
近開(kāi)始負(fù)責(zé)財(cái)付通數(shù)據(jù)庫(kù)的相關(guān)維護(hù)工作,其中有幾套系統(tǒng)使用的Spider引擎,為了以后能更好地對(duì)這套系統(tǒng)進(jìn)行維護(hù),對(duì)Spider做了一些功課,將Spider引擎的功能、使用場(chǎng)景、部署、實(shí)戰(zhàn)測(cè)試等做個(gè)簡(jiǎn)單的總結(jié),希望同學(xué)們看完本文后能對(duì)Spider引擎有個(gè)更深入的了解.
先來(lái)說(shuō)兩個(gè)我們DBA經(jīng)常遇到的場(chǎng)景:
場(chǎng)景1:有兩個(gè)分布在不通實(shí)例上的多張不通的表,想要通過(guò)某個(gè)字段關(guān)聯(lián),做一個(gè)統(tǒng)計(jì),或者想將分布在不同實(shí)例的表,合并到一個(gè)實(shí)例中來(lái)做一些查詢.
場(chǎng)景2:由于數(shù)據(jù)庫(kù)容量的瓶頸或者是由于數(shù)據(jù)庫(kù)訪問(wèn)性能的瓶頸,將某一個(gè)大庫(kù)、大表或者訪問(wèn)量非常大的表進(jìn)行拆分,然后分布到不通的實(shí)例中.
這兩種場(chǎng)景覆蓋了我們DBA經(jīng)常接觸的垂直拆分和水平拆分,在這種場(chǎng)景下往往面臨著如下幾個(gè)窘境:
我們想到的解決辦法可能有如下幾種:
(1)使用數(shù)據(jù)庫(kù)中間件(MySQLfabric/TDDL/Cobar/Atlas/Heisenberg/Vitess)
這個(gè)似乎是大公司專用的,由于存在各種各樣的限制,小公司往往使用起來(lái)非常不方便,對(duì)于里面存在的各種坑也沒(méi)辦法很好規(guī)避.
(2)使用MySQL分區(qū)表
無(wú)法解決磁盤(pán)空間瓶頸以及服務(wù)器性能瓶頸.
(3)使用Galera Cluster for MySQL
支持?jǐn)?shù)據(jù)庫(kù)的高可用以及能實(shí)現(xiàn)讀請(qǐng)求的擴(kuò)展,但是對(duì)于寫(xiě)請(qǐng)求無(wú)法實(shí)現(xiàn)性能上的突破.
(4)使用MySQL的多源復(fù)制
僅僅適合將多個(gè)實(shí)例的數(shù)據(jù)聚合到一起,用來(lái)做數(shù)據(jù)統(tǒng)計(jì),但還是存在磁盤(pán)空間的瓶頸.
(5)使用federated
可以實(shí)現(xiàn)將數(shù)據(jù)聚合,對(duì)于水平分割的場(chǎng)景并不適用,并且性能方面也存在比較大的問(wèn)題.
(6)MySQL Sharding和Spider
MySQL Cluter是MySQL Sharding的一種,對(duì)于這種需求是個(gè)比較好的解決方案,不過(guò)使用于生產(chǎn)環(huán)境的案例比較少.還有一個(gè)Spider分布式引擎方案,非常適合前面我們討論的兩個(gè)場(chǎng)景,下來(lái)將會(huì)做深入的介紹,該引擎目前已經(jīng)集成到了MariaDB中,目前最新的版本是Spider 3.2.37.
本文就是基于Spider的分布式數(shù)據(jù)庫(kù)解決方案,下面就來(lái)詳細(xì)介紹:
Spider引擎是一個(gè)內(nèi)置的支持?jǐn)?shù)據(jù)分片特性的存儲(chǔ)引擎,支持分區(qū)和XA事務(wù),該引擎可以在服務(wù)器上建立和遠(yuǎn)程服務(wù)器表之間的鏈接,操作起來(lái)就像操作本地的表一樣.并且后端可以是任何的存儲(chǔ)引擎.Spider引擎根據(jù)表的設(shè)置的規(guī)則以及server表的規(guī)則自動(dòng)進(jìn)行智能路由,實(shí)現(xiàn)對(duì)后端數(shù)據(jù)庫(kù)不通的表或者數(shù)據(jù)分片的訪問(wèn)和修改.因此該引擎對(duì)業(yè)務(wù)是完全透明的.
目前Spider引擎已經(jīng)集成到了MariaDB中,安裝使用非常方面,目前最新的版本是Spider 3.2.37.更多信息可以訪問(wèn):https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/,具體的版本歷史如下圖所示:
從上圖可以看出,Spider后面接4臺(tái)DB server,可以將不通功能的表分布到后端不通的DB server中,比如user_info的表專門(mén)存放在HostA中,user_msg表存放在了HostB中,user_detail表存放在了HostC中,user_log表存放在了HostD中.
在圖中的紅色部分,當(dāng)我們執(zhí)行紅色部分的SQL時(shí),Spider會(huì)通過(guò)user_info表的映射關(guān)系以及HostA的IP映射關(guān)系,將查詢user_info表的請(qǐng)求都轉(zhuǎn)發(fā)到HostA上,HostA查詢完成后再將結(jié)果發(fā)給spider服務(wù)器,Spider再轉(zhuǎn)發(fā)給客戶端.
Spider支持多種水平分表的模式,目前支持hash分表(hash)、范圍分表(range)、列表分表(list),我這里用range來(lái)說(shuō)明水平分表的工作原理.
從上圖中可以看出Spider對(duì)user_info表針對(duì)id進(jìn)行了分區(qū),將0~100000的記錄存儲(chǔ)在了HostA,100000~200000的記錄存儲(chǔ)在了HostB,200000~300000的記錄存儲(chǔ)在了HostC,300000~400000的記錄存儲(chǔ)在了HostD.當(dāng)用戶訪問(wèn)user_info的某條或者多條記錄的時(shí)候,Spider會(huì)根據(jù)分區(qū)的情況,對(duì)相關(guān)的記錄落在某臺(tái)或者多臺(tái)DB server上,再進(jìn)行轉(zhuǎn)發(fā).比如select * from user_info where id=1這個(gè)SQL,spider在收到這個(gè)請(qǐng)求后,會(huì)跟進(jìn)分區(qū)情況選擇對(duì)應(yīng)的DB server進(jìn)行轉(zhuǎn)發(fā).這里會(huì)將該請(qǐng)求轉(zhuǎn)發(fā)到HostA中.HostA處理完成后,再將結(jié)果返回給Spider server,Spider再將結(jié)果轉(zhuǎn)發(fā)給發(fā)起請(qǐng)求的客戶端.
從Spider 10.0.0.4版本開(kāi)始,Spider引擎就集成到了MariaDB中,集成后安裝就非常的簡(jiǎn)單,安裝步驟如下:
安裝方法非常簡(jiǎn)單,這里不在贅述,具體可以參考:https://mariadb.com/kb/en/mariadb/getting-installing-and-upgrading-mariadb/
mysql -uroot -p < install_spider.sql
或者登錄MySQL后執(zhí)行
source /path/install_spider.sql
備注:install_spider.sql在share目錄下面.
這個(gè)命令所做的事情如下:
創(chuàng)建Spider相關(guān)的系統(tǒng)表
spider_link_failed_log
spider_link_mon_servers
spider_tables
spider_xa
spider_xa_failed_log
spider_xa_member
創(chuàng)建Spider相關(guān)的表結(jié)構(gòu)
加載Spider引擎
如果出現(xiàn)上圖所示的結(jié)果就說(shuō)明已經(jīng)支持Spider引擎了.
備注:本實(shí)踐環(huán)境基于tspider-1.8.5環(huán)境全部驗(yàn)證通過(guò).
在實(shí)戰(zhàn)部分,我使用了2臺(tái)DB Server,部署圖如下:
a、創(chuàng)建Spider Server訪問(wèn)后端DB Server的權(quán)限(后面配置中需要用到)
grant all on *.* tospider_db_all@’10.128.128.91′ identified by ‘tospider_db_all’;
b、創(chuàng)建Spider后端DB Server的配置
可以通過(guò)執(zhí)行如下SQL的形式直接創(chuàng)建
create server backend1 foreign data wrapper mysql options (host ‘10.128.128.60’, database ‘test’, user ‘spider_db_all’, password ‘spider_db_all’, port 3306);
create server backend2 foreign data wrapper mysql options (host ‘10.128.128.88’, database ‘test’, user ‘spider_db_all’, password ‘spider_db_all’, port 3306);
也可以通過(guò)直接給mysql.servers表中直接插入相關(guān)的記錄,不過(guò)后面執(zhí)行flush hosts才能生效
insert into mysql.servers(Server_name,Host,Db,Username,Password,Port,Socket,Wrapper,Owner)values (‘backend1′,’10.128.128.60′,’test’,’spider_db_all’,’spider_db_all’,3306,”,’mysql’,”);
insert into mysql.servers(Server_name,Host,Db,Username,Password,Port,Socket,Wrapper,Owner)values (‘backend2′,’10.128.128.88′,’test’,’spider_db_all’,’spider_db_all’,3306,”,’mysql’,”);
創(chuàng)建完成后可以直接查詢mysql.servers表,確認(rèn)是否添加成功,如下截圖所示:
b、創(chuàng)建基礎(chǔ)測(cè)試表
在后端兩臺(tái)DB Server上創(chuàng)建基礎(chǔ)測(cè)試表(在60和88上執(zhí)行)
create table test_spider (
id int,
username varchar(20),
address varchar(128),
primary key (id),
key (username)
) engine=InnoDB default charset=utf8 comment ‘spider test base table’;
a、建立垂直表(遠(yuǎn)程表進(jìn)行測(cè)試)
create table test_spider (
id int,
username varchar(20),
address varchar(128),
primary key (id),
key (username)
) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT=’server “backend1″‘;
創(chuàng)建之后,執(zhí)行對(duì)應(yīng)增刪改查,看看是否對(duì)應(yīng)的操作都發(fā)生在了backend1對(duì)應(yīng)的DB Server上?
測(cè)試完成后,刪除掉Spider 服務(wù)器上的test_spider表,你會(huì)發(fā)現(xiàn)drop掉Spider上的表,不會(huì)導(dǎo)致后端DB Server上的表被刪除.
b、建立hash分區(qū)表
create table test_spider (
id int,
username varchar(20),
address varchar(128),
primary key (id),
key (username)
) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT=’wrapper “mysql”, table “test_spider”‘
PARTITION BY HASH (id)
( PARTITION pt1 COMMENT = ‘srv “backend1″‘,
PARTITION pt2 COMMENT = ‘srv “backend2″‘) ;
創(chuàng)建之后,執(zhí)行對(duì)應(yīng)增刪改查,看看是否對(duì)應(yīng)的操作都發(fā)生在了backend1和backend2對(duì)應(yīng)的DB Server上?
測(cè)試完成后,刪除掉Spider 服務(wù)器上的test_spider表,你會(huì)發(fā)現(xiàn)drop掉Spider上的表,不會(huì)導(dǎo)致后端DB Server上的表被刪除.
c、建立range分區(qū)表
create table test_spider (
id int,
username varchar(20),
address varchar(128),
primary key (id),
key (username)
) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT=’wrapper “mysql”, table “test_spider”‘
PARTITION BY range columns (id)
( PARTITION pt1 values less than (100000) COMMENT = ‘srv “backend1″‘,
PARTITION pt2 values less than (200000) COMMENT = ‘srv “backend2″‘) ;
創(chuàng)建之后,執(zhí)行對(duì)應(yīng)增刪改查,看看是否對(duì)應(yīng)的操作都發(fā)生在了backend1和backend2對(duì)應(yīng)的DB Server上?
測(cè)試完成后,刪除掉Spider 服務(wù)器上的test_spider表,你會(huì)發(fā)現(xiàn)drop掉Spider上的表,不會(huì)導(dǎo)致后端DB Server上的表被刪除.
d、建立list分區(qū)表測(cè)試
create table test_spider (
id int,
username varchar(20),
address varchar(128),
primary key (id),
key (username)
) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT=’wrapper “mysql”, table “test_spider”‘
PARTITION BY list columns (id)
( PARTITION pt1 values in (1,3,5,7,9) COMMENT = ‘srv “backend1″‘,
PARTITION pt2 values in (2,4,6,8,10) COMMENT = ‘srv “backend2″‘) ;
創(chuàng)建之后,執(zhí)行對(duì)應(yīng)增刪改查,看看是否對(duì)應(yīng)的操作都發(fā)生在了backend1和backend2對(duì)應(yīng)的DB Server上?
測(cè)試完成后,刪除掉Spider 服務(wù)器上的test_spider表,你會(huì)發(fā)現(xiàn)drop掉Spider上的表,不會(huì)導(dǎo)致后端DB Server上的表被刪除.
性能測(cè)試可以采用sysbench來(lái)測(cè)試,和MySQL單臺(tái)以及后端掛多臺(tái)DB的場(chǎng)景進(jìn)行對(duì)比,確認(rèn)Spider引擎的性能和優(yōu)勢(shì),由于手頭沒(méi)有合適的設(shè)備這部分等以后有時(shí)間再進(jìn)行測(cè)試,maria’DB的官網(wǎng)已經(jīng)有對(duì)應(yīng)的測(cè)試方法和結(jié)果,有興趣的可以去https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/查閱.
文章來(lái)源微信公眾號(hào):DBAplus社群
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/2386.html