【数据库】分库分表 & 数据库迁移
2. 数据库迁移1. 分库分表。
·
1. 分库分表
(1) 按范围拆分
比如将 ID1~1000W 的数据存放在第一个表或库中,或者将某个时间段的数据放在第一个表或库中。
问题:数据倾斜;未分担压力
(2) 哈希
将某个数据进行哈希后进行取模,然后映射到对应的库或表中,这个模就是库的个数或者表的个数,所以个数是固定的。
问题:需要扩容时会有数据迁移的问题,之前的数据全部都需要重新取模重新分配,不然就会查找不到了。
(3) 一致性哈希
将数据通过哈希映射到环上,将节点也通过哈希映射到换上。
插入或查找时,根据哈希值在这个环上顺时针找到第一个节点进行操作即可。
当节点数量改变时,只需要重新分配一小部分数据即可,从而降低数据迁移风险。
(4) 虚拟节点
当节点数量少时,会出现数据倾斜,导致计算出的哈希值总会落到一个节点上,节点负载不均衡。
解决方式:增加虚拟节点。
对每一个服务器节点计算多个哈希,每个计算结果位置都放置一个此服务节点。
增加左侧ABC三个虚拟节点:
2. 数据库迁移
(1) 原因
-
性能和高可用性需求:随着业务的发展,原有的数据库可能在性能和高可用性方面无法满足新的需求
-
产品服务需求:选择服务口碑更好的服务商
-
价格因素
-
其他技术需求:服务器或存储设备的更换、维护或升级,应用程序迁移,网站集成,灾难恢复和数据中心迁移等
(2) 迁移后的成本
-
数据库规模
-
对使用方的影响
-
人力、物力成本
-
数据损坏风险
(3) 迁移策略
- 双写机制
- 先改造数据写入端,使数据同时写入旧数据库和新数据库
- 对存量数据进行不停机的迁移
- 等到双写服务运行一段时间,再次进行旧数据和新数据的完全同步
- 完全切换读取的数据源为新数据库, 关闭旧数据库的写入和读取,下线旧数据库
适合业务要求高的事务型数据库。
- 渐进式双读
- 所有新写入的数据都完全写到新数据库
- 读取程序先读新数据库,新数据库中不存在的再读取老数据库, 如果老库存在就把老的库的数据迁移到新的数据库中
- 等到老的数据库中数据量变为0, 或者到达一个非常低的阈值, 就进行老数据库的完全迁移和下线
适合读取内容相对简单的k-v数据库。
更多推荐
已为社区贡献1条内容
所有评论(0)