之前写了一个数据迁移程序 ,但是迁移的速度并不理想.因此想请教各位如果我要实现并发大概应该怎么做.
目前只能想到协程,多线程,多进程以及 celery .自己也不太清楚各个方案的优劣.
1
praynise 2018-01-03 08:56:11 +08:00 1
想问一下最基本的数据迁移是怎么实现的?靠游标吗?还是 pandas 的 to_sql ?我没有看源码…不过,提几点自己经常涉及的,看看是否能给楼主一点点提示:
1、我自己试过使用多线程加游标的方式,或者 pandas 的 to_sql,个人感觉,pandas 的 to_sql 最慢,多线程加游标略好一点,不过都比不上数据库自带导出+装载功能。多线程感觉并不稳定,被自己 pass 掉了。而协程应该是需要配合非阻塞库使用吧?自己没有试过… 1.1、之前还考虑过一种思路,就是通过并发,目标数据库建立多个临时表,使用多进程加 insert many 方法,最后再把这几个表 union all 起来合成目标表(针对 insert 会对表加锁的情况) 2、Extract 数据落地方向:基本各数据库都有自己的文本导出功能,楼主可以封装一下这些命令,做一个源数据库的判断,实现最快的卸载效率,我自己的环境中,db2 使用 db2 export,oracle 使用 sqluldr2,视表的情况还可以根据分区键生成多个文件并发卸载,速度挺快的。而 Transform 在 export 的时候可以使用 sql 提前实现 3、Load 数据装载方向:装载文本可以增加并发,例如把分本分割成几分,实现并发装载 以上是自己平时工作中的一点尝试和实现,希望能够对楼主有一点点帮助吧 |
2
mh494078416 2018-01-03 23:23:16 +08:00 via Android 1
全量迁移总结来说有这么几个关键词:批量、多线程、生产者消费者模型、缓存队列、批量写入、压缩传输、数据库 load data 的数据导入方式、statement 缓存等。对数据迁移感兴趣的同学,可以看我的发帖,我们团队有专门这块的岗位
|