微信号:imooc-com

介绍:慕课网是一个超酷的互联网、IT技术免费学习平台,创新的网络一站式学习、实践体验;服务及时贴心,内容专业、有趣易学。专注服务互联网工程师快速成为技术高手!

「去哪儿网」技术大咖:关于高并发场景下转移表的处理过程的探讨

2018-09-13 07:45 _Jimin_




前提



技术调整,现在需要将表A从数据库B转移到数据库C里,成为新表D。


这篇文章主要是分享一下我们的方案




详细方案


1、调研(通过监控等,多个系统有使用)整理出所有涉及表A的SQL


2、新库上创建新表


3、在原有相关方法上添加开关,允许:


1)更新操作-同时更新(包括写)表A和表D
2)更新操作-只更新(包括写)表A
3)更新操作-只更新(包括写)表D
4)查询操作-单独查表A
5)查询操作-单独查表D
6)查询操作-同时查表A和表D记录不一致情况


这里需要注意,同一个方法可能要使用多个开关,多个开关不能有更新顺序问题。


4、刚开始上线时,开关控制只操作表A,不去操作表D


5、都发布上线完毕后(比如我们集群有几百台机器,不能让部分单写部分双写,否则表D数据是否哪个点开始应该算起就模糊了),开关调整为双写


6、之后根据需要导入原有的数据(某些场景特殊一点,只会差最近一天或几天,保证双写持续指定天数,新表可能已经覆盖所有数据,就不需要导数据了)


7、当表D按照设计和计划已经应该有需要使用的数据时,打开双写检查,对比,有问题的地方调整,直到没有不一致。


8、之后就剩删除之前操作表A的代码了。


这里我们在讨论时打成了一个共识,所有在涉及到调整的地方都要用到开关,所有开关都记录到一个新文件里,这样在删除老代码时直接通过新文件去查找,这种代价是最小的,也不容易出错。很多技术升级都会忽略掉删除老代码或过渡期代码,导致许多走不到的逻辑一直堆在那里,之后每次修改到这里都要浪费不少时间,后来的人需要不断的思考当时这里这样写是为什么,很少会晓得许多代码本来是不该存在的。


9、表A没使用时不能直接drop掉,而是先进行rename,这样一旦之前改的不全,可以迅速rename回来,确认没影响,再找个时间单独处理掉。这也是一个提醒,许多操作都要想好如何回滚,尽量给自己一个可以吃后悔药的机会。



注意


如果能短时间停掉流量,会容易很多。但是我们通常不会轻易的停流量在做这种事情,而是尽量做到无感知的调整。


这个在做很多技术升级时都要考虑,有时也容易忽略发布过程中带来的一些影响。尤其是我们发布要求先灰度发布几台来观察,之后再全量发布,而且不允许在高峰期发布,不允许在周五发布等等,因此一次完整的发布过程可能要跨越好几天。



作者介绍


作者:_Jimin_ ,美股行情中心技术负责人,去哪儿网业务线负责人,首届Hackathon大赛一等奖获得者,7年Java开发经验喜欢架构及性能优化,录制Java并发编程入门与高并发面试, 帮助了很多用户面试成功



因为相关规范,iOS用户无法在小程序下单,故移步到 这里





 面试并发类问题的准备和学习
Spring Cloud在国内中小型公司能用起来吗?
@程序员,面试必懂的套路







 
慕课网 更多文章 我是怎么把一个项目带崩的 “职业程序员”不必那么“职业” 如影随形的设计模式与现实世界 作为50 岁的开发者,面对被裁的命运,我如何绝地求生? @程序员,面试必懂的套路,看完整个人通透多了
猜您喜欢 TiDB 源码阅读系列文章(十)Chunk 和执行框架简介 不甘平凡?那么欢迎你加入这个非凡的团队 他们造了这些没用的玩意儿,我们还挺喜欢的 [连载] 途客们的旅行梦 - Cayman项目 【译】S.O.L.I.D 原则在 Go 中的应用(下)