问题:我的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);
}
暂无答案!
目前还没有任何答案,快来回答吧!