背景:公司某一机房须要裁撤,涉及到大量DB服务器,须要在裁撤截止日期之前完成业务的平滑迁移和设备退还工做。mysql
历时2个多月,经历了设备梳理、裁撤资源评估、裁撤资源申请、裁撤DB部署、裁撤DB业务关系梳理、裁撤DB合并协调、裁撤DB数据迁移、裁撤DB切换、设备下架和退还等流程后,终于将组内涉及到的DB都裁撤完成。裁撤期间遇到不少问题,总结一下,但愿对你们有帮助。linux
1、裁撤遇到的问题sql
一、存在着很老的版本好比4.一、5.5的版本数据库
二、表字段使用系统关键字带来的兼容性问题安全
三、表没有主键,致使从机有的时候延迟很大(row format)服务器
四、数据库中存在大量的MYISAM的表多线程
五、部分实例数据量很大,超过1T架构
六、项目经久失修,找不到负责人运维
七、没有名字服务或者proxy,裁撤须要业务修改IP,如何作到平滑切换ssh
八、用于裁撤的资源不多
历时2个多月,经历了设备梳理、裁撤资源评估、裁撤资源申请、裁撤DB部署、裁撤DB业务关系梳理、裁撤DB合并协调、裁撤DB数据迁移、裁撤DB切换、设备下架和退还等流程后,终于将组内涉及到的DB都裁撤完成。期间不只仅将各个业务梳理清楚,而且对裁撤实例进行了清理和合并,仅用12台设备就完成了所有实例的迁移,而且实现0故障裁撤。裁撤期间遇到多个问题,总结一下,但愿对你们有帮助。
2、问题解决方法论
一、系统思惟
从全局的角度去看待遇到的问题,解决问题的时候不要只盯着某一个出问题的点,而应该站在更高的维度去思考解决方案。
二、资源整合
三、共赢思惟
裁撤是一项须要运维、研发、资源、质量等同事一块儿协做的事情,咱们目标就是为了业务平滑进行迁移和切换,咱们在作事情的时候,要多从共赢思惟中入手。其实本质就是要尝试站在对方的角度思考问题,天然更能找到共赢的解决方案。
3、解决方案
一、针对版本问题的解决方案
将DB所有迁移到mysql 5.7版本,迁移数据分为3步便可解决绝大部分的兼容性问题
a、只迁移业务数据,不mysql库数据
b、迁移权限
c、作主从同步
针对4.1的同步不兼容的问题,因为业务改动小,采用了的方案为:
直接解析binlog将新产生的数据同步到新的DB上,屡次迭代,确保DB的差距最小后,直接停掉老DB,将少许新增的binlog经过工具同步到新DB上,并启用端口转发,将新的请求转发到新DB,停机时间1分钟之内。后面再让业务平滑修改业务到新的DB上。
二、针对表字段使用系统关键字的解决方案
业务表使用系统关键字在mysql 5.7中会人为SQL语法错误,从而致使sql执行失败,有2个解决方案:
a、修改表的字段,兼容mysql 5.7(这个方案会致使业务侧须要修改大量的代码)
b、对字段的全部操做都加上反引号(这个方案对业务影响小,咱们采用的就是这个方式)
三、针对表没有主键和MYISAM表的问题
针对表没有主键和含有不少MYISAM表的问题,为了方便管理,对裁撤的实例都进行梳理,而且在裁撤过程当中完成改造。长痛不如短痛。
没有主键的解决方案
和业务沟通,统一在新实例中增长主键(现存字段)
MYISAM的解决方案
和业务沟通,统一在新实例将MYISAM表所有修改成innodb
四、针对项目经久失修的问题,只能经过抓包肯定对应的负责人,这里的梳理工做确实很是繁杂;
五、针对实例数据量很大的解决方案
因为设计到版本升级,没法采用物理备份的方式进行,所以采用的是mydumper多线程备份的方式,导入的时候,将mysql相关的表所有移除。另外导入的时候不要记录binlog,新DB主从都导入(不要作好主从后,只在主机上导入),或者在主机导入完成后,直接经过拷贝文件的方式作从机。
六、针对没有名字服务或者proxy,作到平滑迁移的解决方案
以前老的DB没有名字服务和proxy,若是要作切换,须要业务侧去修改各个server的配置,因为项目经久失修,大部分初始开发人员基本都已经离职或者转岗,很容易出现修改遗漏,如何实现平滑迁移是重点要考虑的问题,咱们采用的方案是使用端口转发的方式,端口转发完成后,业务就能够从容地去修改业务的配置了。使用端口转发有以下几种常见的方式:
a、使用iptables进行转发
优势是不须要停mysql,能够作到真正的平滑迁移;缺点是处于安全考虑,公司的linux机器都没有加载nat模块,老系统若是要加载nat模块须要编译内核
b、使用ssh进行端口转发
优势是一条命令便可完成,很是方便,也不须要作改造;缺点是须要停mysql,会形成短暂的业务中断;
c、使用haproxy进行端口转发
缺点是须要额外部署和配置haproxy,也须要停掉mysql,会形成短暂的业务中断;
d、使用lvs进行端口转发
缺点是须要额外安装和配置lvs
通过综合考虑,咱们选择了经过ssh端口转发的方案。范例:
ssh -f -N -g -L3306:newDBip:3306 root@localip
注意:有部分系统ssh命令不支持-N参数,去掉-N参数便可。此外还须要注意的是须要给老DB的机器进行受权,不然会因为权限问题带来访问失败的状况。
七、用于裁撤的资源不多的解决方案
机房裁撤的时候,资源侧给的裁撤资源确定不会按照置换比1:1置换,而DB数据量通常都比较大。咱们采起的方案是清理能清理的数据、合并能合并的实例。
4、DB裁撤问题的思考
经历一次裁撤,真的有种“不会再爱了”的感受,每次都很是痛苦。要规避这种痛苦,只有从架构上去规避这种业务直连DB带来的问题。能够采用netagent/名字服务/l5等。在后面的DB接入中,须要将此种需求归入到数据库的准入标准中。