用于保存和查询股票价格的数据库选择
Database choice for saving and querying stock prices
我目前每秒从证券交易所收到 2000 个价格,需要将这些价格保存在适当的数据库中。我目前的选择是 PostgresQL,它太慢了。我需要以像 OHLC 这样的聚合形式保存这些价格(报价)。所以如果我想保存D1数据,我需要先从数据库中获取股票的前D1记录,检查高价或低价是否发生变化并设置新的收盘价,然后再次将其保存到数据库.这需要永远,而 Postgres 是不可能的。我不想保存 OHLC 数据,我更喜欢实时查询(聚合)这些数据。
所以我的要求是:
- 坚持
- 快速写入(目前每秒 2k,最高 10k)
- 查询,例如实时聚合 OHLC 数据(每秒 50-100 个)
- 无需编写原始查询即可采用任何现代编程语言(Python 的 SDK 或该数据库的 JS)
- 可在 AWS 或 GCP 上轻松部署
我在考虑 Apache Cassandra。我不熟悉 Cassandra,像 OHLC 这样的强大查询是否可行?有没有 Cassandra 的替代品?
提前致谢!
根据我从你的问题中了解到的情况,我相信 Cassandra 应该很适合你的 use-case。
关于您的要求:
- persistence : Cassandra 不仅会持久化您的数据,还会以最少的配置覆盖冗余;
- 快速写入:这是 Cassandra 最优化的目标,虽然确切的吞吐量取决于很多因素,但通常 Cassandra 将管理 [=64] 中测量的写入=];此外,最终的写入次数并不真正相关,因为 Cassandra 可以线性扩展而没有真正的惩罚,所以 5k、10k、100k 或更多都是可行的;
- 适应性:Cassandra 拥有最常见语言的官方驱动程序(Python、C 系列、NodeJs、Java、Ruby、 PHP, Scala) 以及社区为更多语言开发的 (list of divers);
- deployable : 在云中部署非常容易。您可以选择在独立实例上手动部署它,也可以使用托管的 Cassandra 集群(AWS 有一个,它叫做 'AWS Keyspaces',Datastax(公司驱动Cassandra 背后的大部分开发)都有一个名为“Astra”的解决方案,而且还有更多可能的解决方案。鉴于 Cassandra 是 big-data 存储方面的主要参与者之一在云中为您的数据库找到一个位置应该很容易。
我只提到了 5 个要求中的 4 个。那是因为谈到阅读,事情变得更复杂,需要更大的讨论。
500-100 reads/s 鉴于每秒 2k+ 次写入似乎符合 Cassandra 针对写入密集型任务进行优化的一般想法。在 Cassandra 中,您为 table 建模的方式将决定事情的运行情况。对于像您描述的这样的任务,我的第一个想法是:
- 您每天对每只股票进行存储 => 您会得到一个包含大约 30k 行(1 update/s 用于 8 个交易小时)且大小小于 0.2MB (30k * 4B) 的分区。这完全在建议值之内,而且显然是在最坏情况下;
- 当您需要聚合数据时,您有 2 个选择:
2a。您按原样读取分区并将其聚合到应用程序端(我会推荐);
2b。您在数据库上实现了一个“User-Defined 聚合”函数来完成工作 (docs)。这应该是可行的,尽管我不保证。除了更难实施之外,问题在于考虑到明显的 use-case,将这种额外的工作负载放在数据库上可能不是您想要的。让我解释一下:我希望您的阅读负荷在某些时间(交易时段之前、期间和之后)最为活跃,而在负荷较轻的时候。根据您的架构,您可以在高峰时段启动多个应用程序实例,然后在 off-peak 期间缩减它们以降低成本。虽然应用程序可以在 AWS 和 GC 等云提供商上轻松扩展和缩减。 Cassanadra 不能像这样放大和缩小(早上 5 个节点,晚上 3 个节点,依此类推)(它可以,但它不是设计成这样的,这将是一个糟糕的决定)。因此,将尽可能多的 non-constant 工作负载转移到应用程序似乎是最好的主意;
- (可选)有一个工作人员在 day/trading 天结束时汇总每只股票的价值并将它们保存到另一个 table 以便在查看历史数据时更轻松。这些数据甚至可以按周、月甚至年进行分桶,具体取决于 space 聚合数据需要多少。
您还可以在 Casandra 前面添加 Spark 和 Kafka,以获得更强大的 real-time 聚合方法,但我们不应该偏离手头的问题那么多。
Cassandra 非常强大,具有正确的建模和正确的架构。乍一看,您需要的似乎非常适合 Cassandra,但如果您以非设计的方式使用它,它可能会变得非常强大。我希望这个答案能让您做出正确的决定。
干杯。
我目前每秒从证券交易所收到 2000 个价格,需要将这些价格保存在适当的数据库中。我目前的选择是 PostgresQL,它太慢了。我需要以像 OHLC 这样的聚合形式保存这些价格(报价)。所以如果我想保存D1数据,我需要先从数据库中获取股票的前D1记录,检查高价或低价是否发生变化并设置新的收盘价,然后再次将其保存到数据库.这需要永远,而 Postgres 是不可能的。我不想保存 OHLC 数据,我更喜欢实时查询(聚合)这些数据。
所以我的要求是:
- 坚持
- 快速写入(目前每秒 2k,最高 10k)
- 查询,例如实时聚合 OHLC 数据(每秒 50-100 个)
- 无需编写原始查询即可采用任何现代编程语言(Python 的 SDK 或该数据库的 JS)
- 可在 AWS 或 GCP 上轻松部署
我在考虑 Apache Cassandra。我不熟悉 Cassandra,像 OHLC 这样的强大查询是否可行?有没有 Cassandra 的替代品?
提前致谢!
根据我从你的问题中了解到的情况,我相信 Cassandra 应该很适合你的 use-case。
关于您的要求:
- persistence : Cassandra 不仅会持久化您的数据,还会以最少的配置覆盖冗余;
- 快速写入:这是 Cassandra 最优化的目标,虽然确切的吞吐量取决于很多因素,但通常 Cassandra 将管理 [=64] 中测量的写入=];此外,最终的写入次数并不真正相关,因为 Cassandra 可以线性扩展而没有真正的惩罚,所以 5k、10k、100k 或更多都是可行的;
- 适应性:Cassandra 拥有最常见语言的官方驱动程序(Python、C 系列、NodeJs、Java、Ruby、 PHP, Scala) 以及社区为更多语言开发的 (list of divers);
- deployable : 在云中部署非常容易。您可以选择在独立实例上手动部署它,也可以使用托管的 Cassandra 集群(AWS 有一个,它叫做 'AWS Keyspaces',Datastax(公司驱动Cassandra 背后的大部分开发)都有一个名为“Astra”的解决方案,而且还有更多可能的解决方案。鉴于 Cassandra 是 big-data 存储方面的主要参与者之一在云中为您的数据库找到一个位置应该很容易。
我只提到了 5 个要求中的 4 个。那是因为谈到阅读,事情变得更复杂,需要更大的讨论。
500-100 reads/s 鉴于每秒 2k+ 次写入似乎符合 Cassandra 针对写入密集型任务进行优化的一般想法。在 Cassandra 中,您为 table 建模的方式将决定事情的运行情况。对于像您描述的这样的任务,我的第一个想法是:
- 您每天对每只股票进行存储 => 您会得到一个包含大约 30k 行(1 update/s 用于 8 个交易小时)且大小小于 0.2MB (30k * 4B) 的分区。这完全在建议值之内,而且显然是在最坏情况下;
- 当您需要聚合数据时,您有 2 个选择:
2a。您按原样读取分区并将其聚合到应用程序端(我会推荐);
2b。您在数据库上实现了一个“User-Defined 聚合”函数来完成工作 (docs)。这应该是可行的,尽管我不保证。除了更难实施之外,问题在于考虑到明显的 use-case,将这种额外的工作负载放在数据库上可能不是您想要的。让我解释一下:我希望您的阅读负荷在某些时间(交易时段之前、期间和之后)最为活跃,而在负荷较轻的时候。根据您的架构,您可以在高峰时段启动多个应用程序实例,然后在 off-peak 期间缩减它们以降低成本。虽然应用程序可以在 AWS 和 GC 等云提供商上轻松扩展和缩减。 Cassanadra 不能像这样放大和缩小(早上 5 个节点,晚上 3 个节点,依此类推)(它可以,但它不是设计成这样的,这将是一个糟糕的决定)。因此,将尽可能多的 non-constant 工作负载转移到应用程序似乎是最好的主意;
- (可选)有一个工作人员在 day/trading 天结束时汇总每只股票的价值并将它们保存到另一个 table 以便在查看历史数据时更轻松。这些数据甚至可以按周、月甚至年进行分桶,具体取决于 space 聚合数据需要多少。
您还可以在 Casandra 前面添加 Spark 和 Kafka,以获得更强大的 real-time 聚合方法,但我们不应该偏离手头的问题那么多。
Cassandra 非常强大,具有正确的建模和正确的架构。乍一看,您需要的似乎非常适合 Cassandra,但如果您以非设计的方式使用它,它可能会变得非常强大。我希望这个答案能让您做出正确的决定。
干杯。