1. 程式人生 > >用Spider引擎解決資料庫垂直和水平拆分的問題

用Spider引擎解決資料庫垂直和水平拆分的問題

 

作者介紹

張秀雲,網名飛鴻無痕,現任職於騰訊,負責騰訊金融資料庫的運維和優化工作。2007年開始從事運維方面的工作,經歷過網路管理員、Linux運維工程師、DBA、分散式儲存運維等多個IT職位。對Linux運維、MySQL資料庫、分散式儲存有豐富的經驗。

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

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

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

場景2:由於資料庫容量的瓶頸或者是由於資料庫訪問效能的瓶頸,將某一個大庫、大表或者訪問量非常大的表進行拆分,然後分佈到不通的例項中。

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

  1. 這些表的訪問和存取需要額外的路由規則,複雜度很高。
  2. 需要做資料彙總或者統計的時候,非常麻煩。

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

(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的分散式資料庫解決方案,下面就來詳細介紹:

一、Spider引擎簡介

1、Spider引擎是什麼

Spider引擎是一個內建的支援資料分片特性的儲存引擎,支援分割槽和XA事務,該引擎可以在伺服器上建立和遠端伺服器表之間的連結,操作起來就像操作本地的表一樣。並且後端可以是任何的儲存引擎。Spider引擎根據表的設定的規則以及server表的規則自動進行智慧路由,實現對後端資料庫不通的表或者資料分片的訪問和修改。因此該引擎對業務是完全透明的。

目前Spider引擎已經整合到了MariaDB中,安裝使用非常方面,目前最新的版本是Spider 3.2.37。更多資訊可以訪問:https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/,具體的版本歷史如下圖所示:

Spider引擎

2、Spider架構圖

Spider架構

3、Spider的優勢

  • 對業務完全透明,業務不需要做任何的修改。
  • 對於分庫分表的邏輯業務不需要關心,只需要通過Spider作為代理入口,訪問資料對應在後端哪臺server上spider自動幫你處理。
  • 方便橫向擴充套件,能解決單臺MySQL得效能和儲存瓶頸問題。
  • 對後端的儲存引擎沒有限制。
  • 間接實現垂直拆分和水平拆分功能。
  • 通過spider和後端的資料庫連線,可以是獨立的表,也可以是基於分割槽表,分割槽表支援雜湊、範圍、列表等演算法。
  • 完全相容MySQL協議由於MySQL特殊的外掛式儲存引擎架構,server層負責SQL解析、SQL優化、資料庫物件(檢視、儲存過程等)管理;儲存引擎層負責資料儲存、索引支援、事務、buffer等,兩者之間通過約定好的handler介面進行互動。SQL解析、優化與執行交給server層處理,幾乎支援執行任意型別SQL訪問。

4、Spider的劣勢

  • Spider的表本身不支援查詢快取和全文索引,不過可以將全文索引新增在後端資料庫中;
  • 如果採用物理備份,Spider無法備份後端的資料,因為資料本身是存放在後端。可以對後端的MySQL一一做物理備份;
  • Spider本身是單點,需要自己做容災機器,比如通過VIP的方式;
  • 多了一層網路,效能上會有一些損耗,尤其是跨分割槽、跨表查詢效能會差一些。

二、Spider的使用場景解析

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

  • 垂直分表場景圖

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再轉發給客戶端。

2、採用水平分表的場景

  • 水平分表場景圖

  • 水平分表場景解析

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引擎實戰

1、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引擎了。

2、Spider的使用實戰

備註:本實踐環境基於tspider-1.8.5環境全部驗證通過。

  • Spider實戰拓撲圖

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

水平分

  • 實戰前準備

a、建立Spider Server訪問後端DB Server的許可權(後面配置中需要用到)

grant all on *.* [email protected]’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表,確認是否新增成功,如下截圖所示:

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

四、效能測試

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

文章來源微信公眾號:DBAplus社群