mysql和redis平滑切写

上百个存储资源上云时碰到一个棘手问题,如何平滑地切写?

通常切写可以通过dba改dns(+强制read only)或 业务改配置,但会产生一些问题,如:连接异常断开、部分数据 旧主→新主 同步冲突/失败、数据丢失等异常,归根结底是这些方式不够平滑,dns在各机房生效有时差、业务各进程还可能会缓存dns解析结果、业务内部长连接无法优雅断开

引入中间件又会增加运维复杂度,多一层故障源。运维层面没有提供解决方案,那只能业务自己来想法办

所以实现了这个平滑切写模块,平滑切master的要点是:定时切配置,切换过程“卡”住几百ms。

 

步骤1:做级联同步,写老读新

A1是老master,A2是新master,由域名指向得知,目前状态是写老master,读新slave

 

步骤2:配置定时切

将新配置混合老配置文件发布到生产环境,在配置里(也可以做成后台控制)设定好切写时间点

到时间点的时候所有写请求卡住几百ms,getPDO()方法里写好逻辑注销旧连接(A1),重新连接DB(得到A2)

新配置可以临时使用IP直连也可以启用新域名,只要让A2与A1的host不一样即可

 

步骤3:下线旧master和slave

切写完成,删除无用配置,规范master的host。安全下车

 

 

关于卡住几百ms的设定有2个好处:

1、最大限度兼顾机房机器间微小时差,卡顿期间留下write空窗期

2、给A1同步数据到A2留下足够的时间窗口

所以具体需要卡几百ms由最懂业务的你来决定,建议500ms左右,这样即对用户影响比较小,也能保证时间窗口足够

 

这套逻辑实践在上百个资源切写中完美平滑完成任务

 

 

 

 

发表评论

邮箱地址不会被公开。 必填项已用*标注