Spider引擎分布式数据库解决方案详解
Spider引擎分布式数据库解决方案详解
Spider引擎是一种支持数据分片特性的存储引擎,能够实现数据库的分布式管理。本文将详细介绍Spider引擎的功能、使用场景、部署方法以及实战测试等内容,帮助读者更好地理解和应用Spider引擎。
一、Spider引擎简介
1. Spider引擎是什么
Spider引擎是一个内置的支持数据分片特性的存储引擎,支持分区和XA事务。该引擎可以在服务器上建立和远程服务器表之间的链接,操作起来就像操作本地的表一样。并且后端可以是任何的存储引擎。Spider引擎根据表的设置的规则以及server表的规则自动进行智能路由,实现对后端数据库不通的表或者数据分片的访问和修改。因此该引擎对业务是完全透明的。
目前Spider引擎已经集成到了MariaDB中,安装使用非常方面,目前最新的版本是Spider3.2.37。更多信息可以访问:Spider Storage Engine Overview,具体的版本历史如下图所示:
2. Spider架构图
3. Spider的优势
- 对业务完全透明,业务不需要做任何的修改
- 方便横向扩展,能解决单台MySQL的性能和存储瓶颈问题
- 对后端的存储引擎没有限制
- 间接实现垂直拆分和水平拆分功能
- 完全兼容MySQL协议
4. Spider的劣势
- Spider的表本身不支持查询缓存和全文索引,不过可以将全文索引添加在后端数据库中
- 如果采用物理备份,Spider无法备份后端的数据,因为数据本身是存放在后端。可以对后端的MySQL一一做物理备份
- Spider本身是单点,需要自己做容灾机器,比如通过VIP的方式
- 多了一层网络,性能上会有一些损耗,尤其是跨分区、跨表查询性能会差一些
5. Tspider介绍
腾讯互娱DBA团队在Spider3.1的基础上进行深入优化和定制开发,形成了Tspider,极大地提高了Spider性能、稳定性和兼容性,在性能上比Spider至少提升30%,目前Tspider已经发展到了Tspider1.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进行了分区,将0100000的记录存储在了HostA,100000200000的记录存储在了HostB,200000300000的记录存储在了HostC,300000400000的记录存储在了HostD。当用户访问user_info的某条或者多条记录的时候,Spider会根据分区的情况,对相关的记录落在某台或者多台DB server上,再进行转发。比如select * from user_info where id=1这个SQL,Spider在收到这个请求后,会跟进分区情况选择对应的DB server进行转发。这里会将该请求转发到HostA中。HostA处理完成后,再将结果返回给Spider server,Spider再将结果转发给发起请求的客户端。
三、Spider引擎实战
(一)、Spider的安装部署
从Spider10.0.0.4版本开始,Spider引擎就集成到了MariaDB中,集成后安装就非常的简单,安装步骤如下:
- 安装MariaDB到Spider server以及后端多台DB server上;
- 安装Spider引擎到Spider server上(后端的DB server不需要安装Spider引擎)
或者登录mysql后执行mysql -uroot -p < install_spider.sql
备注:install_spider.sql在share目录下面source /path/install_spider.sql
这个命令所做的事情如下:
- 创建Spider相关的系统表
- spider_link_failed_log
- spider_link_mon_servers
- spider_tables
- spider_xa
- spider_xa_failed_log
- spider_xa_member
- 创建Spider相关的表结构
- 加载Spider引擎
- 检查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引擎的性能和优势,由于手头没有合适的设备这部分等以后有时间再进行测试,MariaDB的官网已经有对应的测试方法和结果,有兴趣的可以去MariaDB查阅。
五、参考资料
为了撰写本文,翻阅了不少资料,感谢前辈们的贡献,罗列如下:
- Spider Storage Engine Overview
- MariaDB安装和更新
- MariaDB官网性能测试方法和结果