【发布时间】:2011-01-12 21:59:52
【问题描述】:
我们目前正在考虑将 Postgres 更改为 CouchDB 以用于使用监控应用程序。一些数字:
大约 2000 个连接,每 5 分钟轮询一次,每天大约有 600,000 个新行。在 Postgres 中,我们按天存储这些数据:
t_usage {service_id, timestamp, data_in, data_out}
t_usage_20100101 继承 t_usage。
t_usage_20100102 继承 t_usage。等等
我们使用乐观存储过程写入数据,该过程假定分区存在并在必要时创建它。我们可以非常快速地插入。
对于数据的读取,我们的用例按重要性和当前性能排列如下:
* 单次服务,单日使用:良好的性能
* 多项服务,每月使用量:性能不佳
* 单一服务,月使用量:性能不佳
* 多个服务,多个月:性能非常差
* 多种服务,单日:良好的性能
这是有道理的,因为分区已经优化了几天,这是迄今为止我们最重要的用例。但是,我们正在研究改进次要要求的方法。
我们通常还需要按小时对查询进行参数化,例如,仅在上午 8 点到下午 6 点之间给出结果,因此汇总表的用途有限。 (这些参数变化的频率足够高,以至于创建多个数据汇总表是令人望而却步的)。
有了这个背景,第一个问题是:CouchDB 是否适合这些数据?如果是的话,鉴于上述用例,您将如何最好地对 CouchDB 文档中的数据进行建模?到目前为止,我整理的一些选项是(_id,_rev 除外):
每天每个连接一个文档
{
service_id:555
day:20100101
usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}
每月大约有 60,000 个新文档。大多数新数据将是对现有文档的更新,而不是新文档。
(这里,使用中的对象以轮询的时间戳为键,以及字节输入和输出的值)。
每月每个连接一个文档
{
service_id:555
month:201001
usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}
每月大约 2,000 个新文档。需要对现有文件进行适度更新。
每行数据收集一个文档
{
service_id:555
timestamp:1265248762
in:584
out:11342
}
{
service_id:555
timestamp:1265249062
in:94
out:1242
}
每月大约有 15,000,000 个新文档。所有数据都将插入到新文档中。插入速度更快,但我对在处理数亿个文档后一年或两年后的效率有疑问。文件 IO 似乎令人望而却步(尽管我是第一个承认我并不完全理解它的机制的人)。
我正在尝试以面向文档的方式处理此问题,尽管很难打破 RDMS 习惯 :) 您也只能最小化参数化视图这一事实让我有点担心。也就是说,以上哪个最合适?还有其他我没有考虑过的格式会更好吗?
提前致谢,
杰米。
【问题讨论】:
标签: data-modeling couchdb