记一次库级别的拆分
2016-12-01 00:22
78 查看
背景
线上有个 LBS 的端口,每秒1600左右的写入,从库经常延迟。经观察后发现大部分写入操作都集中在更新某个 DB 上,该 DB 容量也有将近 400G,占了整个端口的 70%,并且容量还处于上涨的趋势。大量的 update 导致从库追不上,对于日常备份、扩容都是问题。(如果表结构以及 update 语句使用不当,update 造成的资源消耗将会非常多,可参考何登成的 MySQL 源码分析视频)需要解决的问题
容量问题延迟问题
备份问题
解决办法
和开发商量后决定对该 DB 进行拆分,思路是一拆多,分摊主库写的压力,同时也能分散主库容量压力,也有利于备份。具体如下库名 wifi 下有 256 张表是主要的更新对象,考虑到对写入量和资源分配的折中,决定将 256 张表拆分到 4 个不同的新端口。
最终1端口保留如下表
wifi_00.ibd ~ wifi_3f.ibd
最终2端口保留如下表
wifi_40.ibd ~ wifi_7f.ibd
最终3端口保留如下表
wifi_80.ibd ~ wifi_bf.ibd
最终4端口保留如下表
wifi_c0.ibd ~ wifi_ff.ibd
具体拆分步骤如下:
一、基于已有的从库或备份扩容出从库 s1,修改配置文件(和其它从库一样连到主库,配置过滤条件,只复制需要的 DB)
replicate_wild_do_table = wifi.%
replicate_wild_do_table = mysql.%
replicate_wild_do_table = 其它内部使用的库
二、在扩出的从库 s1 上删除其它不需要复制过滤的 DB,例如:
drop database ip
drop database cell
三、没问题后停 s1,拷贝三份数据 s2,s3,s4 至其他机器,修改 server-id,buffer pool,端口号后启动复制。
1)stop s1
2)rsync to 其它三台机器
3)在每台机器上:改数据目录权限,改配置文件以及里面的端口信息
4)start ALL_PORT
5)观察一段时间
四、前三步没问题后基于 s1,s2,s3,s4 扩容出相应的从库,修改从库的配置,重新 change master。通知业务切换对 wifi 库的写读。
1)四个端口分别 stop 实例,rsync 数据到相应的从库,传完后按序启动源实例,分别记录下 master position,启动前将 log-slave-update 改为 1
2)分别到相应的从库修改如下配置:
server-id、删除 replicate_wild_do_table 参数、开启复制
3)change master to 步骤1)记录下的点位
4)观察一段时间,如没问题通知业务修改代码逻辑。先开放读,切换时再开放写
五、drop tables。
1)观察一段时间,等业务已经将读写分离后,再将各自端口不需要的表 rename,每个端口保留 wifi 库中表的 1/4 即可,端口之间不能删重了。期间可抓包、或者查看数据文件的最后修改时间或者跟业务确认,来确定是否 rename。
2)继续观察一段时间,跟业务确认保证读写已完全分离后再 drop 掉 rename 后的表。
3)确定源端口主库已没有 wifi 库的读写后,将新端口的主库 stop slave。新端口稳定后,可以将源端口的 wifi 库删除。
六、指定备份策略等其他善后工作。
总结
1、拆分之前要做好拆分计划,以及计划的具体实施步骤,落实到每一步,该注意什么,免得操作的过程配置出差错,延缓整体拆分时间。2、拆之前要找几台好机器,免得延迟大了,时间拖得久。
3、传数据的时候以一传一的方式,比如 A 传 B,B 再传 C,这样 A 传完就可以启动服务,可能会节省整个过程的时间。
4、在迁移读写策略前,需要先停原主库的数据写入,等新端口的数据都应用完后再切换读写逻辑。
5、读写切换后,需要观察数据文件是否按照预期进行更新。
6、拆分过程帮助开发解决了一个遗留的历史问题。256 张表里面其中有张表竟然少一个字段,但开发一直没察觉。
7、拆分后写入量降为 300-400,一段时间后业务量增长,每个新端口又恢复到了 1000 左右的写。
相关文章推荐
- 一次应用服务拆分架构改造过程
- log4j2 扩展日志级别,支持将系统日志与业务处理日志拆分
- 如何成为一名合格的算法工程师?我们做了一次技能拆分…
- 如何成为一名合格的算法工程师?我们做了一次技能拆分…
- 记一次拆分包裹的算法
- openlayers 3 开发,点击 Overlay 请求WFS并进入下一级别(顺带解决上一次问题)
- 对于一次插入百万级别数据量处理
- 一次完整性级别导致的IE自动化问题
- 由一次mycat+mysql水平拆分集群问题引发的思考
- 进程级别只需运行一次的操作, 就应该只让它运行一次
- 由一次mycat+mysql水平拆分集群问题引发的思考
- 短信一次发送字节140个,如果超过140字节就会分为两条。这时如果第140个字节是中文的前半,那么第一条短信应该发送139字节。设计一个程序,读取原始信息,可以根据长度自动拆分信息转换为多条短信
- 朝着微服务的方向去做一次数据库拆分
- 网站用户级别如何设置?---杭州易网方晓恩
- Android中的“再按一次返回键退出程序”实现
- 一次网站登录慢故障排查
- 再按一次退出程序
- 基于echarts的一次图表实战
- 理解代码的二进制级别重用
- HttpWebReques请求StreamReader.ReadToEnd阻塞现象,以及HttpClient实现一次连接多次请求