背景:
我有一个为OLTP(联机事务处理)进行了大量优化的PostgreSQL(v8.3)数据库。
我需要以半实时的方式从中提取数据(肯定会有人问半实时是什么意思,答案是尽可能频繁地,但我会采取务实的方式,作为基准,假设我们希望每15分钟提取一次),并将其馈送到数据仓库。
有多少数据?在高峰期,我们谈论的是每分钟约80-100k行命中OLTP端,低峰期这将显著下降至15-20k。最常更新的行每个约64字节,但有各种表等,因此数据相当多样化,每行可达4000字节。OLTP运行时间为24x5.5。
最佳解决方案?
根据我所了解的情况,最实用的解决方案如下:
- 创建触发器将所有DML活动写入旋转的CSV日志文件
- 执行所需的任何转换
- 使用本地DW数据泵工具有效地将转换后的CSV泵入DW
为什么采用这种方法?
- 触发器允许选择性地针对特定表,而不是全系统覆盖+输出可配置(即到CSV中)且编写和部署相对容易。SLONY采用类似的方法,开销可接受
- CSV易于快速转换
- 将CSV泵入DW很容易
考虑的替代方案....
- 使用本地日志记录 (http://www.postgresql.org/docs/8.3/static/runtime-config-logging.html)。问题在于相对于我所需的内容,它看起来非常冗长并且有点棘手解析和转换。然而,由于我认为与触发器相比,它的开销更小,因此它可能会更快。当然,由于它是系统范围的,因此它将使管理员更轻松,但是再次强调,我不需要某些表格(其中一些用于持久存储JMS消息,我不想记录)
- 通过ETL工具(如Talend)直接查询数据并将其推送到DW中...问题是需要调整OLTP架构以支持此操作,这会产生许多负面影响
- 使用调整/修改过的SLONY - SLONY很好地记录和迁移更改到从节点,因此概念框架已经存在,但是建议的解决方案似乎更简单、更干净
- 使用WAL
有人做过这个吗?想分享一下你的想法吗?