数据库分片策略

分片概念

分片(SHarding)就是用来确定数据在多台存储设备上分布的技术。Shard这个词的意思是“碎片”,如果将一个数据库当做一块大玻璃,将这块玻璃打碎,那么没一小块都成为数据库的碎片(Database Sharding)。将一个数据库打碎成多个的过程就叫做分片,分片是属于横向扩容方案。

数据库扩展方案:

横向扩展:一个库变成多个库,加机器数量

纵向扩展:一个库还是一个库,优化及其性能,加高配CPU或内存

在分布式存储系统中,数据需要分散存储在多台设备上,分片就是把数据库横向扩展到多个数据库服务器上的一种有效方式,器主要作用就是为了突破单节点数据库服务器的IO能力限制,常用规则有以下几种。

基于范围的分片

根据特定字段的范围进行拆分,比如用户ID、订单时间、产品价格等。

优点:新的数据可以落在新的存储节点上,如果数据库扩容,数据无需迁移。

缺点:数据热点分布不均匀,数据冷热不均匀,导致节点符合不均。

哈希取模分片

整形的Key可直接对设备数量取模,其他类型的字段可以进先计算Key的哈细致,然后再对设备数量取模。假设有n台设备,编号为0-n-1,通过Hash(Key)%n就可以确定数据所在的设备编号。该模式也成为离散分片。

有点:实现简单,数据分配比较均匀,不容易出现冷热不均,负荷不均的情况。

缺点:扩容时会产生大量的数据迁移,比如从n台设备扩容到n+1,绝大部分数据需要重新分配和迁移。

一致性哈希分片

 采用环形Hash取模的方式进行拆分,后期集群需要迁移数据的时候可以很方便的进行扩容。一致性Hash在增加或者删除节点的时候,受到影响的数据比较有限,只会影响到Hash环相邻的节点,不会发生大规模的数据迁移。

扩容方案

当系统用户进入了高速增长期时,即便是对数据进行分表分库,但数据库的容量,还有表的数据量也总会达到天花板。当现有数据库达到承受极限时,就需要增加新服务器节点数量进行横向扩容。

面临的挑战有:

  • 数据迁移问题
  • 分片规则改变
  • 数据同步、时间点、数据一致性

停机扩容

这是一种很多人初期都会使用的方案,尤其是初期只有几台服务器的时候。停机扩容的具体步骤如下:

  • 站点发布一个公告,例如:“为了为广大用户提供更好的服务,本站点将在今晚00:00-2:00之间升级,给您带来不便抱歉”。
  • 时间到了,停止所有对外部务。
  • 新增n个数据库,然后写一个数据迁移程序,将原有x个库的数据导入到最新的y个库中。比如分片规则按照由%x变成%y。
  • 数据迁移完成,修改数据库服务配置,原来x个库的配置升级为y个库的配置。
  • 重启服务,链接新的数据库对外提供服务。

优点:简单

缺点:

  • 停止服务,缺乏高可用
  • 程序员压力大,需要在指定时间完成
  • 如果有问题没有及时测试出来启动了服务,运行后发现问题,数据会丢失一部分,难以回滚。

适用场景:

  • 小型网站
  • 大部分游戏公司
  • 对高可用要求不高的服务

平滑扩容

数据库扩容的过程中,如果想要持续对外提供服务,保证服务的可用性,平滑扩容方案是最好的选择。平滑扩容就是将数据库数量扩容成原来的2倍。比如由2个升级成4个,具体步骤如下:

新增2个数据库。

配置双主进行数据同步(先测试,后上线,重启服务器时间是秒级)

数据同步完成之后,断开双主同步,修改数据库配置并重启;

此时已经扩容完成,但此时的数据并没有减少,新增的数据库根旧的数据库一样多的数据,此时还需要写一个程序,清空数据库多余的数据,如:

  • A库删除uid%4=2的数据
  • B库删除uid%4=0的数据
  • C库删除uid%4=3的数据
  • D库删除uid%4=1的数据

优点:

  • 扩容期间服务可以正常运行
  • 扩容时间更加自由(不需要凌晨加班)
  • 扩容期间,由于新的库并未提供服务,可以随时调整
  • 可以将数据库的数据量减少一半

缺点:

  • 程序复杂度高,配置双主同步,双主双写,检测数据同步等。
  • 后期数据库数量大的,2倍扩容成本较高。

适用场景:

  • 大型网站
  • 对高可用要求高的服务


版权声明:本文为qq_26375325原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。