问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Spider引擎分布式数据库解决方案详解

创作时间:
作者:
@小白创作中心

Spider引擎分布式数据库解决方案详解

引用
1
来源
1.
https://cloud.tencent.com/developer/article/1005165

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中,集成后安装就非常的简单,安装步骤如下:

  1. 安装MariaDB到Spider server以及后端多台DB server上;
  2. 安装Spider引擎到Spider server上(后端的DB server不需要安装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引擎
  1. 检查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官网性能测试方法和结果
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号