作者:手机用户2502933795 | 来源:互联网 | 2023-09-24 09:51
本次目标:
全服不停机情况下在线扩容数据分库
不停机变更为
方案已有的基础:
具有分库信息登记表,应用启动过程已具备动态读取分库信息并建立动态数据源的能力,已实现分库
方案1:
1、运维人员准备数据库实例,克隆数据库模板,建立好分库
2、分库连接信息 配置到 数据库信息登记表中,状态为 未就绪(这就避免了此库被分配出去)
3、滚动重启全部应用容器(应用集群保证了客户端无感知),重启完毕后修改数据库列表为就绪状态,可以接收新数据
4、本方案关键在于 “滚动”两个字
方案2:
数据源列表里设计一个是否就绪的开关列,定时任务动态建立完毕连接池后,更改开关状态为就绪,开始接收新数据。
步骤:
1、zk上建立一个目录,应用启动后注册自己的ip信息和数据分库就绪【重启的都是就绪】的信息到目录下,为临时节点
2、运维人员准备数据库实例,克隆数据库模板,建立好分库
3、分库连接信息 配置到 数据分库信息注册表中,状态为 未就绪(这就避免了此库被分配出去),同时更新zk中所有应用节点为DB未就绪状态
4、应用层面的定时检测任务,发现列表中有待初始化的新数据库
5、定时任务初始化新数据源,添加到Spring动态数据源中
6、定时任务更新zk中自己所在应用的状态为DB连接池已就绪
7、BOSS系统定时任务检查ZK中所有应用的状态是否已完成变更,如果所有已就绪,则更新数据库列表新数据源为 已就绪 状态,开始接受新数据。
难点:
1、k8s中容器的数量很多,如何保证每个容器都准备就绪了?通过zk中登记的状态。
2、为了降低难度,在数据库扩容期间,k8s的容器不要进行扩容,要保持集群稳定状态。
3、步骤较多,为了防止人为出错,要开发相应的界面,按流程一步一步进行,每一步会自动检测是否就绪,上一步没有完成期间(系统定时检测或者按钮检测),无法进入到下一步的界面。
4、如果扩容期间,容器挂了又自动产生一个新的,这时候 新容器的状态是准备就绪状态