45亿数据迁移记录
-
背景
- 数据库数据量日益增加,逐渐开始显得很是臃肿,日常查询统计的时候,仅仅是count(1) 查询下总数,耗费的时间也在500s左右,而且之前的orcle数据库,前期建立的时候,也未考虑太多,未进行索引,分表,等优化。后面鉴于种种考虑,以及后期的规划,准备将数据迁移至clickhouse(oracle -> clickhouse)。
- clickhouse 相关背景
- ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。
- 相关介绍
- 迁移相关考虑
- 数据库现有数据45亿
- 每天还有新数据持续入库-数据量 3000万/天
-
资源
- 服务器资源 CPU 16C;内存 48G;硬盘 500G磁盘左右,总共3台
-
准备
-
过程-时间-思考
- 选择方式,与迁移工具
- 首先,选择截断数据日期,进行之前的数据迁移。
- 最开始看的datax 的相关,这里说下datax的clickhouse官方还没提供指定的插件,所有无法直接到达clickhouse。
- 尝试 oracle -> datax -> mysql -> clickhouse 使用 clickhouse 的insert into ,clickhouse 对mysql 有很好的支持。
- 尝试失败,mysql 数据迁移过去以后,一旦到达亿级别,数据库统计无结果。考虑过,使用datax分任务,分表,但是数据已经45亿,分表量太小。花费时间过长。
- 尝试 oracle -> datax -> hdfs -> waterdrop -> clickhouse 尝试使用 datax 迁移数据到hdfs,然后使用 waterdrop 在把数据从 hdfs 到 clickhouse 。
- 这个是可行的,但是在这期间,我在github 上面发现了其他网友扩展的datax 的 clickhouse 的插件,毕竟这个方案还需要 hdfs 做一步的中转。
- 尝试 oracle -> datax -> clickhouse
- 在网上查看相关文档,发现有朋友在github 提供了 datax 的 clickhouse 的插件。参考地址
- 尝试相关插件,发现可行。
- clickhouse 建表,查看相关优化
- 了解 clickhouse 的相关表引擎,为迁移建表准备。之前的文档有相关说明。
- 准备shell脚本,依次执行脚本,顺序执行
- 这里需要说明,为什么要依次执行?
- datax 那里可以进行份job,一起执行,但是我这里,没有选择并发处理多任务。前期测试的时候,我这边设置了datax 的一个优化参数线程数 channel 为15 ,同时执行多个任务。但是这样大数据量并发读写操作,给oracle 的服务器,以及迁移的服务器带来了几个问题。
- 多个任务同时读取oracle ,导致oracle那边出现了阻塞现象,有的任务已经开始拉取,有的任务迟迟不见开始。
- 过多的任务,启动过多的线程,导致linux迁移的服务器最后经常出现cpu 锁死,任务极度不稳定,进行奔溃,迁移失败。
- datax 那里可以进行份job,一起执行,但是我这里,没有选择并发处理多任务。前期测试的时候,我这边设置了datax 的一个优化参数线程数 channel 为15 ,同时执行多个任务。但是这样大数据量并发读写操作,给oracle 的服务器,以及迁移的服务器带来了几个问题。
- datax 支持where 条件,准备sql 的where 条件,进行数据库的 用创建时间进行分割数据,使每个任务的job 拉取数据量保持平衡,过滤一部分无效数据。
- 建立临时表,每个任务的时间分区,对应一个datax 的配置。防止数据拉取过程中某个任务失败。
- 我这边建立clickhouse 的临时job表,建立了14个, 每个集群所在的节点,是7个,每个datax 在两台服务器分别顺序执行7个任务。
- 中间会有任务失败,所有最后拉取完毕以后,查看每个job 的日志,失败的,进行清表,二次拉取。
- 全部成功以后,使用 clickhouse 的 insert into 插入之前的建立的正式表,进行数据合并,至此45亿数据拉取成功。
-
总结
- 迁移过程中,主要耗费时间在前期的工具,以及方案备选,因为之前没做过此类事情,所以查看每个工具,而后选择测试的方案也不相同。
-
linux 脚本
echo '开始释放缓存'
echo 3 > /proc/sys/vm/drop_caches
echo '缓存清理完毕,执行第4次任务'
python2 /home/datax/bin/datax.py --jvm="-Xms3G -Xmx3G" /home/datax/job/job_clickhouse4.json >/home/datax/log/job_clickhouse4.log 2>&1
echo '第4次任务执行完毕'
echo '开始睡眠'
sleep 1h
echo '结束睡眠'
echo '开始释放缓存'
echo 3 > /proc/sys/vm/drop_caches
echo '缓存清理完毕,执行第5次任务'
python2 /home/datax/bin/datax.py --jvm="-Xms3G -Xmx3G" /home/datax/job/job_clickhouse5.json >/home/datax/log/job_clickhouse5.log 2>&1
echo '第5次任务执行完毕'
job 与 临时表 后面添加后缀 _数字 以方便区分。与任务日志对应。 而这里的睡眠是因为,clickhosue 拉取数据以后,就会整理文件,整理文件会耗费内存以及性能,进行睡眠,先让他进行整理。
datax的多job
clickhouse 的分表
来源:oschina
链接:https://my.oschina.net/u/2971292/blog/3157651