MySQL 线上日志库迁移实例
作者:AsiaYe 发布时间:2024-01-25 12:40:22
说说最近的一个案例吧,线上阿里云RDS上的一个游戏日志库最近出现了一点问题,随着游戏人数的增加,在线日志库的数据量越来越大,最新的日志库都已经到50G大小了,在线变更的时间非常长。
之前之所以没有发现,是因为之前一直没有进行过日志库的变更,但是随着业务的深入,需要增加一些游戏属性,要对之前的日志库进行变更,这样一来,长时间的维护窗口让业务方和DBA都望而却步,日志优化迫在眉睫。
首先看日志库的情况:
1、日志库中数据量大于5000w的大表有5张;
2、这5张表开量前每个月的数据量大概在2000w左右,开量后会更多;
3、有2个表的索引大小已经超过数据文件大小
询问了业务方和运营对这些表的要求,具体如下:
1、保留最近这3个月的数据,其他的数据可以进行流转,避免影响线上业务的性能。
2、3个月之前的数据流转到一个本地库中,可以支持查询即可,查询速度不能过于慢,分钟级别的可以接受。
3、日志库在迁移的过程中,能够容忍几分钟的表数据丢失,对数据的同步实时性要求不是很高
4、线上的日志库需要支持用户活跃度等统计
5、不希望执行分库分表,有很多查询近几个月的SQL操作,表之间存在一定的耦合性,分表之后不利于关联操作
基于上面的分析,结合实际情况,初步设想的方案是:
1、对线上数据库game_log中的表进行rename操作,然后将原来的表重新创建出来,这个过程中不是连续的,可能会丢失几秒钟的数据。具体的操作如下:
#第一步
rename table game_log.table to game_log_bak.table;
#第二步,获取表结构,其中重要的是auto_increment的值,
#保证后续导入三个月内数据的时候不会发生冲突
show create table game_log_bak.table\G
#第三步
在game_log库中重新创建第二步的表结构
2、将rename过后的game_log_bak库中的数据流转到本地的离线数据库中,该数据库采用infobright存储引擎,这样能够支持离线数据的快速查询
3、备份并清理线上表3个月之外的数据,大概是40G,并将线上的game_log_bak数据库中3个月以内的数据(大概10G)重新灌入game_log数据库中,这样结构就变成了:
4、删除game_log_bak库,并搭建一个只读从库,实时的从主库上同步game_log库的信息,如下:
5、从本地的只读从库中,像本地的infobright数据库中同步数据,同步的方法可以选用dataX工具,像下面这样:
6、设置定时任务,按照一定的周期清理线上的过期数据,确保线上只保留最近3个月的数据,不会对rds的磁盘存储空间产生压力。
这个方法中,目前看来存在下面几个问题:
1、经常性的清理线上数据,这些数据占用的表空间不能被立即回收,可能会造成数据表的碎片问题。
2、后续如果游戏的量级上来之后,使用这个问题可能还是会有问题,届时可以适当调整日志表的清理周期,如果数据量过大,可以考虑其他的方案来处理。
回过头来分析,表的设计上还是存在一定的问题,日志表中记录的应该只是流水数据,尽量不能出现关联查询的情况,或者说可以提前评估数据量,然后使用季度表或者月表来处理这种的大量的日志情况,这样在清理和维护的时候可能就方便的多。
来源:https://cloud.tencent.com/developer/article/1533732


猜你喜欢
- 本文研究的主要是Django使用httpresponse返回用户头像,下面是相关实例代码。当请求一个页面时,Django 把请求的 meta
- PHP addcslashes() 函数实例在字符 "W" 前添加反斜杠:<?php $str = addcsla
- Typora是什么?Typora是一款支持实时预览的Markdown文本编辑器。支持即时渲染技术,这也是与其他Markdown编辑器最显著的
- SQL Server 2005默认是不允许远程连接的,要想通过远程连接实现MSSQL,数据库备份,需要做如下设置:步骤/方法1.打开SQL
- 今天用numpy 的linalg.det()求矩阵的逆的过程中出现了一个错误:TypeError: No loop matching the
- 我就废话不多说了,大家还是直接看代码吧~package main import ("fmt""time&quo
- 海豚本文例子主要展示了如何使用补丁、路径和转换类绘制和操作给定的顶点和节点的形状。测试可用。import matplotlib.cm as
- CSS执行顺序与优先权的问题其实就是一个冲突解决的问题,当同一个元素(或内容)被CSS选择符选中时,就要按照优先权取舍不同的CSS规则,这其
- 一:操作redis1:redis拓展安装composer require predis/predis或者你也可以通过 PECL 安装&nbs
- 什么是正则表达式?1、正则表达式是检擦、匹配字符串的表达式2、正则表达式是描述规则,主流语言都有良好支持3、字符串校验、查找与替换是正则表达
- Python是一门简单易学的编程语言。阅读好的Python程序感觉就像阅读英语,尽管是非常严格的英语。Python的这种伪代码特性是其最大强
- 本文实例讲述了sql server实现递归查询的方法示例。分享给大家供大家参考,具体如下:有时候面对树结构的数据时需要进行递归查询,网上找了
- List>>> [chr(i) for i in range(97,123)]['a', 'b
- 1. 问题描述水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数,水仙花数是指一个3位数,它的每个位上的数字的3次幂
- 前言在学习操作系统的时候,我们应该都学习过临界区、互斥锁这些概念,用于在并发环境下保证状态的正确性。比如在秒杀时,100 个用户同时抢 10
- 本文实例讲述了Python图像处理之简单画板实现方法。分享给大家供大家参考,具体如下:Python图像处理也是依赖opencv的Python
- 前言我们在使用vue-cli启动项目的时候npm run dev便可以启动我们的项目了,通常我们的请求地址是以localhost:8080来
- 1,phpthumb_ico 是生成ICO图标的类,源码如下class phpthumb_ico {function phpthumb_ic
- 1. 场景描述一直做java,因项目原因,需要封装一些经典的算法到平台上去,就一边学习python,一边网上寻找经典算法代码,今天介绍下经典
- jupyter notebook 自定义python解释器jupyter notebook 和虚拟环境的好处就不多废话了jupyter no