清水泥沙

MySql(高可用,高拓展)

* 分区表原理

  • 工作原理

    对用户而言,分区表是一个独立的逻辑表,mysql底层将其分成了多个物理子表,每一个分区表都是一个独立的文件

  • 适用场景

    • 表非常大,无法全部存放在内存中,或者表的最后有热点数据,其他的都是历史数据
    • 分区表更容易维护,可以对独立的分区进行操作
    • 分区表可以分布在不同的服务器上
    • 可以使用分区表避免某些特殊的瓶颈
    • 可以恢复和备份独立的分区
  • 限制

    • 一个表只能有1024个分区
    • 5.1版本中,分区表达式必须是整数
    • 分区表字段中如果包含主键和唯一所以,那么主键和唯一列必须包含进去
    • 分区表中不能使用外键约束
    • 如果需要对现有表进行修改
    • 所有分区表虚使用相同的存储引擎
    • 某些引擎不支持分区

分库分表

  • 工作原理
    • 通过一些hash算法和工具实现将一张表的数据,垂直拆分和水平拆分
  • 使用场景
    • 单表记录数到达百万或者千万级别时候
    • 解决表锁的问题
  • 分表方式
    • 水平分割
      • 表很大,分割后降低在查询时候所需要读取的数据和索引的页数
        • 使用场景
          • 表中的数据具有独立性,比如说表中记录各个地区的数据或者不同时期的数据
          • 需要把不同的数据存放在不同的介质
      • 缺点
        • 给应用增加复杂度,查询某些数据的时候需要定位到数据在某张表
    • 垂直分割
      • 将数据表的列进行分割,常用的列和不常用的列拆分成两个表
        • 使用场景
          • 一个表中一些列不常用,列外一些列常用
          • 可以使数据行变小,一个数据也能存储更多的数据,查询时候减少IO次数
        • 缺点
          • 查询冗余,查询需要进行join操作

mysql主从复制

  • 工作原理
    • 在主库上把数据更改记录到二进制文件,从库将 主库的日志复制到自己的中继日志当中。从库读取日志,将数据重写到从库数据当中。
  • 主从复制解决的问题
    • 数据分布:随意停止或开始复制
    • 负载均衡:降低单个服务器压力
    • 高可用和故障切换:某个节点失败后其他节点顶替其工作,避免程序崩溃
  • 异步复制:也是默认的主从同步方式。这种方式的优点是效率高。缺点是不能保证数据一定会到达slave。可能会受到网络等原因出现延迟,导致主从数据不一致。当前对master中的表进行数据操作,master将事务Binlog事件写入到Binlog文件中,此时主库只会通知一下Dump线程发送这些新的Binlog到slave(slave的 I/O 线程读取并将事件写入relay-log中)然后主库就会继续处理提交操作,而此时不会保证这些Binlog传到任何一个从库节点上。
  • 全同步复制:优点是能够保证数据的强一致性,缺点是效率太低。当master上有提交事务之后,Dump线程发送这些新的Binlog到slave上,并且必须等待所有的slave回复成功(所有从库将事件写入中继日志,并将数据写入数据库)才能继续下一步操作。
  • 半同步复制:优点是在耗费少量性能的基础上能在一定程度上保证数据的一致性。当master上有提交事务之后,Dump线程发送这些新的Binlog到slave上,并且必须等待其中一个slave回复成功(slave将事件写入relay-log)才能继续下一步操作。