redis failover solution based on ZooKeeper

Node Redis Failover

A redis failover solution based on ZooKeeper for Node.js

Architecture chart:

  • Automatic master/slave failover
  • Read/Write Splitting
  • All components high availability
  • Support cluster
  • Custom sharding router

Install with npm:

npm install -g node-redis-failover
redis-failover -h
  Usage: redis-failover -c config.json
    -h, --help           output usage information
    -V, --version        output the version number
    -c, --config [path]  Path to JSON config file

start a redis watcher (we recommend the watchers' count should be an odd number, and more than 3):

redis-failover -c config.json

with a config file config.json (config json file support comments use json-comments):

  // zookeeper 
  "zooKeeper": {
    "servers": ",,",
    "chroot": "/test"
    //"username": "abssd", 
    //"password": 'asdfefe' 
  // redis cluster nodes 
  "nodes": [
      "name": "node_1",
      "servers": ",",
      // redis password 
      "password": "abc123",
      // redis ping timeout default 6000 ms 
      "pingTimeout": 4000,
      // redis ping interval(ms). default 3000 ms 
      "pingInterval": 1000,
      // the maxFailures for the redis. default 3 
      "maxFailures": 5
      "name": "node_2",
      "servers": ","
  // log path 
  "log": "logs/",
  // pid file 
  "pid": ""

start a watcher:

redis-failover -c config.json

start with forever

forever start -m 10 redis-failover -c config.json


npm install node-redis-failover --save

example code:

var redisFailover = require('node-redis-failover');
var zookeeper = {
  servers: ',,',
  chroot: '/appName'
var redis = redisFailover.createClient(zookeeper);
redis.on('ready', function() {
  // get the master client of 'node_1' (default master) 
  redis.getClient('node_1').ping(function(errinfo) {
  // get the slave clinet of 'node_2' 
  redis.getClient('node_1', 'slave').ping(function(errinfo) {
redis.on('change', function(namestate) {
  console.log('redis %s state changed, %j', name, state);
redis.on('masterChange', function(namestate) {
  console.log('%s master changed, %s', name, state);
redis.on('error', function(err) {
  console.log('err,', err);

(The MIT License)

Copyright (c) 2014 Johnny Wong