我正在使用StackExchange.Redis与一对Redis服务器,主服务器和从服务器通信。当我让主人失败时,我无法写信给奴隶。
我将IServer.AllowSlaveWrites
设置为true
,并且我在两台服务器上都将slave-read-only
配置设置为no
。 (由INFO确认。)
当主服务器仍然在客户端的服务器池中(但是离线)时,我得到:
RedisConnectionException: SocketFailure on <master_ip>/Subscription
如果我将主服务器完全从服务器池中取出,我会得到:
RedisConnectionException: No connection is available to service this operation: SET ...
在第一种情况下,它似乎试图与主人交谈,并放弃失败。在第二种情况下,它与从机通信但无法执行写操作。
如何让我的客户端在没有主服务器的情况下写入从服务器?
(另见How does StackExchange.Redis use multiple endpoints and connections?)
答案 0 :(得分:3)
事实证明,库是硬编码的,不允许对从属进行写操作。
在Message
(Message.cs,第170行)的构造函数中,有以下代码:
bool masterOnly = IsMasterOnly(command);
if (masterOnly) SetMasterOnly();
对于所有写命令, IsMasterOnly()
返回true
。 SetMasterOnly()
会覆盖用户提供的所有主/从标志,以支持CommandFlags.DemandMaster
。当系统尝试写入从站时,此标志会触发上面引用的RedisConnectionException
。
我不确定为什么这个硬编码覆盖在那里,因为AllowSlaveWrites
标志和 slave_read_only
配置值已经防止了意外的从属写入(参见WriteMessageToServer()
)。
在任何情况下,从Message.cs中删除这些行似乎都允许进行预期的操作。
答案 1 :(得分:0)
我最近有类似的问题。以下是我修复它的方法:
db.Execute
正如您所看到的,from somemodule import print as print_this
方法可以解决问题。