2016-05-31 6 views
1

Я использую StackExchange.Redis, чтобы поговорить с парой серверов Redis, мастером и подчиненным. Когда я терплю мастер, я не могу писать рабу.Как написать подчиненному с помощью StackExchange.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?)

ответ

1

Оказывается библиотека жёстко, чтобы не позволить операции записи рабов.

В конструкторе Message (Message.cs, линия 170), есть следующий код:

bool masterOnly = IsMasterOnly(command); 
if (masterOnly) SetMasterOnly(); 

IsMasterOnly() возвращает true для всех команд записи. SetMasterOnly() переопределяет любые флаги ведущего/ведомого пользователя, предоставленные в пользу CommandFlags.DemandMaster. Когда система пытается выполнить запись в подчиненное устройство, этот флаг запускает приведенный выше RedisConnectionException.

Я не знаю, почему это жёстко переопределения там, как AllowSlaveWrites флага иslave_read_only значения конфигурации уже защит от случайных ведомого пишет (см WriteMessageToServer()).

В любом случае удаление этих строк из Message.cs, по-видимому, позволяет ожидать ожидаемую операцию.

0

У меня недавно была аналогичная проблема. Вот как я установил его:

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 метода будет делать трюк.

 Смежные вопросы

  • Нет связанных вопросов^_^