问题描述
我为 HA redis 集群(2 个副本、1 个主节点、3 个哨兵)设置了本地 docker 环境。只有哨兵暴露端口(10021、10022、10023)。
我使用的是 stackexchange.redis C# 客户端 v.2.1.58,并尝试做一些基本操作。
这是我的示例代码。
Configurationoptions configuration = new Configurationoptions
{
/// sentinels
EndPoints =
{
{ "localhost",10021 },{ "localhost",10022 },10023 }
},CommandMap = CommandMap.Sentinel,ServiceName = "redismaster",Ssl = false,};
ConnectionMultiplexer connection = ConnectionMultiplexer.SentinelConnect(configuration,Console.Out);
IDatabase database = connection.GetDatabase();
尝试设置操作时
database.StringSetAsync("key","value");
我要了
此操作已在命令映射中禁用且无法使用:SET
我认为操作是针对哨兵节点完成的,但我不确定。
对此有帮助吗?
在此处回购 https://github.com/rms1234567890/redis-sentinel
解决方法
由于 StackExchange Redis 的最新变化,这将不起作用,您需要使用类似服务名称的 Sentiels 直接连接
using(var connection2= ConnectionMultiplexer.Connect("localhost:10021,localhost:10022,localhost:10023,serviceName=redismaster,AllowAdmin=true"))
{
IDatabase database2 = connection.GetDatabase();
database2.StringSet("test-key","value");
database.StringGet("test-key");
}
当您在本地机器上运行应用程序时,即使这也会失败,但如果您在与哨兵/Redis 相同的网络中的 docker 实例中运行它,这应该可以工作。简而言之,您还需要公开主 Redis 实例的端口,因为另一个从站也可以成为主站,因此您需要允许所有 Redis 实例(主站、从站和哨兵)的入站流量规则