Friday, January 1, 2010

Running ferret server with mongrel and shared index folder

If you are using acts_as_ferret plugin for searching in your rails application then you must have faced some issues with indexing or running ferret server on your production server. In this post, I will share with you some tips about running and maintaining ferret server:
  • Running ferret server on production
  • Sharing your ferret index folder
  • Write a simple script to re-index all your data

Running your ferret server
If you have multiple instances of mongrel running in your production, then you must need to run the ferret server to handle situations when multiple processes are updating ferret index at the same time. If you want to run ferret server in your production server, then at first you have to open the port you set in ferret_server.yml of your config directory on the server you want to run it. acts_as_ferret comes with a built-in drb server which uses dRuby protocol. So, you should remember to open the port with other protocol (not http or something else). One very important thing is to change the following section of your /vendor/plugins/acts_as_ferret/lib/server_manager.rb as follows:
require(File.join(File.dirname(__FILE__), '../../../../config/environment'))
#require(File.join(File.dirname(ENV['_']), '../config/environment'))

Make sure you run the ferret server before running mongrel or apache. Now you can start the ferret server with the following command:
ruby /{YOUR_APP_DIRECTORY}/script/ferret_server -e production start

Also, the you can stop your ferret server with the following command:
ruby /{YOUR_APP_DIRECTORY}/script/ferret_server -e production stop

After you have started you ferret server you can start your mongrel and apache server. When mongrel is being started it checks for index folder in your app directory. If it does not find one it creates one. So, it’s possible that you will have different index folder with each deployment which is costly and re-indexing every time after your deployment is not at all a good solution.

Sharing your ferret index folder
You can set a default index folder in your production server which will be shared. To do this create a folder with read/write permission and create symlink to this folder each time you deploy and before starting the server. If you are using Capistrano for your deployment then make sure to run the symlink creation script before starting mongrel/apache. Otherwise the index folder will be created with the start of mongrel. A sample script could be like this:

run "ln -s /mnt/app/shared/ferret/ /mnt/app/current/index"

A simple script for ferret re-indexing
Here is a sample rake task for re-indexing your application data:
desc "Updates the ferret index for the application."
task :ferret_index => [ :environment ] do | t |
Model1.rebuild_index
puts "Completed Index Rebuild of Model1 model"
Model2.rebuild_index
puts "Completed Index Rebuild of Model2 model"
Model3.rebuild_index
puts "Completed Index Rebuild of Model3 model"
end

To run rake task use the command:
rake ferret_index RAILS_ENV=environment

Make sure to restart your mongrel and apache server to point to the newer version of the index folder created within the directory you set after re-indexing is completed.

1 comment: