Spider引擎分布式數據庫解決方案(最全的spider教程)

最近開始負責財付通的數據庫的相關維護工作,其中有幾套系統使用的spider引擎,為了以后能更好地對這套系統進行維護,對spider做了一些功課,將spider引擎的功能、使用場景、部署、實戰測試等做個簡單的總結,希望不了解spider引擎的同學看到這篇文章能對spider引擎有個更深入的了解。

先來說兩個我們DBA經常遇到的場景:

場景1:有兩個分布在不通實例上的多張不通的表,想要通過某個字段關聯,做一個統計,或者想將分布在不同實例的表,合并到一個實例中來做一些查詢。

場景2:由于數據庫容量的瓶頸或者是由于數據庫訪問性能的瓶頸,將一某一個大庫、大表或者訪問量非常大的表進行拆分,然后分布到不通的實例中。

這兩種場景覆蓋了我們DBA經常接觸的垂直拆分和水平拆分,在這種場景下往往面臨著如下幾個窘境:

1、這些表的訪問和存取需要額外的路由規則,復雜度很高

2、需要做數據匯總或者統計的時候,非常麻煩


我們想到的解決辦法可能有如下幾種:

1、使用數據庫中間件(Mysql fabric/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。騰訊互娛DBA團隊基于Spider3.1基礎上進行開發,提高了性能和穩定性以及修復了大量的bug,形成了非常靠譜的TSpider,目前已經在騰訊游戲、支付等領域廣泛使用。

本文就是基于spider的分布式數據庫解決方案,下面就來詳細介紹:


一、Spider引擎簡介

1、spider引擎是什么

spider引擎是一個內置的支持數據分片特性的存儲引擎,支持分區和XA事務,該引擎可以在服務器上建立和遠程服務器表之間的鏈接,操作起來就像操作本地的表一樣。并且后端可以是任何的存儲引擎。spider引擎根據表的設置的規則以及server表的規則自動進行智能路由,實現對后端數據庫不通的表或者數據分片的訪問和修改。因此該引擎對業務是完全透明的。目前spider引擎已經集成到了MariaDB中,安裝使用非常方面,目前最新的版本是Spider 3.2.37。更多信息可以訪問:https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/,具體的版本歷史如下圖所示:

2、spider架構圖

3、Spider的優勢

a、對業務完全透明,業務不需要做任何的修改

對于分庫分表的邏輯業務不需要關心,只需要通過spider作為代理入口,訪問數據對應在后端哪臺server上spider自動幫你處理。

b、方便橫向擴展,能解決單臺mysql得性能和存儲瓶頸問題

c、對后端的存儲引擎沒有限制

d、間接實現垂直拆分和水平拆分功能

通過spider和后端的數據庫連接,可以是獨立的表,也可以是基于分區表,分區表支持哈希、范圍、列表等算法

e、完全兼容mysql協議

由于MySQL特殊的插件式存儲引擎架構,server層負責SQL解析、SQL優化、數據庫對象(視圖、存儲過程等)管理;存儲引擎層負責數據存儲、索引支持、事務、buffer等,兩者之間通過約定好的handler接口進行交互。SQL解析、優化與執行交給server層處理,幾乎支持執行任意類型SQL訪問。

4、Spider的劣勢

a、spider的表本身不支持查詢緩存和全文索引,不過可以將全文索引添加在后端數據庫中;

b、如果采用物理備份,spider無法備份后端的數據,因為數據本身是存放在后端。可以對后端的mysql一一做物理備份

c、spider本身是單點,需要自己做容災機器,比如通過VIP的方式

d、多了一層網絡,性能上會有一些損耗,尤其是跨分區、跨表查詢性能會差一些

5、Tspider介紹

騰訊互娛DBA團隊在spider 3.1的基礎上進行深入優化和定制開發,形成了Tspider,極大地提高了spider性能、穩定性和兼容性,在性能上比spider至少提升30%,目前Tspider已經發展到了Tspider 1.9版本,Tspider經過了騰訊游戲海量訪問以及高數據安全性的考驗,整體解決方案已經非常成熟,目前財付通也有部分服務器使用了互娛的Tspider,騰訊互娛DBA團隊修復的部分優化點如下:

二、Spider的使用場景解析

1、垂直分表的場景和解析

a、垂直分表場景圖

b、垂直分表場景解析

從上圖可以看出,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再轉發給客戶端。

2、采用水平分表的場景

a、水平分表場景圖

b、水平分表場景解析

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再將結果轉發給發起請求的客戶端。

三、Spider引擎實戰

(一)、spider的安裝部署

從spider 10.0.0.4版本開始,spider引擎就集成到了MariaDB中,集成后安裝就非常的簡單,安裝步驟如下:

1、安裝mariaDB到spider server以及后端多臺DB server上;

安裝方法非常簡單,這里不在贅述,具體可以參考:https://mariadb.com/kb/en/mariadb/getting-installing-and-upgrading-mariadb/

2、安裝spider引擎到spider server上(后端的DB server不需要安裝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引擎

3、檢查spider引擎是否安裝成功

如果出現上圖所示的結果就說明已經支持了spider引擎了

(二)、spider的使用實戰

備注:本實踐環境基于tspider-1.8.5環境全部驗證通過

1、spider實戰拓撲圖

在實戰部分,我使用了2臺DB server,部署圖如下:

2、實戰前準備

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';

3、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上的表被刪除。

四、性能測試

性能測試可以采用sysbench來測試,和mysql單臺以及后端掛多臺DB的場景進行對比,確認spider引擎的性能和優勢,由于手頭沒有合適的設備這部分等以后有時間再進行測試,maria'DB的官網已經有對應的測試方法和結果,有興趣的可以去https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/查閱。

五、參考資料

為了撰寫本文,翻閱了不少資料,感謝前輩們的貢獻,羅列如下:

https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/

https://mariadb.com/kb/en/mariadb/spider/

https://mysqlstepbystep.com/2015/04/03/spider-for-mysql-overview/

http://km.oa.com/group/18974/articles/show/143399?kmref=search&from_page=1&no=2

http://km.oa.com/group/17613/articles/show/217681?kmref=search&from_page=1&no=1

http://www.chriscalender.com/getting-started-with-the-spider-storage-engine/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容