当前位置: 首页 > 知识库问答 >
问题:

选择/配置数据库以实现高吞吐量、可靠、一致的写入吞吐量,并牺牲延迟

柴宏阔
2023-03-14

我正在开发一个具有以下特性的实时应用程序:

  • 数百个客户端将同时插入行/文档,每个客户端每隔几秒钟插入一行。
  • 大部分仅追加;几乎所有的行/文档,一旦插入,永远不会改变。
  • 只有当数据被刷新到磁盘时,客户端才会看到成功,此后读写一致性应该保持不变。
  • 客户端愿意等待几秒钟的确认时间足够多的磁盘查找和写入发生。
  • RAM中的数据太多(排除像Redis这样的选项)。但是写很久以前的行很少被访问,所以在内存中没有它们是可以接受的。
  • 理想情况下,这些写入不应该阻止读取。
  • 键值存储很好,但是至少需要一个可靠的自动递增索引。

换句话说(和tl;dr),客户机可以容忍延迟,但他们需要大量可信任的写入吞吐量——比“一次写入就是一次磁盘操作”的吞吐量还要高

我设想的数据库将实现如下功能:接受TCP连接的数量(理论上受文件描述符数量的限制),在内存中缓冲这些写操作,尽可能多地将它们的批记录到磁盘上(以及对自动递增索引的更新),并且仅在相关磁盘写入操作完成时才响应这些TCP连接。或者,它可以很简单,比如一个懒洋洋地写数据库,发布一条它已经完成了磁盘写操作的消息(客户端等待懒洋洋的响应,然后等待写消息报告成功)。

我认为具有如此高的延迟容忍度,这并没有要求太多。我想其他人也有这个问题,比如金融公司,它们承受不起丢失数据的后果,但却承受得起延迟对任何一个客户的响应。

Postgres、CouchDB/Couchbase或MongoDB等经过战斗测试的数据库解决方案是否支持这种操作模式?

共有1个答案

向杜吟
2023-03-14

PostgreSQL应该非常适合这个工作负载;您指定的几乎所有内容都在其正常功能集中。pg与ACID兼容,支持组提交以减少同步开销,编写器不会阻止读取器,并且它使用操作系统进行缓存,因此它自然倾向于只将热数据集保留在内存中。

“客户端愿意在几秒钟内等待确认,等待的时间足以进行多次磁盘查找和写入”

如果考虑PostgreSQL,您的应用程序非常适合一个非常大的commit_delay,这将极大地有助于提高写入吞吐量。您不能使用synchronous_commit=off,因为您需要在回复之前确认提交,但是您可以将提交排队几秒钟以节省同步成本。

如果你使用Pg来完成这样的工作,你需要调整检查点,以确保检查点不会暂停I/O。确保bgwriter正在积极地写出脏缓冲区。确保autovaccum经常运行——您没有从表中删除,但索引仍然需要维护,表统计信息也需要维护。

如果你期望大量的数据,而你的查询通常有一个时间元素,那么考虑将表划分为第一个月的(例如)1个月,将所有超过12个月的所有内容合并到一年中划分的表中。Pg只有有限的内置分区(使用继承和约束排除将其拼凑在一起),因此您必须使用触发器手动/编写脚本,但它可以完成这项工作。

见:

  • 提交延迟配置选项
 类似资料:
  • 本文向大家介绍springboot高并发下提高吞吐量的实现,包括了springboot高并发下提高吞吐量的实现的使用技巧和注意事项,需要的朋友参考一下 公司让做一个全文检索的项目,我使用的是elasticsearch。但是对性能有很高的要求,为了解决性能问题,我简直是寝食难安。 es(elasticsearch)没有使用分布式,单台的。 开发完测试的时候,查询慢,吞吐量低。 网友们建议用异步--使

  • 我正在对ElasticSearch进行基准测试,以实现非常高的索引吞吐量。 我目前的目标是能够在几个小时内索引30亿(3,000,000,000)文档。为此,我目前有3台windows服务器机器,每台16GB内存和8个处理器。插入的文档有一个非常简单的映射,只包含少数数字非分析字段(被禁用)。 使用这个相对适中的钻机,我能够达到每秒大约120,000个索引请求(使用大桌子监控),我相信吞吐量可以进

  • 问题内容: 我为Apache Flink写了一个非常简单的Java程序,现在我对测量统计信息感兴趣,例如吞吐量(每秒处理的元组数)和等待时间(程序需要处理每个输入元组的时间)。 我知道Flink公开了一些指标: https://ci.apache.org/projects/flink/flink-docs- release-1.2/monitoring/metrics.html 但是我不确定如何使

  • 来自AWS Lambda常见问题解答: Q: 我一次可以执行的AWS Lambda函数的数量是否有限制? 不需要。AWS Lambda旨在并行运行多个函数实例。然而,AWS Lambda的默认安全限制为每个区域每个帐户100次并发执行。如果您希望提交请求以增加100次并发执行的限制,您可以访问我们的支持中心,单击“打开新案例”,然后提交服务限制增加请求。 Q: 如果我的帐户超过并发执行的默认限制,

  • 在大数据存储中,IOPS和吞吐量之间的关键区别是什么

  • 我需要从很多客户端通过网络套接字连接到java服务器来提取数据。 有很多web套接字实现,我选择了vert。x、 我做了一个简单的演示,在那里我听json的文本帧,用jackson解析它们,然后返回响应。Json解析器对吞吐量没有显著影响。 我的总速度是每秒2.5公里,有2到10个客户。 然后我尝试使用缓冲,客户端不会等待每个响应,而是在服务器确认后发送一批消息(30k-90k),速度提高到每秒8