跳转到主要内容
Dan 提交于 13 December 2012

Drupal还有其它有着大量写入操作的部分:日志(Watchdog,亦见直译为“看门狗”,本文使用“日志”这个译法。——译者注)和会话。会话子系统维持用户的登录状态;所以它需要在每个页面加载时执行写入。MongoDB的快速写入使得这不是问题。一旦你运行了mongod,并且安装了Drupal模块,只要加入:

$conf['session_inc'] = DRUPAL_ROOT . '/sites/all/modules/mongodb/mongodb_session/mongodb_session.inc';

到(sites/default或相应的sites目录下的)settings.php中,MongoDB就会接管会话,再次让站点加速。

日志(Watchdog)有点棘手,因为如果某个原因导致有大量的错误消息(比如大规模蠕虫爆发试图获取不存在的URL),SQL数据表可能会增长到一个尺寸,以致唯一可行的操作是完全丢弃(TRUNCATE)它。删除旧行可能都无法招架写入的洪流,而且写入还有点慢。传统作法是使用系统日志(syslog),就是一个文本文件,所以查询起来不是最简单的。使用MongoDB,你可以指定一个集合只应保留最后的N个文档,然后自动重来,覆盖掉旧的消息,所以永远不会有多于指定数目的消息,让查询轻松而方便。同时,Drupal的日志实现把不同的消息放到不同的集合里,所以对于每个消息,都不会有多于指定数目的消息被记录。例如,“评论被创建”的消息不会被php错误消息挤掉。要使用这个功能,启用mongodb_watchdog,并禁用dblog模块。

最后,Drupal 7有一个消息队列,它也可以用MongoDB来实现。有很多队列,但是如果你已经为字段存储、日志和会话部署了MongoDB,那么使用MongoDB的快速写入来取代SQL是够便利的了。只要添加:

$conf['queue_default_class'] = 'MongoDBQueue';

settings.php中你就搞定了。你已经看到如何利用MongoDB作为字段存储引擎、存储会话数据、记录日志消息以及作为队列机制。把它用作缓存也是可能的,但memcache用于那个目的更好(因为它在伸缩性方面做得更加细致)。