[请教]数据迁移程序的并发应当考虑哪些方面以及如何实现?

2018-01-02 23:13:55 +08:00
 jfry

之前写了一个数据迁移程序 ,但是迁移的速度并不理想.因此想请教各位如果我要实现并发大概应该怎么做.

目前只能想到协程,多线程,多进程以及 celery .自己也不太清楚各个方案的优劣.

1951 次点击
所在节点    Python
2 条回复
praynise
2018-01-03 08:56:11 +08:00
想问一下最基本的数据迁移是怎么实现的?靠游标吗?还是 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 数据装载方向:装载文本可以增加并发,例如把分本分割成几分,实现并发装载
以上是自己平时工作中的一点尝试和实现,希望能够对楼主有一点点帮助吧
mh494078416
2018-01-03 23:23:16 +08:00
全量迁移总结来说有这么几个关键词:批量、多线程、生产者消费者模型、缓存队列、批量写入、压缩传输、数据库 load data 的数据导入方式、statement 缓存等。对数据迁移感兴趣的同学,可以看我的发帖,我们团队有专门这块的岗位

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/419542

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX