1. 分库分表

(1) 按范围拆分

比如将 ID1~1000W 的数据存放在第一个表或库中,或者将某个时间段的数据放在第一个表或库中。

问题:数据倾斜;未分担压力

(2) 哈希

将某个数据进行哈希后进行取模,然后映射到对应的库或表中,这个模就是库的个数或者表的个数,所以个数是固定的。

问题:需要扩容时会有数据迁移的问题,之前的数据全部都需要重新取模重新分配,不然就会查找不到了。

(3) 一致性哈希

将数据通过哈希映射到环上,将节点也通过哈希映射到换上。
插入或查找时,根据哈希值在这个环上顺时针找到第一个节点进行操作即可。
当节点数量改变时,只需要重新分配一小部分数据即可,从而降低数据迁移风险。

(4) 虚拟节点

当节点数量少时,会出现数据倾斜,导致计算出的哈希值总会落到一个节点上,节点负载不均衡。

解决方式:增加虚拟节点。

对每一个服务器节点计算多个哈希,每个计算结果位置都放置一个此服务节点。

增加左侧ABC三个虚拟节点:

2. 数据库迁移

(1) 原因

  • 性能和高可用性需求:随着业务的发展,原有的数据库可能在性能和高可用性方面无法满足新的需求
  • 产品服务需求:选择服务口碑更好的服务商
  • 价格因素
  • 其他技术需求:服务器或存储设备的更换、维护或升级,应用程序迁移,网站集成,灾难恢复和数据中心迁移等

(2) 迁移后的成本

  • 数据库规模
  • 对使用方的影响
  • 人力、物力成本
  • 数据损坏风险

(3) 迁移策略

- 双写机制
  • 先改造数据写入端,使数据同时写入旧数据库和新数据库
  • 对存量数据进行不停机的迁移
  • 等到双写服务运行一段时间,再次进行旧数据和新数据的完全同步
  • 完全切换读取的数据源为新数据库, 关闭旧数据库的写入和读取,下线旧数据库

适合业务要求高的事务型数据库。

- 渐进式双读
  • 所有新写入的数据都完全写到新数据库
  • 读取程序先读新数据库,新数据库中不存在的再读取老数据库, 如果老库存在就把老的库的数据迁移到新的数据库中
  • 等到老的数据库中数据量变为0, 或者到达一个非常低的阈值, 就进行老数据库的完全迁移和下线

适合读取内容相对简单的k-v数据库。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