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

群集基本上是GCE的即点即用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地址都提供给它...

最佳答案

您仅应将Redis Sentinel服务器的主机提供给RedisSentinel,因为它会从Sentinel主机获取其他主/从Redis服务器的 Activity 列表。

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

var sentinel = new RedisSentinel(sentinelHost, masterName);

启动RedisSentinel将连接到Sentinel主机并返回一个预配置的RedisClientManager(即redis连接池)
var redisManager = sentinel.Start();

然后,您可以使用以下方法在IOC中进行注册:
container.Register<IRedisClientsManager>(redisManager);

然后,RedisSentinel应该侦听Sentinel主机上的主/从更改,并相应地对 redisManager 进行故障转移。然后,处置池中的现有连接,并用新池替换新配置的主机。如果再次使用该池之外的任何 Activity 连接,它们将抛出连接异常,下次从该池中检索RedisClient时,它将使用新主机进行配置。

回调和记录

这是一个示例,说明如何使用新的回调来内省(introspection)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);
    },
};

还可以通过配置Logging in ServiceStack来启用这些事件的日志记录:
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);

关于redis - ServiceStack.Redis.Sentinel的用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28132528/

10-10 14:50