实战分布式数据库
2017-11-07
先来说两个DBA经常遇到的场景。
场景1:有两个分布在不同实例的多张不通的表,想要通过某字段关联做统计,或者想将分布在不同实例的表合并到一个实例中做查询。
场景2:由于数据库容量瓶颈或数据库访问性能瓶颈,将某大库、大表或访问量大的表进行拆分,再分布到不同实例中。
这两种场景覆盖了垂直拆分和水平拆分,笔者想到的解决办法可能有使用数据库中间件,使用MySQL分区表,使用Galera Cluster for MySQL,使 用 MySQL的 多源复制,使用federated,使用MySQL Sharding和Spider。本文就是基于Spider的分布式数据库解决方案,下面详细介绍一下。
图1 spider架构图
图2 垂直分表场景图
图3 水平分表场景图
Spider引擎简介
1.Spider引擎是什么
Spider引擎是一个内置的支持数据分片特性的存储引擎,支持分区和XA事务,该引擎可以在服务器上建立和远程服务器表之间的链接,操作起来就像操作本地的表一样。并且后端可以是任何的存储引擎。
Spider引擎根据表的设置的规则以及Server表的规则自动进行智能路由,实现对后端数据库不通的表或者数据分片的访问和修改。因此该引擎对业务是完全透明的。
目前Spider引擎已经集成到了MariaDB中,安装使用非常方面,目前最新的版本是Spider 3.2.37。更多信息可以访 问 :https://mariadb.com/kb/en/mariadb/spider-storage-engineoverview/。
2.Spider架构图
Spider架构图如图1。
Spider的使用场景解析
1.垂直分表的场景和解析
如图2所示,Spider后面接4台DB Server,可将不同功能的表分布到后端不同的DB Server中,比如user_info的表专门存放在HostA中,user_msg表 存 放 在HostB中,user_detail表存 放 在 HostC中,user_log表存放在HostD中。
当我们执行HostA的SQL的时候,Spider会通过user_info表的映射关系以及HostA的IP映射关系,将查询user_info表的请求都转发到HostA上,HostA查询完成后再将结果发给Spider服务器,Spider再转发给客户端。
2.水平分表的场景和解析
Spider支持多种水平分表的模式,目前支持hash分表(hash)、范围分表(range)、列表分表(list),笔者用range来说明水平分表的工作原理。
如 图3所 示,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再将结果转发给发起请求的客户端。
图4 安装成功
图5 部署拓扑图
Spider的安装部署
从Spider 10.0.0.4版本开始,Spider引擎就集成到了MariaDB中,集成后安装就非常的简单,安装步骤如下:
1.安 装mariaDB到Spider server以及后端多台DB server上
安装方法非常简单,这里不在赘述,具体可以参考:https://mariadb.com/kb/en/mariadb/getting-installingand-upgrading-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相关的表结构,加载Spider引擎
3.检查Spider引擎是否安装成功
如果出现图4所示的结果就说明已经支持了Spider引擎。
Spider的使用实战
本实践环境基于tspider-1.8.5环境全部验证通过。
1.Spider实战拓扑图
在实战部分,笔者使用了2台DB Server,部署图如图5所示。
2.实战前准备
首先,创建Spider Server访问后端DB Server的权限(后面配置中需要用到)。
grantallon*.* tospider_d b_all@'10.128.128.91'identified by 'tospider_db_all';
其次,创建Spider后端DB Server的配置。可以通过执行如下SQL的形式直接创建。
createserver backend1 foreign data wrapper mysql options(host '10.128.128.60',database 'test', user'spider_db_all', password'spider_db_all', port 3306);
createserver backend2 foreign data wrapper mysql options(host '10.128.128.88',database'test',user'spider_db_all',password'spider_db_all',port 3306);
图6 查询mysql.servers表
也可以通过直接给mysql.servers表中直接插入相关的记录,不过后面执行flush hosts才能生效。
insert into mysql.servers(Server_name,Host,Db,Username,Password,Po rt,Socket,Wrapper,Owner)values('backend1','10.1 28.128.60','test','spid er_db_all','spider_db_al l',3306,'','mysql','');
insert into mysql.servers(Server_name,Host,Db,Username,Password,Po rt,Socket,Wrapper,Owner)values ('backend2','10.1 28.128.88','test','spid er_db_all','spider_db_al l',3306,'','mysql','');
创建完成后可以直接查询mysql.servers表,确认是否添加成功,如图6所示。
然后,创建基础测试表。
在后端两台DB Server上创建基础测试表(在60和88上执行)。
3.Spider引擎实战
首先,建立垂直表(远程表进行测试)。
创建之后,执行对应增删改查,看看是否对应的操作都发生在了backend1对应的DB Server上。
测试完成后,删除掉Spider 服务器上的test_spider表,你会发现drop掉Spider上的表,不会导致后端DB Server上的表被删除。
其次,建立hash分区表。
创建之后,执行对应增删改查,看看是否对应的操作都发生在了backend1和backend2对应的DB Server上。
测试完成后,删除掉Spider服务器上的test_spider表,你会发现drop掉Spider上的表,不会导致后端DB Server上的表被删除。
然后,建立range分区表。
创建之后,执行对应增删改查,看看是否对应的操作都发生在了backend1和backend2对应的DB Server上。
测试完成后,删除掉Spider服务器上的test_spider表,你会发现drop掉Spider上的表,不会导致后端DB Server上的表被删除。
最后,建立list分区表测试。
创建之后,执行对应增删改查,看看是否对应的操作都发生在了backend1和backend2对应的DB Server上。
测试完成以后,删除掉Spider 服务器上的test_spider表,那么你会发现drop掉Spider上的表,不会导致后端DB Server上的表被删除。