想象一下,你有一个BankTransactions的集合.有数千条记录. (编辑:实际上并不存储事务 – 只考虑非常大量的,经常更新的记录.它基本上是来自sql-land的连接表.)
您每天都需要仅在当地银行分行发生的交易摘要视图.如果所有记录都在一个数据库中,则重新生成视图将处理来自所有分支的所有事务.这是一个更大的工作块,对于仅关心其特定文档子集的用户来说是不必要的.
这使得看起来应该将每个银行分支划分为其自己的数据库,以便以较小的块生成视图,并且彼此独立.但是我从来没有听说有人这样做过,而且它似乎是一种反模式(例如,在数千个不同的数据库中复制相同的设计文档).
我应该采用不同的方式来模拟这个问题吗? (分区是否应该在不同的机器之间进行,而不是在同一台机器上的单独数据库?)如果没有,CouchDB可以处理数千个数据库来保持分区小吗?
(谢谢!)
解决方法
简短的回答是“是”.
更长的答案是你需要注意一些事情……
>你将使用许多系统设置(如最大文件描述符)来玩whack-a-mole.
>你也将使用erlang vm设置玩whack-a-mole.
> CouchDB具有“最大开放数据库”选项.增加这个,否则你将有待处理的待处理请求.
>聚合多个数据库以生成报告将成为PITA.您可以通过轮询每个数据库的_changes Feed,修改数据,然后将其重新放回中央/聚合数据库来完成. CouchDB的API中还没有使用这种工具来简化这项工作.几乎,但不完全.
但是,如果你尝试这样做,你将遇到的最大问题是CouchDB本身不能水平扩展[well].如果你添加更多的CouchDB服务器,他们都将拥有重复的数据.当然,你的最大开放dbs计数将随着每个节点的增加而线性扩展,但其他方面如视图构建时间则不会(例如,他们都需要进行自己的视图构建).
虽然我在BigCouch集群上看到过数千个开放数据库.有趣的是,这是因为发电机集群:更多的节点并行执行不同的事情,而相对于彼此复制的CouchDB服务器.
干杯.