【发布时间】:2012-10-11 05:30:47
【问题描述】:
我正在开发一个具有以下特征的实时应用程序:
- 数百个客户端将同时插入行/文档,每个客户端每隔几秒插入一行。
- 大部分仅追加;几乎所有的行/文档,一旦插入,就永远不会改变。
- 只有当数据刷新到磁盘后,客户端才会看到成功,此后读你写的一致性应该保持。
- 客户端愿意等待 秒 左右的确认时间 - 足够长的时间来进行多次磁盘查找和写入。
- RAM 中无法容纳的数据过多(排除 Redis 等选项)。但是很久以前写入的行很少被访问,因此不将它们放在内存中是可以接受的。
- 理想情况下,这些写入不应阻塞读取。
- 键值对存储没问题,但至少需要一个可靠的自增索引。
换句话说(和 tl;dr),客户端可以容忍延迟,但他们需要大量可信赖的写入吞吐量 - 比“一次写入是一次磁盘操作”更高的吞吐量。
我正在设想一个数据库,它的实现方式如下:接受(理论上受文件描述符数量限制)数量的 TCP 连接,在内存中缓冲这些写入,尽可能频繁地将它们的批次记录到磁盘(以及对自动递增索引的更新),并且仅在相关的磁盘写入操作完成时才响应这些 TCP 连接。或者它可以像延迟写入的数据库一样简单,它发布已完成磁盘写入的消息(客户端等待延迟响应,然后等待写入消息报告成功)。
我认为具有如此高的延迟容忍度,这并不过分要求。而且我想其他人也遇到过这个问题,例如金融公司,它们不能承受丢失数据,但可以承受延迟对任何客户的响应。
是否有任何久经考验的数据库解决方案(如 Postgres、CouchDB/Couchbase 或 MongoDB)支持这样的操作模式?
【问题讨论】:
标签: mongodb postgresql couchdb throughput database