MySQL分表分库学习

一、写在前面

为什么要进行数据切分:

随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性扩展性造成了极大的问题。通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。

数据库优化的策略

  • 水平切分数据库,可以降低单台机器的负载,同时最大限度的降低了了宕机造成的损失。
  • 通过负载均衡策略,有效的降低了单台机器的访问负载,降低了宕机的可能性;
  • 通过集群方案,解决了数据库宕机带来的单点数据库不能访问的问题;
  • 通过读写分离策略更是最大限度了提高了应用中读取(Read)数据的速度和并发量。

 

二、MySQL分库分表方案

1、利用merge存储引擎来实现分表(水平分表)

  • merge引擎实现MySQL分表,这种方法比较适用于没有事先考虑分表,而随着数据量增大,查询速度减慢的情况

  • merge的要求:

    • 合并的表使用的必须是MyISAM引擎
    • 表的结构必须一致,包括索引、字段类型、引擎和字符集
  • 示例

image

 

2、简单的MySQL主从复制

  • MySQL的主从复制解决了数据库的读写分离,并很好的提升了读的性能

    • 主数据库负责写,从数据库负责读,主库写入数据后会同步到从库 image
  • 仍存在的问题:

    • 写入无法扩展缓存
    • 主从的数据复制存在延迟
    • 锁表率上升
    • 表变大,缓存率下降

 

3、MySQL垂直分区

  • 如果业务足够独立,可以将不同业务的数据垂直切割到不同的数据库,起到负载分流的作用,大大提升了数据库的吞吐能力,垂直切割如下图 image

 

4、MySQL水平分片(sharding)

  • 切片方式:
    • 物理切片:通过路由规则访问特定的数据库
    • 数据切片: 对数据进行一系列的切分规则,将数据分布到数据库的不同表中

 

  • 基于水平分片的三种分库方式和规则
    • 按号段分:如user_id的1~1000对应DB1,1001~200对应DB2…

      • 优点:可迁移部分数据
      • 缺点:数据分布不均匀
    • hash取摸分:对user_id的哈希进行取模(如hash(user_id) % n),n为要分的数据库数量

      • 优点:数据分布均匀
      • 缺点:数据迁移的时候比较麻烦,不能按机器性能分摊数据
    • 在认证库中保存数据库配置:建立一个DB,这个DB单独保存user_id到数据库的映射关系,每次访问的时候都先查询下认证库,从而得到user_id存储的DB信息。

      • 优点:灵活性强,一对一的关系
      • 缺点:每次查询都需要先进行一次查询,性能大打折扣

 

  • 分布式数据方案提供功能如下

    1. 提供分库规则路由规则(RouteRule简称RR),可将上面提供的三种分片规则直接内嵌入系统。
    2. 引入集群(Group)概念,保证数据的高可用性。
    3. 引入负载均衡策略(LocalBalancePollcy,简称LB)
    4. 引入集群节点可用性探测机制,对单点机器的可用性进行定时的定制,以保障LB策略的正确实施,确保系统的高度稳定性
    5. 引入读写分离,提高数据的查询速度

 

  • 哈希取模分片简介

    • 将用户按照一定的规则**(按ID哈希)分组,并把该用户的数据存储到一个数据库分片**中,即一个sharding,随着用户的增加,只需要简单的配置一台服务器即可。原理如下图: image

    • 获取分片存储的信息如下(先创建一张用户和shard对应的数据表,用于查找用户的shard id,再从对应shard id查找相关数据): image

 

5、对冷热数据的处理

  • 举例:在一个博客系统中,文章标题,作者,分类,创建时间等,是变化频率慢,查询次数多,而且最好有很好的实时性的数据,我们把它叫做冷数据。而博客的浏览量,回复数等,类似的统计信息,或者别的变化频率比较高的数据,我们把它叫做活跃数据

  • 处理方法:

    • 存储引擎的使用不同,冷数据使用MyIsam可以有更好的查询数据。活跃数据,可以使用Innodb ,可以有更好的更新速度。
    • 对冷数据进行更多的从库配置,因为更多的操作是查询,这样来加快查询速度。对热数据,可以相对有更多的主库的横向分表处理。
    • 对于一些特殊的活跃数据,也可以考虑使用memcache,redis之类的缓存,等累计到一定量再去更新数据库

 

参考