張秀雲,網名飛鴻無痕,現任職於騰訊,負責騰訊金融數據庫的運維和優化工做。2007年開始從事運維方面的工做,經歷過網絡管理員、Linux運維工程師、DBA、分佈式存儲運維等多個IT職位。對Linux運維、MySQL數據庫、分佈式存儲有豐富的經驗。mysql
近開始負責財付通數據庫的相關維護工做,其中有幾套系統使用的Spider引擎,爲了之後能更好地對這套系統進行維護,對Spider作了一些功課,將Spider引擎的功能、使用場景、部署、實戰測試等作個簡單的總結,但願同窗們看完本文後能對Spider引擎有個更深刻的瞭解。算法
先來講兩個咱們DBA常常遇到的場景:sql
場景1:有兩個分佈在不通實例上的多張不通的表,想要經過某個字段關聯,作一個統計,或者想將分佈在不一樣實例的表,合併到一個實例中來作一些查詢。數據庫
場景2:因爲數據庫容量的瓶頸或者是因爲數據庫訪問性能的瓶頸,將某一個大庫、大表或者訪問量很是大的表進行拆分,而後分佈到不通的實例中。後端
這兩種場景覆蓋了咱們DBA常常接觸的垂直拆分和水平拆分,在這種場景下每每面臨着以下幾個窘境:緩存
- 這些表的訪問和存取須要額外的路由規則,複雜度很高。
- 須要作數據彙總或者統計的時候,很是麻煩。
咱們想到的解決辦法可能有以下幾種:服務器
(1)使用數據庫中間件(MySQLfabric/TDDL/Cobar/Atlas/Heisenberg/Vitess)微信
這個彷佛是大公司專用的,因爲存在各類各樣的限制,小公司每每使用起來很是不方便,對於裏面存在的各類坑也沒辦法很好規避。網絡
(2)使用MySQL分區表架構
沒法解決磁盤空間瓶頸以及服務器性能瓶頸。
(3)使用Galera Cluster for MySQL
支持數據庫的高可用以及能實現讀請求的擴展,可是對於寫請求沒法實現性能上的突破。
(4)使用MySQL的多源複製
僅僅適合將多個實例的數據聚合到一塊兒,用來作數據統計,但仍是存在磁盤空間的瓶頸。
(5)使用federated
能夠實現將數據聚合,對於水平分割的場景並不適用,而且性能方面也存在比較大的問題。
(6)MySQL Sharding和Spider
MySQL Cluter是MySQL Sharding的一種,對於這種需求是個比較好的解決方案,不過使用於生產環境的案例比較少。還有一個Spider分佈式引擎方案,很是適合前面咱們討論的兩個場景,下來將會作深刻的介紹,該引擎目前已經集成到了MariaDB中,目前最新的版本是Spider 3.2.37。
本文就是基於Spider的分佈式數據庫解決方案,下面就來詳細介紹:
1、Spider引擎簡介
一、Spider引擎是什麼
Spider引擎是一個內置的支持數據分片特性的存儲引擎,支持分區和XA事務,該引擎能夠在服務器上創建和遠程服務器表之間的連接,操做起來就像操做本地的表同樣。而且後端能夠是任何的存儲引擎。Spider引擎根據表的設置的規則以及server表的規則自動進行智能路由,實現對後端數據庫不通的表或者數據分片的訪問和修改。所以該引擎對業務是徹底透明的。
目前Spider引擎已經集成到了MariaDB中,安裝使用很是方面,目前最新的版本是Spider 3.2.37。更多信息能夠訪問:https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/,具體的版本歷史以下圖所示:
二、Spider架構圖
三、Spider的優點
- 對業務徹底透明,業務不須要作任何的修改。
- 對於分庫分表的邏輯業務不須要關心,只須要經過Spider做爲代理入口,訪問數據對應在後端哪臺server上spider自動幫你處理。
- 方便橫向擴展,能解決單臺MySQL得性能和存儲瓶頸問題。
- 對後端的存儲引擎沒有限制。
- 間接實現垂直拆分和水平拆分功能。
- 經過spider和後端的數據庫鏈接,能夠是獨立的表,也能夠是基於分區表,分區表支持哈希、範圍、列表等算法。
- 徹底兼容MySQL協議因爲MySQL特殊的插件式存儲引擎架構,server層負責SQL解析、SQL優化、數據庫對象(視圖、存儲過程等)管理;存儲引擎層負責數據存儲、索引支持、事務、buffer等,二者之間經過約定好的handler接口進行交互。SQL解析、優化與執行交給server層處理,幾乎支持執行任意類型SQL訪問。
四、Spider的劣勢
- Spider的表自己不支持查詢緩存和全文索引,不過能夠將全文索引添加在後端數據庫中;
- 若是採用物理備份,Spider沒法備份後端的數據,由於數據自己是存放在後端。能夠對後端的MySQL一一作物理備份;
- Spider自己是單點,須要本身作容災機器,好比經過VIP的方式;
- 多了一層網絡,性能上會有一些損耗,尤爲是跨分區、跨表查詢性能會差一些。
2、Spider的使用場景解析
一、垂直分表的場景和解析
- 垂直分表場景圖
- 垂直分表場景解析
從上圖能夠看出,Spider後面接4臺DB server,能夠將不通功能的表分佈到後端不通的DB server中,好比user_info的表專門存放在HostA中,user_msg表存放在了HostB中,user_detail表存放在了HostC中,user_log表存放在了HostD中。
在圖中的紅色部分,當咱們執行紅色部分的SQL時,Spider會經過user_info表的映射關係以及HostA的IP映射關係,將查詢user_info表的請求都轉發到HostA上,HostA查詢完成後再將結果發給spider服務器,Spider再轉發給客戶端。
二、採用水平分表的場景
- 水平分表場景圖
- 水平分表場景解析
Spider支持多種水平分表的模式,目前支持hash分表(hash)、範圍分表(range)、列表分表(list),我這裏用range來講明水平分表的工做原理。
從上圖中能夠看出Spider對user_info錶針對id進行了分區,將0~100000的記錄存儲在了HostA,100000~200000的記錄存儲在了HostB,200000~300000的記錄存儲在了HostC,300000~400000的記錄存儲在了HostD。當用戶訪問user_info的某條或者多條記錄的時候,Spider會根據分區的狀況,對相關的記錄落在某臺或者多臺DB server上,再進行轉發。好比select * from user_info where id=1這個SQL,spider在收到這個請求後,會跟進分區狀況選擇對應的DB server進行轉發。這裏會將該請求轉發到HostA中。HostA處理完成後,再將結果返回給Spider server,Spider再將結果轉發給發起請求的客戶端。
3、Spider引擎實戰
一、Spider的安裝部署
從Spider 10.0.0.4版本開始,Spider引擎就集成到了MariaDB中,集成後安裝就很是的簡單,安裝步驟以下:
- 安裝MariaDB到Spider Server以及後端多臺DB Server上;
安裝方法很是簡單,這裏不在贅述,具體能夠參考:https://mariadb.com/kb/en/mariadb/getting-installing-and-upgrading-mariadb/
- 安裝Spider引擎到Spider Server上(後端的DB Sserver不須要安裝Spider引擎)
mysql -uroot -p < install_spider.sql
或者登陸MySQL後執行
source /path/install_spider.sql
備註:install_spider.sql在share目錄下面。
這個命令所作的事情以下:
建立Spider相關的系統表
spider_link_failed_log
spider_link_mon_servers
spider_tables
spider_xa
spider_xa_failed_log
spider_xa_member
建立Spider相關的表結構
加載Spider引擎
- 檢查Spider引擎是否安裝成功
若是出現上圖所示的結果就說明已經支持Spider引擎了。
二、Spider的使用實戰
備註:本實踐環境基於tspider-1.8.5環境所有驗證經過。
- Spider實戰拓撲圖
在實戰部分,我使用了2臺DB Server,部署圖以下:
- 實戰前準備
a、建立Spider Server訪問後端DB Server的權限(後面配置中須要用到)
grant all on *.* tospider_db_all@’10.128.128.91′ identified by ‘tospider_db_all’;
b、建立Spider後端DB Server的配置
能夠經過執行以下SQL的形式直接建立
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);
也能夠經過直接給mysql.servers表中直接插入相關的記錄,不事後面執行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’,」);
建立完成後能夠直接查詢mysql.servers表,確認是否添加成功,以下截圖所示:
b、建立基礎測試表
在後端兩臺DB Server上建立基礎測試表(在60和88上執行)
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’;
- Spider引擎實戰
a、創建垂直表(遠程表進行測試)
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″‘;
建立以後,執行對應增刪改查,看看是否對應的操做都發生在了backend1對應的DB Server上?
測試完成後,刪除掉Spider 服務器上的test_spider表,你會發現drop掉Spider上的表,不會致使後端DB Server上的表被刪除。
b、創建hash分區表
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″‘) ;
建立以後,執行對應增刪改查,看看是否對應的操做都發生在了backend1和backend2對應的DB Server上?
測試完成後,刪除掉Spider 服務器上的test_spider表,你會發現drop掉Spider上的表,不會致使後端DB Server上的表被刪除。
c、創建range分區表
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″‘) ;
建立以後,執行對應增刪改查,看看是否對應的操做都發生在了backend1和backend2對應的DB Server上?
測試完成後,刪除掉Spider 服務器上的test_spider表,你會發現drop掉Spider上的表,不會致使後端DB Server上的表被刪除。
d、創建list分區表測試
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″‘) ;
建立以後,執行對應增刪改查,看看是否對應的操做都發生在了backend1和backend2對應的DB Server上?
測試完成後,刪除掉Spider 服務器上的test_spider表,你會發現drop掉Spider上的表,不會致使後端DB Server上的表被刪除。
4、性能測試
性能測試能夠採用sysbench來測試,和MySQL單臺以及後端掛多臺DB的場景進行對比,確認Spider引擎的性能和優點,因爲手頭沒有合適的設備這部分等之後有時間再進行測試,maria’DB的官網已經有對應的測試方法和結果,有興趣的能夠去https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/查閱。
文章來源微信公衆號:DBAplus社羣