1. 程式人生 > >MariaDB Spider:實現MySQL橫縱向擴充套件的小能手

MariaDB Spider:實現MySQL橫縱向擴充套件的小能手

作者介紹

賀春暘,普惠金融MySQL專家,《MySQL管理之道》第一版、第二版作者。曾任職於中國移動飛信、機鋒安卓市場,擁有豐富的資料庫管理經驗。目前致力於MySQL、Linux等開源技術的研究。

什麼是Spider?

當您的資料庫不斷增長時,您絕對需要考慮其它技術,如資料庫分片。Spider是MariaDB內建的一個可插拔用於MariaDB/MySQL資料庫分片的儲存引擎,充當應用伺服器和遠端後端DB之間的代理(中介軟體),它可以輕鬆實現MySQL的橫向和縱向擴充套件,突破單臺MySQL的限制,支援範圍分割槽、列表分割槽、雜湊分割槽,支援XA分散式事務,支援跨庫join。通過Spider,您可以跨多個數據庫後端有效訪問資料,讓您的應用程式一行程式碼不改,即可輕鬆實現分庫分表!

分庫分表架構:

分庫分表架構

應用程式連線Spider,Spider充當中介軟體代理,將客戶端查詢的請求,按照事先定義好的分片規則,分發給後端資料庫,之後返回的資料彙總在Spider記憶體裡做聚合,最終返回客戶端請求,對於應用程式而言是透明的。

典型案例—騰訊遊戲

-騰訊遊戲案例

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

使用場景介紹

下面介紹一下我負責的一個專案,已通過Spider實現了歷史表的垂直拆分。

隨著業務的增長,單臺伺服器磁碟空間有限,有些業務上的歷史資料,DBA用工具pt-archiver歸檔後,歷史表就沒有用了,通常我們會把它單獨遷移到備份機,主庫上就刪除了。但有的時候,BI統計部門來了一個需求,需要臨時關聯查詢這些歷史表,那麼,DBA就需要從備份機上myloader匯入到從庫上去,為了降低導資料引起的從庫CPU升高、磁碟IO的瞬間增大,可能造成主從複製的延遲。

為了減少這種重複性的體力工作,為了更快速地縮短可用時間,我們可以通過Spider引擎解決,通過它你可以將遠端伺服器上的表做一個對映,做一個軟連線,相當於你操作本地的表一樣,簡單而便捷,省去了那麼多麻煩,臨時提供給業務方用,也不用考慮過多的效能問題。

架構圖如下:

Spider

實施這個方案,選擇Spider引擎是有優勢的:

SQL解析和查詢優化是個非常複雜且很難做好的工作,其它替代產品都是自己實現,由於複雜性,這些產品都帶來了一些限制,比如不支援儲存過程、函式、檢視等,給使用和實施帶來了困難。而作為一個儲存引擎,這些工作都由MariaDB自身完成了,可以方便地將大表做分散式拆分,和Fabric相比,它的好處是對業務方使用是透明的,SQL語法沒有任何限制,在不改變現有DB架構的方案中,侵入性最小。

內部原理架構圖如下:

內部原理架構

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

注:前提是你的從庫使用的是MariaDB10。

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

垂直拆分壓測

而在我的壓測結果上,分庫分表的效能會降低70%,垂直拆分效能會降低40%,效能損耗的原因是在分散式場景下,要保證2pc的一致性和可用性,讀寫的表現就差,另外就是跨多個網路傳輸這兩方面引起的,目前為RC公測版本V3.2.37,固在主庫上實現該功能要慎重!

Spider引擎安裝

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

Spider引擎使用

垂直拆分

1、定義後端伺服器和資料庫名字

CREATESERVER 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 SERVERbackend1; 重新建立即可。

2、建立表的“超連結”

CREATETABLE `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表了,是不是很簡單?

分庫分表

CREATETABLE `sbtest` (

`id` int(10) unsigned NOT NULLAUTO_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))

(PARTITIONp0 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做負載均衡,架構圖如下:

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

注:在MariaDB10.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/

相關專題:

文章來自微信公眾號:DBApulus社群