如何使用 StackExchange.Redis 写入从站?
How do I write to a slave using StackExchange.Redis?
我正在使用 StackExchange.Redis 与一对 Redis 服务器、一个主服务器和一个从服务器通信。当我让 master 失败时,我无法写入 slave。
我将 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?)
原来这个库是硬编码的,不允许对从设备进行写操作。
在Message
的构造函数中(Message.cs,第170行),有如下代码:
bool masterOnly = IsMasterOnly(command);
if (masterOnly) SetMasterOnly();
IsMasterOnly()
returns true
用于所有写入命令。 SetMasterOnly()
覆盖用户提供的支持 CommandFlags.DemandMaster
的任何 master/slave 标志。当系统尝试写入从站时,此标志会触发上面引用的 RedisConnectionException
。
我不确定为什么这个硬编码覆盖在那里,因为 AllowSlaveWrites
标志 和 slave_read_only
配置值已经防止意外从属写(见 WriteMessageToServer()
)。
无论如何,从 Message.cs 中删除这些行似乎可以实现预期的操作。
我最近遇到了类似的问题。这是我修复它的方法:
IConnectionMultiplexer con = ConnectionMultiplexer.Connect("127.0.0.1:6379");
IDatabase db = con.GetDatabase();
db.Execute("ZINTERSTORE", key, 2, first, second, "WEIGHTS", 0, 1);
正如您在上面看到的 db.Execute
方法可以解决问题。
这是我的代码:
IServer ser = RedisConn.GetServer("192.168.1.1", 6379);
ser.AllowSlaveWrites = true;
ser.Execute("set",new object[2] { "test",1});
我正在使用 StackExchange.Redis 与一对 Redis 服务器、一个主服务器和一个从服务器通信。当我让 master 失败时,我无法写入 slave。
我将 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?)
原来这个库是硬编码的,不允许对从设备进行写操作。
在Message
的构造函数中(Message.cs,第170行),有如下代码:
bool masterOnly = IsMasterOnly(command);
if (masterOnly) SetMasterOnly();
IsMasterOnly()
returns true
用于所有写入命令。 SetMasterOnly()
覆盖用户提供的支持 CommandFlags.DemandMaster
的任何 master/slave 标志。当系统尝试写入从站时,此标志会触发上面引用的 RedisConnectionException
。
我不确定为什么这个硬编码覆盖在那里,因为 AllowSlaveWrites
标志 和 slave_read_only
配置值已经防止意外从属写(见 WriteMessageToServer()
)。
无论如何,从 Message.cs 中删除这些行似乎可以实现预期的操作。
我最近遇到了类似的问题。这是我修复它的方法:
IConnectionMultiplexer con = ConnectionMultiplexer.Connect("127.0.0.1:6379");
IDatabase db = con.GetDatabase();
db.Execute("ZINTERSTORE", key, 2, first, second, "WEIGHTS", 0, 1);
正如您在上面看到的 db.Execute
方法可以解决问题。
这是我的代码:
IServer ser = RedisConn.GetServer("192.168.1.1", 6379);
ser.AllowSlaveWrites = true;
ser.Execute("set",new object[2] { "test",1});