《用Spider引擎解決數據庫垂直和水平拆分的問題》要點:
本文介紹了用Spider引擎解決數據庫垂直和水平拆分的問題,希望對您有用。如果有疑問,可以聯系我們。
作者介紹
張秀云,網名飛鴻無痕,現任職于騰訊,負責騰訊金融數據庫的運維和優化工作.2007年開始從事運維方面的工作,經歷過網絡管理員、Linux運維工程師、DBA、分布式存儲運維等多個IT職位.對Linux運維、MySQL數據庫、分布式存儲有豐富的經驗.
近開始負責財付通數據庫的相關維護工作,其中有幾套系統使用的Spider引擎,為了以后能更好地對這套系統進行維護,對Spider做了一些功課,將Spider引擎的功能、使用場景、部署、實戰測試等做個簡單的總結,希望同學們看完本文后能對Spider引擎有個更深入的了解.
先來說兩個我們DBA經常遇到的場景:
場景1:有兩個分布在不通實例上的多張不通的表,想要通過某個字段關聯,做一個統計,或者想將分布在不同實例的表,合并到一個實例中來做一些查詢.
場景2:由于數據庫容量的瓶頸或者是由于數據庫訪問性能的瓶頸,將某一個大庫、大表或者訪問量非常大的表進行拆分,然后分布到不通的實例中.
這兩種場景覆蓋了我們DBA經常接觸的垂直拆分和水平拆分,在這種場景下往往面臨著如下幾個窘境:
我們想到的解決辦法可能有如下幾種:
(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引擎是一個內置的支持數據分片特性的存儲引擎,支持分區和XA事務,該引擎可以在服務器上建立和遠程服務器表之間的鏈接,操作起來就像操作本地的表一樣.并且后端可以是任何的存儲引擎.Spider引擎根據表的設置的規則以及server表的規則自動進行智能路由,實現對后端數據庫不通的表或者數據分片的訪問和修改.因此該引擎對業務是完全透明的.
目前Spider引擎已經集成到了MariaDB中,安裝使用非常方面,目前最新的版本是Spider 3.2.37.更多信息可以訪問:https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/,具體的版本歷史如下圖所示:
從上圖可以看出,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再轉發給客戶端.
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 10.0.0.4版本開始,Spider引擎就集成到了MariaDB中,集成后安裝就非常的簡單,安裝步驟如下:
安裝方法非常簡單,這里不在贅述,具體可以參考:https://mariadb.com/kb/en/mariadb/getting-installing-and-upgrading-mariadb/
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引擎了.
備注:本實踐環境基于tspider-1.8.5環境全部驗證通過.
在實戰部分,我使用了2臺DB Server,部署圖如下:
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’;
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社群
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/2386.html