前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spider 引擎分布式数据库解决方案(最全的 spider 教程)

Spider 引擎分布式数据库解决方案(最全的 spider 教程)

原创
作者头像
飞鸿无痕
修改2017-06-19 18:56:57
6.4K1
修改2017-06-19 18:56:57
举报

最近开始负责财付通的数据库的相关维护工作,其中有几套系统使用的 spider 引擎,为了以后能更好地对这套系统进行维护,对 spider 做了一些功课,将 spider 引擎的功能、使用场景、部署、实战测试等做个简单的总结,希望不了解 spider 引擎的同学看到这篇文章能对 spider 引擎有个更深入的了解。

先来说两个我们 DBA 经常遇到的场景:

场景 1:有两个分布在不同实例上的多张不同的表,想要通过某个字段关联,做一个统计,或者想将分布在不同实例的表,合并到一个实例中来做一些查询。

场景 2:由于数据库容量的瓶颈或者是由于数据库访问性能的瓶颈,将一某一个大库、大表或者访问量非常大的表进行拆分,然后分布到不同的实例中。

这两种场景覆盖了我们 DBA 经常接触的垂直拆分和水平拆分,在这种场景下往往面临着如下几个窘境:

1、这些表的访问和存取需要额外的路由规则,复杂度很高

2、需要做数据汇总或者统计的时候,非常麻烦

我们想到的解决办法可能有如下几种:1、使用数据库中间件(Mysql fabric/TDDL/cobar/Atlas/Heisenberg/Vitess)这个似乎是大公司的专用的,由于存在各种各样的限制,小公司往往使用起来非常不方便,对于里面存在的各种坑也没办法很好的进行规避。2、使用 mysql 分区表无法解决磁盘空间瓶颈以及服务器性能瓶颈。3、使用 Galera Cluster for MySQL 支持数据库的高可用以及能实现读请求的扩展,但是对于写请求无法实现性能上的突破。4、使用 mysql 的多源复制仅仅适合将多个实例的数据聚合到一起,用来做数据统计,但还是存在磁盘空间的瓶颈。5、使用 federated可以实现将数据聚合,对于水平分割的场景并不适用,并且性能方面也存在比较大的问题。6、MySQL Sharding 和 spidermysql cluter 是 mysql sharding 的一种,对于这种需求是个比较好的解决方案,不过使用于生产环境的案例比较少。还有一个 spider 分布式引擎方案,非常适合前面我们讨论的两个场景,下来将会做深入的介绍,该引擎目前已经集成到了 MariaDB 中,目前最新的版本是 Spider 3.2.37。腾讯互娱 DBA 团队基于 Spider3.1 基础上进行开发,提高了性能和稳定性以及修复了大量的 bug,形成了非常靠谱的 TSpider,目前已经在腾讯游戏、支付等领域广泛使用。本文就是基于 spider 的分布式数据库解决方案,下面就来详细介绍:

一、Spider 引擎简介

1、spider 引擎是什么

spider 引擎是一个内置的支持数据分片特性的存储引擎,支持分区和 XA 事务,该引擎可以在服务器上建立和远程服务器表之间的链接,操作起来就像操作本地的表一样。并且后端可以是任何的存储引擎。spider 引擎根据表的设置的规则以及 server 表的规则自动进行智能路由,实现对后端数据库不通的表或者数据分片的访问和修改。因此该引擎对业务是完全透明的。目前 spider 引擎已经集成到了 MariaDB 中,安装使用非常方面,目前最新的版本是 Spider 3.2.37。更多信息可以访问:

Spider Storage Engine Overview,具体的版本历史如下图所示:

[1495871680477_7132_1495871680685.png]
[1495871680477_7132_1495871680685.png]

2、spider 架构图

[1495871697816_4612_1495871697928.png]
[1495871697816_4612_1495871697928.png]

3、Spider 的优势

a、对业务完全透明,业务不需要做任何的修改

对于分库分表的逻辑业务不需要关心,只需要通过 spider 作为代理入口,访问数据对应在后端哪台 server 上 spider 自动帮你处理。

b、方便横向扩展,能解决单台 mysql 得性能和存储瓶颈问题

c、对后端的存储引擎没有限制

d、间接实现垂直拆分和水平拆分功能

