MySQL 冷热数据分离

django celery mysql 2018年05月28日 星期一

随着时间的推移,数据库单表容量就会越来越大,最突出的如日志类大表,十万百万每天的增长速度,达到千万数量级+,表的查询就越来越慢,索引也会觉得乏力。

源头就是单表数据量过大,只要保持单表的容量保持在一定量的阀值kw,所有的业务逻辑不需要去更改,粗暴的,也是很有效的方法。

数据都伴随着时间,时间的逝去,自然分冷热数据,按着业务查询场景&增长速度,可根据时间进行划分如 原表只保留三个月数据,其余按着年份进行迁移,如写入mytable_2018,记录2018年三个月前的数据。

1. celery 可以设定时任务,设置每天定时操作backup task,根据数据的create_time判断,把三个月之前的原数据进行迁移。

# Celery 定时任务
from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
    # 每天定时冷热数据搬运
    'backup': {
        'task': 'path.to.task.backup',
        'schedule': crontab(minute=0, hour=3),
    },
}

2. 伴随着时间,根据create_time不同的年份进行迁移不同的备份表,如迁移原表mytable, 2018年数据到mytable_2018,备份冷数据表需要动态的创建,django支持 raw sql 模式,运用cursor进行sql操作增库,插入备份数据,删除原数据。

# 获取数据库连接, 事物
from django.db import connection, transaction

with transaction.atomic():
    # 写如备份表
    with connection.cursor() as cursor:
        cursor.execute(todo_exe_sql)
    # 删除原表数据
    model.objects.filter(pk__in= todo_del_ids).delete()

通过每天的脚本迁移数据,原表保持在一个固定的时间宽度,数据量保持在一定的数量级,保证了业务可持续进行。