1

我正在运行 ServiceStack 的许可版本并尝试在 Google Cloud Compute 上设置哨兵集群。

集群基本上就是 GCE 的 click-to-deploy redis 解决方案——3台服务器。这是我用来初始化的代码...

var hosts = Settings.Redis.Host.Split(';');
var sentinel = new ServiceStack.Redis.RedisSentinel(hosts, "master");
redis = sentinel.Setup();

container.Register<IRedisClientsManager>(redis);
container.Register<ICacheClient>(redis.GetCacheClient());

客户端工作正常 - 但是一旦我关闭了其中一个 redis 实例,一切都会变得糟糕。客户端抱怨无法连接到丢失的实例。此外,即使我将实例备份 - 它处于只读模式,所以一切仍然失败。一旦你处于这种状态,似乎没有办法恢复......

难道我做错了什么?RedisSentinal 客户端不知道新主人是谁有什么原因吗?我喂它所有3个主机IP地址......

4

1 回答 1

2

您应该只提供 Redis Sentinel Server 的主机,RedisSentinel因为它从 Sentinel 主机获取其他主/从 redis 服务器的活动列表。

最近在 MyGet上可用RedisSentinel的最新v4.0.37中添加了一些更改,其中包括额外的日志记录和 Redis Sentinel 事件的回调。新的v4.0.37 API 如下所示:

var sentinel = new RedisSentinel(sentinelHost, masterName);

启动RedisSentinel会连接到Sentinel Host,并返回一个预先配置好的RedisClientManager(即redis连接池)

var redisManager = sentinel.Start();

然后您可以通过以下方式在 IOC 中注册:

container.Register<IRedisClientsManager>(redisManager);

然后RedisSentinel应该监听来自 Sentinel 主机的主/从更改,并相应地对redisManager进行故障转移。然后,池中的现有连接将被处理并替换为新配置的主机的新池。如果再次使用池之外的任何活动连接,它们将引发连接异常,下次从池中检索 RedisClient 时,它将使用新主机进行配置。

回调和日志记录

这是一个如何使用新回调来内省 RedisServer 事件的示例:

var sentinel = new RedisSentinel(sentinelHost, masterName)
{
    OnFailover = manager => 
    {
        "Redis Managers were Failed Over to new hosts".Print();
    },
    OnWorkerError = ex =>
    {
        "Worker error: {0}".Print(ex);
    },
    OnSentinelMessageReceived = (channel, msg) =>
    {
        "Received '{0}' on channel '{1}' from Sentinel".Print(channel, msg);
    },                
};

也可以通过在 ServiceStack 中配置 Logging来启用这些事件的日志记录:

LogManager.LogFactory = new ConsoleLogFactory(debugEnabled:false);

还有一个额外的显式FailoverToSentinelHosts()可用于强制RedisSentinel重新查找和故障转移到最新的主/从主机,例如:

var sentinelInfo = sentinel.FailoverToSentinelHosts();

新主机在返回的 sentinelInfo 中可用:

"Failed over to read/write: {0}, read-only: {1}".Print(
    sentinelInfo.RedisMasters, sentinelInfo.RedisSlaves);
于 2015-01-25T05:51:19.933 回答