用Spider引擎解决数据库垂直和水平拆分的问题

《用Spider引擎解决数据库垂直和水平拆分的问题》要点:
本文介绍了用Spider引擎解决数据库垂直和水平拆分的问题,希望对您有用。如果有疑问,可以联系我们。

作者介绍

张秀云,网名飞鸿无痕,现任职于腾讯,负责腾讯金融数据库的运维和优化工作.2007年开始从事运维方面的工作,经历过网络管理员、Linux运维工程师、DBA、分布式存储运维等多个IT职位.对Linux运维、MySQL数据库、分布式存储有丰富的经验.

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

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

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

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

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

  1. 这些表的访问和存取需要额外的路由规则,复杂度很高.
  2. 需要做数据汇总或者统计的时候,非常麻烦.

我们想到的解决办法可能有如下几种:

(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/,具体的版本历史如下图所示:

Spider引擎

2、Spider架构图

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

  • 垂直分表场景解析

从上图可以看出,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引擎解决数据库垂直和水平拆分的问题

  • 水平分表场景解析

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引擎解决数据库垂直和水平拆分的问题

如果出现上图所示的结果就说明已经支持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’,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’,3306,”,’mysql’,”);

insert into mysql.servers(Server_name,Owner)values (‘backend2′,’10.128.128.88′,”);

创建完成后可以直接查询mysql.servers表,确认是否添加成功,如下截图所示:

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,

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,

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上?

测试完成后,不会导致后端DB Server上的表被删除.

c、建立range分区表

create table test_spider (

id int,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″‘) ;

创建之后,不会导致后端DB Server上的表被删除.

d、建立list分区表测试

create table test_spider (

id int,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″‘) ;

创建之后,不会导致后端DB Server上的表被删除.

四、性能测试

性能测试可以采用sysbench来测试,和MySQL单台以及后端挂多台DB的场景进行对比,确认Spider引擎的性能和优势,由于手头没有合适的设备这部分等以后有时间再进行测试,maria’DB的官网已经有对应的测试方法和结果,有兴趣的可以去https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/查阅.

文章来源微信公众号:DBAplus社群

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


