當前位置:
首頁 > 最新 > Spider 引擎分散式資料庫解決方案:最全的 spider 教程

Spider 引擎分散式資料庫解決方案:最全的 spider 教程

更多騰訊海量技術文章,請關注云加社區:https://cloud.tencent.com/developer

作者:張秀雲

最近開始負責財付通的資料庫的相關維護工作,其中有幾套系統使用的 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。更多信息可以訪問:

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

安裝方法非常簡單,這裡不在贅述,具體可以參考:

MariaDB安裝和更新

2、安裝 spider 引擎到 spider server 上(後端的 DB server 不需要安裝 spider 引擎)

mysql -uroot -p

或者登錄 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 的官網已經有對應的測試方法和結果,有興趣的可以去MariaDB 查閱。

五、參考資料

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

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://www.chriscalender.com/getting-started-with-the-spider-storage-engine/


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雲加社區 的精彩文章:

golang中實現通用http參數與結構體的轉換

TAG:雲加社區 |