背景:
我有一个针对 OLTP 进行了高度优化的 PostgreSQL (v8.3) 数据库。
我需要在半实时的基础上从中提取数据(有人一定会问半实时是什么意思,答案尽可能频繁,但我会务实,作为基准可以说我们希望每 15 分钟)并将其输入数据仓库。
多少数据?在高峰期,我们谈论每分钟大约 80-100k 行到达 OLTP 端,非高峰期这将显着下降到 15-20k。最频繁更新的行每行约为 64 字节,但有各种表等,因此数据非常多样化,每行最多可达 4000 字节。OLTP 24x5.5 处于活动状态。
最佳解决方案?
据我所知,最实用的解决方案如下:
- 创建 TRIGGER 以将所有 DML 活动写入旋转的 CSV 日志文件
- 执行所需的任何转换
- 使用原生 DW 数据泵工具将转换后的 CSV 有效地泵入 DW
为什么采用这种方法?
- TRIGGERS 允许将选择性表作为目标而不是系统范围 + 输出是可配置的(即到 CSV),并且相对容易编写和部署。SLONY 使用类似的方法,开销是可以接受的
- CSV 转换简单快速
- 易于将 CSV 泵入 DW
考虑的替代方案....
- 使用本机日志记录 ( http://www.postgresql.org/docs/8.3/static/runtime-config-logging.html )。问题是它相对于我需要的东西看起来非常冗长,并且解析和转换有点棘手。但是它可能会更快,因为我认为与 TRIGGER 相比开销更少。当然它会使管理员更容易,因为它是系统范围的,但同样,我不需要一些表(一些用于持久存储我不想记录的 JMS 消息)
- 直接通过 Talend 等 ETL 工具查询数据并将其泵入 DW ......问题是 OLTP 模式需要调整以支持这一点,并且有许多负面影响
- 使用经过调整/破解的 SLONY - SLONY 在记录和迁移更改到从属设备方面做得很好,因此概念框架就在那里,但提议的解决方案似乎更容易和更清晰
- 使用 WAL
有没有人这样做过?想分享你的想法吗?