MariaDB Spider:實現MySQL橫縱向擴展的小能手

什麼是Spider

當您的數據庫不斷增長時,您絕對需要考慮其他技術,如數據庫分片。Spider MariaDB 內置的一個可插拔用於 MariaDB/MySQL 數據庫分片存儲引擎,充當應用服務器和遠程後端 DB 之間的代理(中間件),它可以輕鬆實現 MySQL 的橫向和縱向擴展,突破單臺 MySQL 的限制,支持範圍分區、列表分區、哈希分區,支持XA分佈式事務,支持跨庫join


通過 Spider,您可以跨多個數據庫後端有效訪問數據,讓您的應用程序一行代碼不改,即可輕鬆實現分庫分表!

 

分庫分表架構圖:


wKiom1kBlnKCMwO9AAEwJiDNJYQ545.png


應用程序連接SpiderSpider充當中間件代理,將客戶端查詢的請求,按照事先定義好的分片規則,分發給後端數據庫,之後返回的數據彙總在Spider內存裏做聚合,最終返回客戶端請求,對於應用程序而言是透明的

 

分片字段的選取

一定要針對業務上查詢最頻繁的字段做片鍵,查詢時會直接路由到後端 DB 上,否則會輪訓遍歷後端所有 DB,跨多個網絡性能就會下降。

 

1範圍分片的優點是無限擴容,但缺點是冷熱數據不均勻。


2HASH分片解決了冷熱數據不均勻的問題,但今後擴容比較麻煩,比如之前對錶取模了128張,今後變更爲256張,數據要重新導入。

 

典型案例---騰訊遊戲


wKioL1kBm1bjMm7bAAFO4lc9S1I379.png

wKiom1kBmCiCU50xAAFWvnYrAxI300.png

騰訊遊戲的生產環境數據量達到了100TB,用了396Spider節點做數據拆分,分片後的數據用了2800MySQL節點存儲。

 

使用場景介紹

下面我介紹一下我負責的一個項目,通過 Spider 實現了歷史表的垂直拆分的經驗分享。隨着業務的增長,單臺服務器磁盤空間有限,有些業務上的歷史數據,DBA 用工具 pt-archiver 歸檔後,歷史表就沒有用了,通常我們會把他單獨遷移到備份機,主庫上就刪除了。


但有的時候,BI 統計部門來了一個需求,需要臨時關聯查詢這些歷史表,那麼 DBA 需要從備份機上 myloader 導入到從庫上去,爲了降低導數據引起的從庫 CPU 升高、磁盤 IO 的瞬間增大,可能造成主從複製的延遲,爲了減少這種重複性的體力工作,爲了更快速的縮短可用時間,我們可以通過Spider引擎解決,通過它你可以將遠程服務器上的表做一個映射,做一個軟連接,相當於你操作本地的表一樣,簡單而便捷,省去了那麼多麻煩,臨時提供給業務方用,你也不用考慮啥性能問題。


架構圖如下:


wKioL1kBltvQ0AqjAAAPTqOSJ3k216.png


實施這個方案,選擇Spider引擎是有優勢的:SQL 解析和查詢優化是個非常複雜而且很難做好的工作,其他替代產品都是自己實現,由於複雜性,這些產品都帶來了一些限,比如不支持存儲過程、函數、視圖等,給使用和實施帶來了困難。


而作爲一個存儲引擎,這些工作都由 MariaDB 自身完成了,可以方便的將大表做分佈式拆分,和 Fabric 相比它的好處是對業務方使用是透明的,SQL 語法沒有任何限制,在不改變現有 DB 架構的方案中,侵入性最小。


內部原理架構圖如下:


wKiom1kBlvTiyz4vAAEdeXad47k830.png

 

我們在一臺從庫上,安裝上 Spider 引擎,只需兩條命令做一個表的“超鏈接”,分分鐘就解決了問題。


注:前提是你的從庫使用的是 MariaDB 10

 

下面是官方的垂直拆分壓測報告:


wKioL1kBlw7y4pJDAADP7W5xEvI440.png


而在我的壓測結果上,分庫分表的性能會降低70%,而垂直拆分性能會降低 40%,性能損耗的原因是在分佈式場景下,要保證 2pc 的一致性和可用性,讀寫的表現就差,另外就是跨多個網絡傳輸這兩方面引起的。


目前爲RC公測版本V3.2.37,固在主庫上實現該功能要慎重!

 

Spider引擎安裝

# mysql -uroot -p < /usr/local/mysql/share/install_spider.sql


mysql > SELECT engine, support, transactions, xa FROM

information_schema.engines;

wKioL1kBlyiSBSZZAAAcg7pgokk477.png 

 

Spider引擎使用

垂直拆分

1、定義後端服務器和數據庫名字


CREATE SERVER backend1

     FOREIGN DATA WRAPPER mysql

OPTIONS(

    HOST '192.168.143.205',

    DATABASE 'test',

    USER 'user_readonly',

    PASSWORD '123456',

    PORT 3306

);


這裏後端服務器的名字爲backend1,數據庫名字爲test,主機IP地址爲192.168.143.205,用戶名爲user_readonly,密碼爲123456,端口爲3306


注:如配置錯誤,可直接DROP SERVER backend1; 重新創建即可。

 

2、創建表的“超鏈接”


CREATE TABLE `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"';


這裏通過設置COMMENT註釋來調用後端的表,然後你就可以查看sbtest表了,是不是很簡單?

 

分庫分表

CREATE TABLE `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"'

  PARTITION BY LIST (mod(id,2))

(PARTITION p0 VALUES IN (0) COMMENT = 'srv "backend1"' ENGINE = SPIDER,

 PARTITION p1 VALUES IN (1) COMMENT = 'srv "backend2"' ENGINE = SPIDER);


同上但區別是分庫分表是採用了類似表分區的概念實現。

 

可調優參數

spider_conn_recycle_mode = 1

連接複用,類似連接池這種功能

 

optimizer_switch = 'engine_condition_pushdown=on'

引擎下推,查詢推送到後端數據庫,將查詢結果返回給Spider做聚合

 

負載均衡架構設計

由於Spider自身不保存數據,只保存路由信息,是無狀態的,所以可以部署多個Spider做負載均衡,架構圖如下:


wKioL1kBl0ezGWHyAABzL32W0RE447.png


後端 MySQL 可以結合 MHA 實現高可用故障切換

 

注:在MariaDB 10.2版本里,Spider準備GA,並且合併了騰訊的補丁。


RC最新體驗版下載地址

http://spiderformysql.com/downloads/spider-3.3/mariadb-10.2.0-spider-3.3-vp-1.1-linux-x86_64-glibc25.tgz

 

參考文獻:

https://m17.mariadb.com/session/deep-dive-supporting-distributed-data-spider

https://www.percona.com/live/17/sessions/using-spider-sharding-production

https://www.percona.com/blog/2017/04/12/percona-live-2017-many-technical-mariadb-server-sessions/

http://mp.weixin.qq.com/s/GuxGkQTptjFhqI3eI1CgJw

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章