打造扛得住的 MySQL 数据库架构

第1章 实例和故事

1-1 什么决定了电商双11大促的成败

电商公司的服务器能够承受住双十一期间高并发的访问量,为用户提供稳定高速的购物体验。

1-2 在双11大促中的数据库服务器

数据库架构:

  • 1 台 MySQL 主服务器
  • 15 台 MySQL 从服务器

当时没有部署主从复制组件,一旦主服务器出现故障,很难自动进行故障切换,必须由 DBA 进行手动操作。过多的从服务器,对主服务器的网卡容量也是一个不小的挑战。

数据库性能依据参数:

  • QPS
  • TPS
  • 并发量
  • CPU 使用率
  • 磁盘 IO

1-3 在大促中什么影响了数据库性能

影响数据库性能的因素

  • SQL 查询速度
  • 服务器硬件
  • 网卡流量
  • 磁盘 IO

数据库性能常见的风险:

  • 效率低下的 SQL
    • QPS:每秒钟处理的查询量
      • 10ms 处理 1个 SQL,1s 处理 100个 SQL,QPS <= 100
      • 100ms 处理 1个 SQL,1s 处理 10个 SQL,QPS <= 10
    • TPS:每秒钟处理的事务数
  • 大量的并发和超高的 CPU 使用率
    • 大量的并发会导致数据库连接数被占满
    • 超高的 CPU 使用率会导致服务器因 CPU 资源耗尽而出现宕机
  • 磁盘 IO
    • 磁盘 IO 性能突然下降(使用更快的磁盘设备)
    • 其它大量消耗磁盘性能的计划任务(调整计划任务,做好磁盘维护)
  • 网卡 IO
    • 当网卡 IO 被占满时,(千兆网卡 1000 Mb/8=100 MB)会出现无法连接数据库的情况。
    • 如何避免无法连接数据库的情况
      • 减少从服务器的数量
      • 进行分级缓存
      • 避免使用 select * 进行查询
      • 分离业务网络和服务器网络
  • 大表
    • 什么样的表可以称之为大表
      • 记录行数巨大,单表超过千万行
      • 表数据文件巨大,表数据文件超过 10 G
    • 大表对查询的影响
      • 慢查询:很难在一定的时间内过滤出所需要的数据
        • 区分度低的数据在查询的时候会产生大量的磁盘 IO,会降低磁盘的效率,导致查询效率低下,出现大量的慢查询。
    • 大表对 DDL 操作的影响
      • 建立索引需要很长的时间
        • MySQL 版本 < 5.5,建立索引会锁表
        • MySQL 版本 >= 5.5,虽然不会锁表但会引起主从延迟
      • 修改表结构需要长时间锁表
        • 会造成长时间的主从延迟
        • 影响正常的数据操作
    • 解决方案
      • 分库分表,把一张大表分成多个小表
        • 难点
          • 分表主键的选择
          • 分表后跨分区数据的查询和统计
      • 大表的历史数据归档(减少对前后端业务的影响)
        • 难点
          • 归档时间点的选择
          • 如何进行归档操作
  • 大事务
    • 事务的概念
      • 事务是数据库系统区别于其它一切文件系统的重要特性之一
      • 事务是一组具有原子性的 SQL 语句,或是一个独立的工作单元
    • 事务的特性
      • 原子性
        • 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败,对于一个事务来说,不可能只执行其中的一部分操作。
      • 一致性
        • 一致性是指事务将数据库从一种一致性状态转换到另外一种一致性状态。在事务开始之前和事务结束后,数据库中的数据完整性没有被破坏。
      • 隔离性
        • 隔离性要求一个事务对数据库中数据的修改,在未提交完成前对于其它事务是不可见的。
        • 隔离性的类型
          • 未提交读(Read Uncommited)
          • 已提交读(Read Commited)
          • 可重复读(Repeatable Read)
          • 可串行化(Serialization)
      • 持久性
        • 一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,已经提交的修改数据也不会丢失
    • 什么是大事务
      • 定义:运行时间比较长,操作的数据比较多的事务
      • 风险:
        • 锁定太多的数据,造成大量的阻塞和锁超时
        • 回滚时所需时间比较长
        • 执行时间长,容易造成主从延迟
      • 处理:
        • 避免一次处理太多的数据
        • 移出不必要在事务中的 SELECT 操作

第2章 什么影响了MySQL性能

第3章 MySQL基准测试

第4章 MySQL数据库结构优化

第5章 MySQL高可用架构设计

第6章 数据库索引优化

第7章 SQL查询优化

第8章 数据库的分库分表

第9章 数据库监控