优化CouchDB的读性能

日期: 2012-03-18 作者:nosqlfan 来源:TechTarget中国

  CouchDB可能是我见过最有创意的NoSQL产品。它通过append only的方式去组织数据,这样就能够通过对增量数据执行MapReduce的方法来生成数据视图。这一套方法背后是一个完整的体系。

  当然,这也会引发一些问题,因为CouchDB默认是在读时合并修改的,也就是说,在数据读取时,CouchDB会先判断上次视图更新后又有多少新的写操作,然后将这些写操作通过MapReduce方法合并到视图中。并记录这一次更新的操作点。

  很显然,这样每次进行合并更新可能降低读性能。特别是当遇到两次读之间的间隔过大时。可能会导致大量的写操作需要合并进视图,从而让读操作变得很慢。

  那有什么方法可能解决这个问题。下面是一些具体的做法,你是否能接受这些做法可能还得看你的业务情况。

  1.使用旧的视图

  CouchDB在视图时,默认会进行写操作合并工作,这是我们上面讲过的。但是这里也说了,这只是一个默认,实际上你完全可以通过设置让其不更新视图,直接返回数据。当然,不更新,也就意味着你的数据不是最新的。所以说这需要你的业务能够接受。具体做法如下:

GET http://couchbase:5984/recipes/_design/recipes/_view/by_recipe?stale=ok

  说白了就是添加一个stale=ok的参数。

  2.延迟合并

  如果我们一直使用上面的方法。那么我们的数据可能就再也不会进行合并更新了。相信这是任何业务都难以忍受的。所以CouchDB还提供另一个stale的设置值,你可以设置它在读操作中返回旧的数据。然后CouchDB在返回数据后再自己执行合并工作。具体做法:

GET http://couchbase:5984/recipes/_design/recipes/_view/by_recipe?stale=update_after

  跟上面的很像,只是stale参数值变成了update_after,也就是随后更新。

  3.定时更新

  如果上面两种方式都不能让你满意,我们来看一下下面一个。CouchDB支持一个叫_change feed的特性,它像是订阅一样,会将所有变更操作推给订阅了此消息的客户端。于是我们就可以通过脚本去订阅变更。并且在变更时主动更新视图了。这里使用python客户端为例,具体做法如下:

  from couchdb import
  Server
  cdbs = Server(‘http://localhost:5984/’)
  db = cdbs[‘recipes’]
  # the since parameter defaults to ‘last_seq’ when using continuous feed
  ch = db.changes(feed=’continuous’,heartbeat=’1000′)
  counter = 0
  for line in ch:
  counter=counter+1
  if (counter > 10):
  db.view(‘recipes/by_name’)
  counter = 0

  上面例子中有一个counter计数,每当有更新时,将counter加1,当counter达到10时,就去主动更新视图。也就是制定每10次写操作就更新一次视图。这样读客户端就可以永远使用stale=ok的方式来读取数据就行了。

  实际上,如果你设定counter为1时就更新视图,那么CouchDB就退化成为我们通常使用的写时更新索引的存储系统了。比如MongoDB或者MySQL。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

nosqlfan
nosqlfan

相关推荐