存储和管理外汇交易报价数据

Storing and managing Forex trading tick data

我正在为外汇交易构建一个数据可视化系统,并且正在探索存储我拥有的历史外汇交易报价数据的方法。

数据采用货币对(例如 USD/CAD)按时间顺序排列的卖价和买价的形式。在一天结束时,我需要在 Elasticsearch 中为我的数据编制索引,而我所搜索的是将它们提供给那里的最佳方式。

我在网上找到了几种方法;他们开始很简单,但后来变得复杂。我想知道增加额外的复杂性是否值得。我的一些选择是:

  1. 在 PostgreSQL 上存储报价数据,然后通过插件将它们同步到 Elasticsearch (here)
  2. 在 PostgreSQL 上存储报价数据,将它们推送到 Logstash,然后推送到 Elasticsearch
  3. 最后,将分时数据存储在PostgreSQL上,推送到Redis,再推送到Logstash,再推送到Elasticsearch

我的直觉告诉我,解决方案 2 是最理想的,但什么是最佳实践?

最好将数据存储在长期存储数据库中,例如 PostgreSQL 或类似数据库。这样你就可以随时决定是否需要更改你的映射、添加字段、删除字段、更改它们的类型,或者你有什么,然后你可以轻松地重建你的 ES index/indices,而不需要你的太多麻烦真实的主要来源(即 PostgreSQL),并且您始终在 ES 中拥有干净的数据。

我不知道 ZomboDB(解决方案 1)所以我真的不能代表它,我所知道的是我通常不太喜欢将两种不同的技术结合在一起,这使得升级变得困难它们中的任何一个,以防您 need/must/want 应用补丁或从其中任何一个中的新功能中受益。

除非您要对源数据进行大型且成本高昂的转换,否则我认为解决方案 3 不会带来太多好处,即在中介 Redis 中存储数据的额外步骤,在我看来不会带来太多好处(您的里程可能会有所不同)。当您 可能 丢失管道中的数据时,使用临时存储(例如 Redis 或 Kafka)是 ,但在这种情况下,因为您的数据在 PostgreSQL 中,您真的 运行 没有丢失任何东西的风险。如果有的话,您可以重新启动管道并重建几天的数据。

剩下解决方案 2,考虑到手头的信息,它会很好。使用 Logstash JDBC input,您可以轻松检索最新的更改并将它们每隔 x 分钟转发到 ES。

来自 ZomboDB 的 Eric。我想尝试回答您关于 ZDB 的问题。

ZomboDB 专为在 Postgres 中进行全文搜索而设计。需要注意的是,它不是将你的 PG 数据同步到 Elasticsearch 的工具。它是一种功能齐全的 Postgres 索引类型(类似于 btree、gin 和 gist 等内置类型),恰好由 Elasticsearch 提供支持。 ZomboDB 使用 Elasticsearch 的事实确实是一个实现细节。

虽然 ZDB 确实提供了许多公开访问 ES 聚合设施的 UDF,但它实际上是为文本搜索而设计的。

因此,如果您的数据真的只是数字对,您最好直接使用 ES——尤其是如果您每天加载一批。毫无疑问,与标准 Postgres "GROUP BY" 查询相比,ZDB 可以提供卓越的聚合性能(因为它将它传递给 Elasticsearch),但是您要为有限的用例付出沉重的操作代价。

另一方面,如果您的 ask/bid 数据带有大量相关元数据,并且:

  1. 你需要 PG 作为你的真实来源,
  2. 您需要对该元数据进行文本搜索(支持或不支持聚合),并且
  3. 你不想学习 ES 而将另一个数据库系统引入你的应用程序,那么...

... ZomboDB 可能适合您。

我怀疑 Stack Overflow 不是进入这个的地方,所以请随时通过 ZDB github 页面推荐的方式与我联系。