数据库高并发、高性能的基本保证--如何解决数据库超大容量不够问题
本章学习MySQL的可拓展性(容量和性能的拓展),首先介绍分区表的原理、特点和注意事项。然后学习分库分表的原理,重点学习MyCat的升级版:dble的安装与使用。让大家对MySQL分库分表的分类、目的、手段等有清晰的认识。
怎样最简单的扩展容量
- 什么是分区表
- 将InnoDB的一个表分为多个表
- server层依然看做一个表
-
指定分区位置
-
分区方式
- 范围分区
- hash分区
- list分区
- 分区表的优势
- 降低B+树的层级,搜索加速
- 将一个数据表物理上分为多个文件,方便处理
- 分区表的缺陷
- 第一次需要访问所有分区
- 公用MDL锁
- 分区之后,所有的分区依然位与同一节点
- 总结:
- 分区表可以优化单节点容量,增强分区之间隔离
- 第一次访问需要打开所有ibd,可能达到上限
- 可以通过存储在不同的磁盘上,提高容量
为什么要分库分表
- 分表
- 垂直:按照字段分表,一般分为冷热
- 水平:按照行分表,常用范围、hash切分
- 水平分表类似于分区表,不过server层也分了
-
垂直分表
-
水平分表
-
分库
- 垂直:将数据表分散在多个数据库或者多个节点中
- 水平:将数据表水平拆分,每个数据库结构相同
-
垂直分库
-
水平分库
-
分库分表的优点
- 增加隔离性
- 提升容量与并发性能
- 水平分表类似于分区表,但是server层也分了
- 分库分表的缺点
- 部分失效可能性成倍增加
- 无法使用单点事务
- 垂直切分后无法join
- 范围查询困难
- 分库分表后的使用方法
- 业务特殊处理
- 业务应用使用中间层
- 使用分库分表中间件
- 总结:
- 分库分表可以提升数据库性能
- 分库分表使得数据的使用方法更加复杂,数据丢失的可能性增加
- 使用分库分表的中间件可以最大程度的方便客户端的使用
dble比MyCat强在哪里
- 分库分表中间件的原理
- 分析sql语句
- 根据sql语义,将sql拆分成多个,发送至数据节点
- 将多个数据节点的结果聚集,返回给客户端
- dble
- 高性能、高可用的mysql分库、分表中间件
- 上海爱可生公司开发,国货之光
- 完全开源
- 基于开源项目MyCat
-
dble架构设计
-
dble对MyCat做的增强
- 缺陷修复
- 实现改进
- 功能增强
- 功能裁减
- 解除异构数据库的支持
- dble的基础概念
- schema: 虚拟数据库(不同于传统的schema)
- shardingTable: 虚拟表(被拆分的表)
- shardingNode: 虚拟节点
- dbGroup: 实际的mysql集群
- database: 实际的database
-
dble表拆分图示
-
dble表的类型
- 全局表:每个节点上有保存表的完整数据
- 拆分表:被拆分的表,保存到不同的节点上
- 非拆分表:不拆分的表,存在单一节点
- 总结
- dble是一个高性能、易用的分库分表中间件
- dble对MyCat做了增强
- dble在功能上以水平分表为主
如何安装dble
-
dble最简运行环境搭建
-
安装部署使用dble方法,参考
docker-compose部署
怎样提高分库分表架构的可靠性
-
复制与分库分表架构的结合
-
使用dble进行读写分离的配置-1
- dble分析sql语义
- 将写语句发送给主节点
- 将读语句发送给从节点
- 使用dble进行读写分离的配置-2
- rwSplitMode=0 直接分发到主实例(读写不分离)
- rwSplitMode=1 读操作必须在所有从实例中均衡
- rwSplitMode=2 读操作在所有实例中均衡
- rwSplitMode=3 读操作尽量在所有从实例中均衡
-
使用dble进行读写分离后的架构
[docker-compose部署](https://github.com/actiontech/dble/tree/master/docker-images/rwSplit) -
总结
- 复制可以提高分库分表架构下的数据可靠性
- dble可以基于sql语义进行分库分表的转发
分库分表之后性能反而下降,怎么办?
- 查询语句中尽可能带有拆分字段
- dble根据拆分字段,判断数据在哪个节点
- 若无法判断数据节点,只能遍历全部数据节点
- 插入语句必须带有拆分字段
- dble根据拆分字段,判断数据在哪个节点
- 新数据若无拆分字段,无法插入
- 拆分字段尽量等值
- 范围拆分字段会扫描过多节点
- 若使用in子句,缩减in子句值的数量
- 减少表的搜索遍历
- 不带拆分字段时
- distinct group_by order_by
- 尽量少出现,不要大于一种
- 减小结果集
- 分布式系统中,节点间有大量的数据交互
- 数据交互会影响查询性能
- 过大的结果集会增大数据汇集的网络交互量
- 跨节点连表
- 经常join的表,使用相同的拆分规则
- 使用拆分字段作为join条件
- 尽量对驱动表添加更多的过滤条件
- 尽量少使用跨节点的分页、排序等功能
- 复杂语句拆分成多条语句
- 总结
- 数据的增删改查尽量带有拆分字段
- 尽量减少数据节点之间的数据交互,将sql直接转发
- 尽量将连接键作为拆分字段
本章小结
- 分区表
- 分区表可以优化单节点性能,分区之间隔离
- 第一次访问需要打开所有ibd, 可能达到上限
- 可以通过存储在不同的磁盘上,提高容量
- 分库分表的意义
- 分库分表可以提升数据库性能
- 分库分表使得数据的使用方法更加复杂,数据丢失的可能性增加
- 使用分库分表的中间件更方便的客户端调用
- dble
- dble是一个高性能、易用的分库分表中间件
- dble基于MyCat, 并做了改进
- dble在功能上以水平分表为主
-
复制与分库分表架构的结合
dble分库分表+主从架构 -
分库分表的查询性能优化
- 所有的sql语句尽量带有拆分字段,因为dble的数据表是按照拆分字段进行拆分的
- 尽量减少节点间数据的交互,将sql直接转发
- 尽量将连接键作为拆分字段