This setup will start up 3 separate VMs using Vagrant in order to simulate a 2-server Redis installation and a single-server Apache ZooKeeper installation in order to test the redis_failover gem in a non-trivial configuration. All configuration management of the virutal machines is done using Chef cookbooks.
To download the base box and start/configure the 3 VMs, run git submodule init && git submodule update && vagrant up in the root of the project. It may take a while the first time you start it as it has to compile ruby and redis as well as install a few packages.
Once this is finished, you can connect to the different boxes using the vagrant ssh command:
vagrant ssh zookeeper
vagrant ssh redis_master
vagrant ssh redis_slave
Or, you can access the machines individually by using the host-only IP addresses given by vagrant (which are completely accessible to the host machine with no firewall):
| IP | Machine |
|---|---|
192.168.50.10 | zookeeper |
192.168.50.20 | redis_master |
192.168.50.21 | redis_slave |
If for some reason these IPs do not work for your network configuration you can change them by modifying the Vagrantfile's 'hostonly' and chef 'slave' lines, as well as the redis_node_manager.yml.erb file under the zookeeperbox chef recipe.
To set up Redis Node Manager (this handles the actual failing-over and provides a view at the console of what's going on in the entire system), vagrant ssh zookeeper and run the following from the home directory:
redis_node_manager -C redis_node_manager.yml
This will check all of the Redis instances in the list provided by the YAML file and periodically poll them to ensure that they are up. If the master goes down, it will promote one of the slaves to master.
You can now connect to the redis_failover managed farm from your host machine. You can do this by creating an instance of the RedisFailover::Client class and specifying the zookeper virtual machine's IP.
require 'rubygems'
require 'bundler/setup'
require 'redis_failover'
client = RedisFailover::Client.new(:zkservers => '192.168.50.10:2181')This client object is now an instance of RedisFailover::Client which has the magical property of having the same interface of the standard redis-rb-gem client object. The only difference is that it now automatically switches to communicate directly with the current master Redis instance.
If you'd like to use Resque with our failover-friendly Redis client, you can set the Redis client that Resque uses like this:
failover_client = RedisFailover::Client.new(:zkservers => '192.168.50.10:2181')
Resque.redis = failover_clientThe RedisFailover::Client class has the same interface as the regular redis and is completely drop-in compatible.
You can shutdown individual instances of Redis in order to verify that the failover configuration is working. Replace redis_master with redis_slave in the following example if you'd like to shutdown the slave.
host$ vagrant ssh redis_master
...
...
vagrant@lucid32:~$ sudo initctl stop redis
redis stop/waiting
vagrant@lucid32:~$
You can bring the instance up with sudo initctl start redis.