redis sentinel,主机挂起时不通知客户端

wz3gfoph  于 2021-06-08  发布在  Redis
关注(0)|答案(0)|浏览(271)

问题:我的redis sentinel客户机(用c#编写)在中描述的故障转移场景中没有收到主机故障的通知https://redis.io/topics/sentinel (测试故障转移一章,redis cli-p 6379 debug sleep 30)
当我杀死(kill-9pid\u of \u master\u redis-server)主示例时,一切都很好。然后所有4个哨兵同意新主人,并尽快通知客户新主人。
但是。。。当我模拟挂起主机(redis cli-p 6379 debug sleep 30)时,sentinel也会选择新的主机(使用sentinel get master addr by name mymaster进行检查),但是客户端没有收到通知,仍然会收到redistimeoutexception错误。在休眠期结束之前,客户端将出错,否则我将杀死正在休眠的redis示例。当这个(旧的)主服务器唤醒时,它会自动更改为从属服务器(因为同时其他示例被选为主服务器)。在“唤醒”之后,客户机停止获取错误。
我想知道这两种情况有什么不同。注意,官方redis sentinel文档中描述了以这种方式“测试故障转移”(debug sleep)。
我的配置如下:
4个哨兵
4台redis服务器
我有4个centos示例,每个示例上都有1xsentinel和1xredis
复制模式:1xmaster 3xslave
配置:
redis.conf文件

port 6379
requirepass TestRedis
masterauth TestRedis

哨兵.conf

port 26379
protected-mode no

dir "/tmp"

sentinel monitor mymaster 192.168.1.120 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel auth-pass mymaster TestRedis

客户端应用程序:

var cs = "192.168.1.120:26379," +
    "192.168.1.122:26379," +
    "192.168.1.121:26379," +
    "192.168.1.129:26379," +
    "connectTimeout=500," +
    "serviceName=mymaster," +
    "password=TestRedis";

var cm = ConnectionMultiplexer.Connect(cs);
var db = cm.GetDatabase();

while (true)
{
    Console.WriteLine("===============");

    try
    {
        Console.WriteLine($"Now={DateTime.Now} # key={db.StringGet("now123")}");
        db.StringSet("now123", System.Text.Encoding.UTF8.GetBytes(DateTime.Now.ToString()));
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }

    Console.WriteLine("===============");
    System.Threading.Thread.Sleep(120);
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题