用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引擎简介
1、Spider引擎是什么
Spider引擎是一个内置的支持数据分片特性的存储引擎,支持分区和XA事务,该引擎可以在服务器上建立和远程服务器表之间的链接,操作起来就像操作本地的表一样。并且后端可以是任何的存储引擎。Spider引擎根据表的设置的规则以及server表的规则自动进行智能路由,实现对后端数据库不通的表或者数据分片的访问和修改。因此该引擎对业务是完全透明的。
目前Spider引擎已经集成到了MariaDB中,安装使用非常方面,目前最新的版本是Spider 3.2.37。更多信息可以访问:https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/,具体的版本历史如下图所示:
2、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后面接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 *.* 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’;
- 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社群
用Spider引擎解决数据库垂直和水平拆分的问题的更多相关文章
- mysql关于数据库表的水平拆分和垂直拆分
最初知道水平垂直分表的时候是刚参加工作不久的时候,知道了这个概念,但是公司用户量和数据量始终没上来,所以也没用到过,知道有一天到了一家新公司后,这些才被应用到实际开发中,这里我就大概说说关于水平和垂直 ...
- Pycharm使用技巧:Split Vertically/Horizontally(垂直/水平拆分窗口)
Split Vertically或者Split Horizontally可以把当前编辑窗口垂直或者水平拆分成两个. 使用: 在编辑窗口中打开你要展示的两个文件(如图中的 "郭靖" ...
- 数据库垂直拆分,水平拆分利器,cobar升级版mycat(转)
原文:数据库垂直拆分,水平拆分利器,cobar升级版mycat 1,关于Mycat Mycat情报 基于阿里的开源cobar ,可以用于生产系统中,目前在做如下的一些改进: 非阻塞IO的实现,相对于目 ...
- mysql数据库的水平拆分与垂直拆分
近端时间在面试,发现很多面试官或者面试都把数据的水平拆分合垂直拆分给搞混了,今天特意写了一篇博客来说说水平拆分和垂直拆分希望对程序猿们有所帮助. 数据库水平与垂直拆分: 垂直(纵向)拆分:是指按功能模 ...
- 数据库水平拆分和垂直拆分区别(以mysql为例)
数据库水平拆分和垂直拆分区别(以mysql为例) 数据库水平拆分和垂直拆分区别(以mysql为例) 案例: 简单购物系统暂设涉及如下表: 1.产品表(数据量10w,稳定) 2.订单表(数据 ...
- mysql的水平拆分和垂直拆分
转:http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从 ...
- MySQL 水平拆分与垂直拆分详解
前言:说到优化mysql,总会有这么个回答:水平拆分,垂直拆分,那么我们就来说说什么是水平拆分,垂直拆分. 一.垂直拆分 说明:一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将 ...
- MySQL垂直拆分和水平拆分的优缺点和共同点总结
数据的拆分(Sharding)根据其拆分分规则的类型,可以分为两种拆分模式.一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)拆分:另外一种则是 ...
- mysql的水平拆分和垂直拆分 (转)
http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这1 ...
随机推荐
- urlrewriteFilter condition----reference
src:http://tuckey.org/urlrewrite/manual/2.6/ <condition> element An element that lets you choo ...
- Beta--冲刺阶段合集
冲刺前计划与安排:https://www.cnblogs.com/pubg722/p/9069234.html 第一篇冲刺博客:http://www.cnblogs.com/pubg722/p/909 ...
- CUBA 7 新特性(上篇)
三年前,我们宣布了 CUBA 框架的第二个公开的主版本.CUBA 6 是改变游戏规则的版本 - 框架的许可从私有化变成了公开的 Apache2.0.那些日子里,我们甚至猜不到这个变化会最终将框架带向何 ...
- 阿里云提示ECS服务器存在漏洞处理方法
1.阿里云提供生成修复命令,但是这个只提供给企业版,即收费的: 2.自己手动修复的话, 采用软件升级一般都可以解决.除了提示带kernel的高危漏洞的,其他的不需要重启实例即可修复. 有kernel的 ...
- [转]一步步学习EF Core(2.事务与日志)
本文转自:http://www.cnblogs.com/GuZhenYin/p/6862505.html 上节我们留了一个问题,为什么EF Core中,我们加载班级,数据并不会出来 其实答案很简单,~ ...
- .NET环境下使用水晶报表
.NET环境下使用水晶报表 听语音 | 浏览:3280 | 更新:2013-12-20 13:36 1 2 3 4 5 6 7 分步阅读 水晶报表(Crystal Reports)-商务智能软件,通常 ...
- ASP.NET MVC4应用程序无法建立控制器的解决方案/获取自己需要的EF版本
具体错误是我建立控制器的时候出现如下图那样的错误: Unable to cast object of type 'System.Data.Entity.Core.Objects.ObjectConte ...
- Linux排查Java程序占用CPU很高的解决办法
Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意 ...
- Linux 文件缓存 (二)
close系统调用入口1. 首先来到系统调用入口,主要使用__close_fd进行了具体的处理过程,并没有耗时操作.(current->files表示进程当前打开文件表信息,fd为需要关闭的文件 ...
- 通过UA判断,对滚动条样式进行不同的操作
浏览器滚动条的默认样式比较丑,有些情况下,又不能直接overflow:hidden掉. 本文阐述如何通过 document.styleSheets[0].insertRule 简单的实现pc端和移动端 ...