通过 spider 和后端的数据库连接,可以是独立的表,也可以是基于分区表,分区表支持哈希、范围、列表等算法。

e、完全兼容 mysql 协议

由于 MySQL 特殊的插件式存储引擎架构,server 层负责 SQL 解析、SQL 优化、数据库对象(视图、存储过程等)管理;存储引擎层负责数据存储、索引支持、事务、buffer 等,两者之间通过约定好的 handler 接口进行交互。SQL 解析、优化与执行交给 server 层处理,几乎支持执行任意类型 SQL 访问。

4、Spider 的劣势

a、spider 的表本身不支持查询缓存和全文索引,不过可以将全文索引添加在后端数据库中;

b、如果采用物理备份,spider 无法备份后端的数据,因为数据本身是存放在后端。可以对后端的 mysql 一一做物理备份

c、spider 本身是单点,需要自己做容灾机器,比如通过 VIP 的方式

d、多了一层网络,性能上会有一些损耗,尤其是跨分区、跨表查询性能会差一些

5、Tspider 介绍

腾讯互娱 DBA 团队在 spider 3.1 的基础上进行深入优化和定制开发,形成了 Tspider,极大地提高了 spider 性能、稳定性和兼容性,在性能上比 spider 至少提升 30%,目前 Tspider 已经发展到了 Tspider 1.9 版本,Tspider 经过了腾讯游戏海量访问以及高数据安全性的考验,整体解决方案已经非常成熟,目前财付通也有部分服务器使用了互娱的 Tspider,腾讯互娱 DBA 团队修复的部分优化点如下:

[1495872137450_1085_1495872137695.png]
[1495872137450_1085_1495872137695.png]

二、Spider 的使用场景解析

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

a、垂直分表场景图

[1495872172296_8219_1495872172411.png]
[1495872172296_8219_1495872172411.png]

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、水平分表场景图

[1495872192778_1562_1495872192914.jpg]
[1495872192778_1562_1495872192914.jpg]

b、水平分表场景解析

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 引擎实战

(一)、spider 的安装部署

从 spider 10.0.0.4 版本开始,spider 引擎就集成到了 MariaDB 中,集成后安装就非常的简单,安装步骤如下:

1、安装 mariaDB 到 spider server 以及后端多台 DB server 上;

安装方法非常简单,这里不在赘述,具体可以参考:

MariaDB安装和更新

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_logspider_link_mon_serversspider_tablesspider_xaspider_xa_failed_logspider_xa_member

创建 spider 相关的表结构

加载 spider 引擎

3、检查 spider 引擎是否安装成功

[1495872774695_4665_1495872774877.png]
[1495872774695_4665_1495872774877.png]

如果出现上图所示的结果就说明已经支持了 spider 引擎了

(二)、spider 的使用实战

备注:本实践环境基于 tspider-1.8.5 环境全部验证通过

1、spider 实战拓扑图

在实战部分,我使用了 2 台 DB server,部署图如下:

[1495872796767_424_1495872796882.png]
[1495872796767_424_1495872796882.png]

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 表,确认是否添加成功,如下截图所示:

[1495872822963_9836_1495872823065.png]
[1495872822963_9836_1495872823065.png]

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 引擎的性能和优势,由于手头没有合适的设备这部分等以后有时间再进行测试,maria'DB 的官网已经有对应的测试方法和结果,有兴趣的可以去MariaDB 查阅。

五、参考资料

为了撰写本文,翻阅了不少资料,感谢前辈们的贡献,罗列如下:

https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/

https://mariadb.com/kb/en/mariadb/spider/

https://mysqlstepbystep.com/2015/04/03/spider-for-mysql-overview/

http://www.chriscalender.com/getting-started-with-the-spider-storage-engine/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Spider 引擎简介
    • 1、spider 引擎是什么
    • 2、spider 架构图
    • 3、Spider 的优势
    • 4、Spider 的劣势
    • 5、Tspider 介绍
    • 二、Spider 的使用场景解析
      • 1、垂直分表的场景和解析
      • 2、采用水平分表的场景
      • 三、Spider 引擎实战
        • (一)、spider 的安装部署
        • (二)、spider 的使用实战
        • 四、性能测试
        • 五、参考资料
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档