数据库高并发、高性能的基本保证--如何解决数据库超大容量不够问题

本章学习MySQL的可拓展性(容量和性能的拓展),首先介绍分区表的原理、特点和注意事项。然后学习分库分表的原理,重点学习MyCat的升级版:dble的安装与使用。让大家对MySQL分库分表的分类、目的、手段等有清晰的认识。

怎样最简单的扩展容量

  1. 什么是分区表
  • 将InnoDB的一个表分为多个表
  • server层依然看做一个表
  1. 指定分区位置

  2. 分区方式

  • 范围分区
  • hash分区
  • list分区
  1. 分区表的优势
  • 降低B+树的层级,搜索加速
  • 将一个数据表物理上分为多个文件,方便处理
  1. 分区表的缺陷
  • 第一次需要访问所有分区
  • 公用MDL锁
  • 分区之后,所有的分区依然位与同一节点
  1. 总结:
  • 分区表可以优化单节点容量,增强分区之间隔离
  • 第一次访问需要打开所有ibd,可能达到上限
  • 可以通过存储在不同的磁盘上,提高容量

为什么要分库分表

  1. 分表
  • 垂直:按照字段分表,一般分为冷热
  • 水平:按照行分表,常用范围、hash切分
  • 水平分表类似于分区表,不过server层也分了
  1. 垂直分表

  2. 水平分表

  3. 分库

  • 垂直:将数据表分散在多个数据库或者多个节点中
  • 水平:将数据表水平拆分,每个数据库结构相同
  1. 垂直分库

  2. 水平分库

  3. 分库分表的优点

  • 增加隔离性
  • 提升容量与并发性能
  • 水平分表类似于分区表,但是server层也分了
  1. 分库分表的缺点
  • 部分失效可能性成倍增加
  • 无法使用单点事务
  • 垂直切分后无法join
  • 范围查询困难
  1. 分库分表后的使用方法
  • 业务特殊处理
  • 业务应用使用中间层
  • 使用分库分表中间件
  1. 总结:
  • 分库分表可以提升数据库性能
  • 分库分表使得数据的使用方法更加复杂,数据丢失的可能性增加
  • 使用分库分表的中间件可以最大程度的方便客户端的使用

dble比MyCat强在哪里

  1. 分库分表中间件的原理
  • 分析sql语句
  • 根据sql语义,将sql拆分成多个,发送至数据节点
  • 将多个数据节点的结果聚集,返回给客户端
  1. dble
  • 高性能、高可用的mysql分库、分表中间件
  • 上海爱可生公司开发,国货之光
  • 完全开源
  • 基于开源项目MyCat
  1. dble架构设计

  2. dble对MyCat做的增强

  • 缺陷修复
  • 实现改进
  • 功能增强
  • 功能裁减
  • 解除异构数据库的支持
  1. dble的基础概念
  • schema: 虚拟数据库(不同于传统的schema)
  • shardingTable: 虚拟表(被拆分的表)
  • shardingNode: 虚拟节点
  • dbGroup: 实际的mysql集群
  • database: 实际的database
  1. dble表拆分图示

  2. dble表的类型

  • 全局表:每个节点上有保存表的完整数据
  • 拆分表:被拆分的表,保存到不同的节点上
  • 非拆分表:不拆分的表,存在单一节点
  1. 总结
  • dble是一个高性能、易用的分库分表中间件
  • dble对MyCat做了增强
  • dble在功能上以水平分表为主

如何安装dble

  1. dble最简运行环境搭建

  2. 安装部署使用dble方法,参考
    docker-compose部署

怎样提高分库分表架构的可靠性

  1. 复制与分库分表架构的结合

  2. 使用dble进行读写分离的配置-1

  • dble分析sql语义
  • 将写语句发送给主节点
  • 将读语句发送给从节点
  1. 使用dble进行读写分离的配置-2
  • rwSplitMode=0 直接分发到主实例(读写不分离)
  • rwSplitMode=1 读操作必须在所有从实例中均衡
  • rwSplitMode=2 读操作在所有实例中均衡
  • rwSplitMode=3 读操作尽量在所有从实例中均衡
  1. 使用dble进行读写分离后的架构

    [docker-compose部署](https://github.com/actiontech/dble/tree/master/docker-images/rwSplit)

  2. 总结

  • 复制可以提高分库分表架构下的数据可靠性
  • dble可以基于sql语义进行分库分表的转发

分库分表之后性能反而下降,怎么办?

  1. 查询语句中尽可能带有拆分字段
  • dble根据拆分字段,判断数据在哪个节点
  • 若无法判断数据节点,只能遍历全部数据节点
  1. 插入语句必须带有拆分字段
  • dble根据拆分字段,判断数据在哪个节点
  • 新数据若无拆分字段,无法插入
  1. 拆分字段尽量等值
  • 范围拆分字段会扫描过多节点
  • 若使用in子句,缩减in子句值的数量
  1. 减少表的搜索遍历
  • 不带拆分字段时
  • distinct group_by order_by
  • 尽量少出现,不要大于一种
  1. 减小结果集
  • 分布式系统中,节点间有大量的数据交互
  • 数据交互会影响查询性能
  • 过大的结果集会增大数据汇集的网络交互量
  1. 跨节点连表
  • 经常join的表,使用相同的拆分规则
  • 使用拆分字段作为join条件
  • 尽量对驱动表添加更多的过滤条件
  • 尽量少使用跨节点的分页、排序等功能
  • 复杂语句拆分成多条语句
  1. 总结
  • 数据的增删改查尽量带有拆分字段
  • 尽量减少数据节点之间的数据交互,将sql直接转发
  • 尽量将连接键作为拆分字段

本章小结

  1. 分区表
  • 分区表可以优化单节点性能,分区之间隔离
  • 第一次访问需要打开所有ibd, 可能达到上限
  • 可以通过存储在不同的磁盘上,提高容量
  1. 分库分表的意义
  • 分库分表可以提升数据库性能
  • 分库分表使得数据的使用方法更加复杂,数据丢失的可能性增加
  • 使用分库分表的中间件更方便的客户端调用
  1. dble
  • dble是一个高性能、易用的分库分表中间件
  • dble基于MyCat, 并做了改进
  • dble在功能上以水平分表为主
  1. 复制与分库分表架构的结合

    dble分库分表+主从架构

  2. 分库分表的查询性能优化

  • 所有的sql语句尽量带有拆分字段,因为dble的数据表是按照拆分字段进行拆分的
  • 尽量减少节点间数据的交互,将sql直接转发
  • 尽量将连接键作为拆分字段
posted @ 2022-04-05 16:21  专职  阅读(419)  评论(0编辑  收藏  举报