The mongoDB provides high performance, high availability, and easy scalability. Using it with Drupal, will take some load off its SQL database. The read/write SQL procedures in Drupal functions like: session, log entries from watchdog, cache, fields, queue and block can be handled by mongoDB Drupal module. And this will greatly improve the perfomance of your Drupal site.
As of this writing the mongodb module is still in 7.x-1.0-rc2 version and obviously is not stable. Another is that this module does not run 100% mongoDB database on your Drupal and still some components are dependant on SQL.
We will take a look on how to setup mongoDB and integrate it with Drupal 7 Panopoly distribution. Panopoly profile is a very good building foundation for a Drupal site. The following procedures are tested on my Linode server running Centos 7 64-bit Linux distribution. And it is required that you have "drush" installed in your system.
Setup Mongodb service
- Use the mongoDB repo and configure the package management system to make it available in our yum:
vi /etc/yum.repos.d/mongodb-org-3.0.repo
... and write the following as content of this repo file:
[mongodb-org-3.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.0/x86_64/ gpgcheck=0 enabled=1
- Execute the the following command to install mongoDB:
yum install mongodb-org.x86_64
- Modify the mongod.conf:
vi /etc/mongod.conf
... and add the following config items:
auth=true smallfiles=true
The "auth=true" to enable the security and "smallfiles=true" to solve this issue.
- Create a super user:
mongo
... a mongoDB prompt will show and execute the following commands:
use admin db.createUser( { user: "admin", pwd: "password", roles: [ "root" ] } ) quit()
Next time you login to your mongo command prompt, execute this command:
mongo -u admin -p --authenticationDatabase admin
- Register mongoDB's log to logrotate:
vi /etc/logrotate.d/mongodb
Have the following scripts as content:
/var/log/mongodb/*.log { daily rotate 30 compress dateext missingok notifempty sharedscripts copytruncate postrotate /bin/kill -SIGUSR1 `cat /var/lib/mongo/mongod.lock 2> /dev/null` 2> /dev/null || true endscript }
- Run the mongoDB service:
systemctl start mongod.service
Install mongodb PHP driver
- Install the tools for building PHP extensions:
yum install php-devel php-pear
- Download the mongodb PHP driver from github:
cd /opt git clone https://github.com/mongodb/mongo-php-driver
- Compile and install the mongodb PHP driver:
cd mongo-php-driver phpize ./configure make sudo make install echo "extension=mongo.so" > /etc/php.d/mongo.ini
- Restart your web server:
systemctl restart httpd.service
Setup mongoDB in Drupal
- Download Drupal 7 Panopoly distro into your web directory (in my case its "/home/webfoobar/public_html") and install it:
cd /home/webfoobar/public_html drush dl panopoly-7.x-1.51 mv panopoly-7.x-1.51/{.,}* . rm -rf panopoly-7.x-1.51 cd profiles/panopoly/modules/contrib/devel curl https://www.drupal.org/files/issues/fatal-dd-2559061-12.patch | patch -p1 drush si panopoly --account-name=admin --account-pass=password --db-url=mysql://admin:[email protected]/mydatabase
Note: Ignore the errors. Those errors will not prevent us from running our Drupal site. The last command will create the "mydatabase" database automatically.
- Download and enable the mongodb module:
cd ../../../../../sites/all/modules git clone --branch 7.x-1.x https://git.drupal.org/project/mongodb.git cd mongodb git checkout 006e78d07cc45817e6fcc7f4a2ddb17eb6220538 curl https://www.webfoobar.com/sites/webfoobar.com/files/article_attachment/mongodb-fix-1961728.patch | patch -p1 composer require alcaeus/mongo-php-adapter drush dis block drush en mongodb mongodb_block_ui mongodb_watchdog mongodb_field_storage mongodb_session mongodb_cache mongodb_queue mongodb_block mongodb_migrate
Note: Ignore the errors. Those errors will not prevent us from running our Drupal site.
- Edit your Drupal settings file:
vi ../../../default/settings.php
... and append these PHP codes:
/** * MongoDB configurations */ $conf['mongodb_connections'] = array( // Connection name/alias 'default' => array( // Omit USER:PASS@ if Mongo isn't configured to use authentication. 'host' => 'mongodb://admin:[email protected]', // Database name 'db' => 'mymongodatabase', ), ); #$conf['mongodb_debug'] = TRUE; $conf['cache_backends'][] = 'sites/all/modules/mongodb/mongodb_cache/mongodb_cache.inc'; $conf['cache_default_class'] = 'DrupalMongoDBCache'; // The 'cache_form' bin must be assigned to non-volatile storage. $conf['cache_class_cache_form'] = 'DrupalDatabaseCache'; // Don't touch SQL if in Cache $conf['page_cache_without_database'] = TRUE; $conf['page_cache_invoke_hooks'] = FALSE; $conf['field_storage_default'] = 'mongodb_field_storage'; $conf['mongodb_watchdog'] = 'watchdog'; $conf['mongodb_watchdog_items'] = 10000; $conf['watchdog_limit'] = WATCHDOG_ERROR; $conf['mongodb_session'] = 'session'; $conf['session_inc'] = 'sites/all/modules/mongodb/mongodb_session/mongodb_session.inc'; $conf['cache_session'] = 'DrupalMongoDBCache';
Note: Make sure to change the "host" and "db" with your mongodb credentials and database.
- Run the drush commands to migrate the Drupal fields:
drush mongodb-migrate-prepare drush mongodb-migrate
- Congratulations! Login to your new Drupal 7 Panopoly with mongoDB backed site.
You may want also to check this article: Setup Rock Mongo web interface.