1. 扩容问题
项目初期,部署了数据库A及其从机A0,B及其从节点B0,为将数据平均分配,在service层,使用uid%2取模分片(可采用sharding JDBC),将数据分配到对应的数据库。如下图
随着用户量的增大,用户产生的数据量最终达到数据库的最佳存储容量,需要进行扩容,否则CRUD操作会变慢,影响服务的响应速度。
如何平滑的扩容,保证业务的连续性和高可用,对业务影响最小?
2. 解决方案
- 先把A0和B0升级为新的主库节点,如此,由2个分库变为4个分库。同时在上层的分片配置,做好映射,规则如下:
uid%4=0
的和uid%4=2
的数据分别分配到A和A0主库中uid%4=1
的和uid%4=3
的数据分别分配到B和B0主库中
- 由于A和A0库的数据相同,B和B0库的数据相同,此时无需数据迁移,只需调整分片配置即可,可通过配置中心更新,不需要重启。
3. 扩容之后旧数据有冗余,需要对冗余数据做清理
-- 针对A,去除%4!=0的
delete from user.userinfo where uid % 4 != 0;
-- 针对A0,去除%4!=2的
delete from user.userinfo where uid % 4 != 2;
-- 针对B,去除%4!=1的
delete from user.userinfo where uid % 4 != 1;
-- 针对B0,去除%4!=3的
delete from user.userinfo where uid % 4 != 3;
- 处理完成后,为保证数据高可用,需要再次为现有主库增加一个从库