如何在node.js上集成redis-sentinel-client和socket.io?

时间:2013-07-15 20:18:00

标签: node.js redis socket.io redis-sentinel

如何将socket.io和主从Redis配置与自动故障转移集成?

1 个答案:

答案 0 :(得分:0)

我使用了以下配置:

  1. 创建一个主redis实例。
  2. 创建三个redis-sentinel-client进程并将它们指向主redis实例。您只需要在下面的配置中引用其中一个,因为客户端将填写其余部分。
  3. 创建一个slave redis实例,并将其指向master。
  4. 使用以下命令配置带有socket.io的RedisStore:

    var redisOptions = {
      host: 'localhost', // || redisSentinelHost,
      port: 26379, // Default sentinel port.
      masterName: 'mymaster'
    };
    
    var RedisStore = require('socket.io/lib/stores/redis'),
      // The redis-sentinel-client requires a forked redis client
      // that is available here:
      redis = require('redis-sentinel-client/node_modules/redis'),
    
      // A sentinel client is required to back each of the redis
      // clients below. The sentinel clients handle the fail-overs.
      sentinel = require('redis-sentinel-client'),
      redisPubSentinel = sentinel.createClient(redisOptions),
      redisSubSentinel = sentinel.createClient(redisOptions),
      redisClientSentinel = sentinel.createClient(redisOptions),
      redisPub = redisClientSentinel.getMaster(),
      redisSub = redisSubSentinel.getMaster(),
      redisClient = redisPubSentinel.getMaster();
    
    // We must be robust to connection errors in order to allow
    // for a reconnect. We therefore prevent redis client errors
    // from stopping the application.
    [ redisPubSentinel,
      redisSubSentinel,
      redisClientSentinel,
      redisPub,
      redisSub,
      redisClient ].forEach(function(c) {
      c.on('error', function(err) {
        logger.log(err);
      });
    });
    
    io.set('store', new RedisStore({
      redis: redis,
      redisPub: redisPub,
      redisSub: redisSub,
      redisClient: redisClient
      })
    );