起步 处理器架构,参考 x86是指intel的开发的一种32位指令集 intel和amd早期的cpu都支持这种指令集 AMD比Intel率先制造出了商用的兼容x86的CPU,AMD称之为AMD64 Intel选择了设计一种不兼容x86的全新64为指令集,称之为IA-64,后来支持AMD64的指令集,
pscp pscp -P 22 C:\work\test.txt root@192.168.1.5:/home/data pscp -P 22 root@192.168.1.5:/home/data/test.txt C://work// 检索 find / -name default.config
文件处理 ls -a # 显示所有文件 ls -l # 显示详细信息 ls -d # 显示路径 mkdir /目录名称 # 创建目录 cd /目录名称 # 切换目录 pwd # 显示当前路径 rmdir /目录名称 # 删除目录 cp -rp [目录名称] [目标目录] # 复制目录到目标目录 cp
准备一台电脑(我就用联想拯救者r7000演示) 参考博客制作启动盘 插上U盘,启动电脑,一直按F2 进入如下页面后,将U盘设置为第一启动项,点击exit,保存并退出 之后进入如下页面,选择第三项 进入如下页面,选择第四项 进入如下页面,选择第一项,选中后,先不要点Enter 按e键,将inst.st
认识 Linux系统是参考了UNIX系统作为模板开发的,但没有使用UNIX的代码;是UNIX的一种,但不是衍生版 在Linux内核的基础上开发是发行版 分区 逻辑分区永远从5开始 步骤 挂载:可理解为分配盘符,挂载点即是盘符名;不同之处:Linux中是以空目录名称作为盘符 Hda 第一块硬盘 Hda
文件处理命令 以 . 开头的文件是隐藏文件 以 - 开头表示这是一个文件 以 d 开头表示是一个目录 以 l 开头表示是一个软链接 第一个root是所有者,第二个root是所属组 ls -h 以文件默认大小后缀 显示 ls -i 查看i节点(唯一标识) 所有者:只能有一个,可变更 所属组:只能有一个
参考 01 02 03 前提环境 本地安装VirtualBox,并安装CentOS8,配置网络后,window系统上putty能连接到CentOS8服务器 配置步骤 右键服务器复制 启动复制后的服务器,查看ip和hostname发现和原来的服务器一样,需要修改 hostname # 查看主机名 vi
文件搜索命令 星号匹配任意字符,问号匹配任意单个字符 -iname 根据文件名查找且不区分大小写 -ok 命名会有一个询问的步骤 如果没有找到指定文件,可输入命令:updatedb 更新文件资料库;除tmp目录不在文件资料库收录范围之内 locate -i 文件名 # 检索时不区分大小写 which
安装环境 安装最新版的Virtual Box,点击安装 下载centos8镜像 创建虚拟机,可参考 选择下载到本地的镜像 设置启动顺序 点击启动 启动过程中报错:“FATAL:No bootable medium found!” 1.没有选择iso镜像 2.光驱没有排在第一位置 3.镜像只能选择x8
Linux严格区分大小写 所有内容文件形式保存,包括硬件 Linux不靠扩展名区分文件类型 挂载:将设备文件名和挂载点(盘符)连接的过程 Linux各个目录的作用 bin表示二进制 服务器注意事项 远程服务器不允许关机,只能重启 重启时应该关闭服务 不要在服务器访问高峰运行高负载命令 远程配置防火墙
IDE连接Linux,上传下载文件 参考1 参考2 连接Linux 上传下载文件 本地项目打包后上传 查看是否上传成功,右键下载 补充 后端项目开发完成后,需clean掉临时文件target文件夹,且只推送修改过的文件 前端项目开发的过程中,需要在每个子组件中使用scoped,确保每个子组件中的编码
起步 LTS与普通版本的区别 LTS版本的发布周期更长,更加稳定 安装jdk sudo mkdir /usr/lib/jvm # 在Ubuntu中创建目录 pscp D:\安装包\linux源码包\jdk-8u291-linux-x64.tar.gz chnq@192.168.0.102:/tmp
前言 最近在b站上看了兄弟连老师的Linux教程,非常适合入门:https://www.bilibili.com/video/BV1mW411i7Qf 看完后就自己来试着玩下,正好手上有台空闲的电脑就尝试不使用虚拟机的方式安装Linux系统 安装步骤 制作启动盘 下载ISO镜像,我这里下载的是Cen
新建虚拟电脑 设置内存和处理器 设置硬盘大小 完成 设置 查看光驱 设置启动顺序 点击启动 选择第1项 进入图形安装界面 选择安装位置,开始安装 设置root密码 重启 登录 查看本地文件夹 配置网络,点击设置 查看宿主机ip C:\Users\ychen λ ipconfig 无线局域网适配器 W
源码包安装需手动下载后安装 二进制包则在package目录下 rpm命令管理rpm包 若某个rpm包依赖于某个模块,需要到网站www.rpmfind.net查询该模块依赖的包,安装这个包后自动安装模块,之后就能安装rpm包了 安装升级时使用包全名 查询卸载时使用包名 虚拟机中的Linux系统安装rp
首先进入命令模式,再输入以下命令 命令模式用于输入命令 插入模式可对文件编写操作 编辑模式下的命令是在冒号后输入 :12, 15d # 删除指定范围的行,这里是删除12到15行 :n1,n2s/old/new/g ## 表示从n1行到n2行,old表示旧的字符串 vim使用小技巧:自定义快捷键,如快
使用源码包安装,需要自己指定安装位置,通常是 /usr/local/软件名/ linux中要想启动执行文件,应使用绝对路径 /绝对路径/rpm包名 start ## 执行方式一 service rpm包名 start ## 执行方式二 使用源码包安装后,由于自定义安装路径,就不能使用service命
网络命令 在收邮件的用户中,输入 mail 可查看邮件信息,输入序列号查看详细信息 在mail命令下,输入h 查看所有邮件的列表 输入:d 序列号 # 删除邮件 last # 统计所有用户登录或重启时间,用于日志查询 lastlog # 显示包括未登录用户的登录时间 lastlog -u 用户id
若要使用yum管理,必须能连接网络,首先配置网络IP 进入yum源文件中启动容器 使用yum源头安装rpm包不需要进入package路径,同时也不需要使用包全名,会有yum自动管理 安装软件组
简介 client即是本机安装的docker,相当于git Docker_host相当于centos系统 registry则是docker仓库,相当于GitHub 镜像用于创建docker容器,一个镜像可以创建多个docker容器 容器是由镜像创建的运行实例,(镜像相当于类,容器相当于类创建的对象)