场景假设
场景1:有两个分布在不通实例上的多张不通的表,想要通过某个字段关联,做一个统计,或者想将分布在不同实例的表,合并到一个实例中来做一些查询。
场景2:由于数据库容量的瓶颈或者是由于数据库访问性能的瓶颈,将一某一个大库、大表或者访问量非常大的表进行拆分,然后分布到不通的实例中。
简单来说就是水平、垂直拆分的场景
一、Spider引擎简介
1、什么是Spider引擎
Spider引擎是一个内置的支持数据分片特性的存储引擎,支持分区和XA事务,该引擎可以在服务器上建立和远程数据库表之间的链接,操作起来就像操作本地的表一样。并且对后台数据库的引擎没有任何限制。
目前spider引擎已经集成到了MariaDB中。
2、Spider架构图
3、Spider的优劣对比
优势分析
1.对业务完全透明,业务层不需要做任何的修改;对于分库和分表的操作业务层不需要关系,只需要通过spider作为代理入口,真实数据存储在哪台设备上,spider代理会自动进行路由。
2.方便横向扩展,能解决单台mysql的性能和存储瓶颈3
3.对后端的数据库引擎没有限制
4.实现垂直拆分和水平拆分功能,针对分表支持此哈希,范围,列表等算法
5.完全兼容mysql协议
劣势分析
1.Spider本身不支持缓存和全文搜索,只能在后端数据库实现全文搜索
2.Spider无法备份数据,只能对后端数据库做物理备份
3.Spider本身是单点的,无法做灾备,只能通过VIP方式自己实现啊
4.由于业务与数据库之间多了一层spider,在性能上多少会有些损耗
二、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 10.0.0.4版本开始,spider引擎就集成到了MariaDB中,集成后安装就非常的简单,安装步骤如下:
1、安装mariaDB到spider server以及后端多台DB server上;
安装方法非常简单,请参考:https://mariadb.com/kb/en/mariadb/getting-installing-and-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_link_failed_log
spider_link_mon_servers
spider_tables
spider_xa
spider_xa_failed_log
spider_xa_member
创建spider相关的表结构
加载spider引擎
2、使用
未完待续~~~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。