Мне нужна помощь. Наша служба использует версию салата 5.1.6, и в общей сложности развернуто 22 узла докеров.
Всякий раз, когда служба развертывается, появляется несколько узлов докеров ОШИБКА: ТОЛЬКО ДЛЯ ЧТЕНИЯ Вы не можете писать против Ведомое устройство только для чтения.
Перезапустите проблемный докер-узел. ОШИБКА больше не появляется.
- Конфигурация сервера Redis:
8 master 8 slave
stop-write-on-bgsave-error no
slave-serve-stale-data yes
slave-only read yes
с поддержкой кластера yes
файл конфигурации кластера /data/server/redis-cluster/{port}/conf/node.conf
- конфигурация салата:
ClientResources res = DefaultClientResources.builder()
.commandLatencyPublisherOptions(
DefaultEventPublisherOptions.builder()
.eventEmitInterval(Duration.ofSeconds(5))
.build()
)
.build();
redisClusterClient = RedisClusterClient.create(res, REDIS_CLUSTER_URI);
redisClusterClient.setOptions(
ClusterClientOptions.builder()
.maxRedirects(99)
.socketOptions(SocketOptions.builder().keepAlive(true).build())
.topologyRefreshOptions(
ClusterTopologyRefreshOptions.builder()
.enableAllAdaptiveRefreshTriggers()
.build())
.build());
RedisAdvancedClusterCommands<String, String> command = redisClusterClient.connect().sync();
command.setex("some key", 18000, "some value");
- Исключение, которое появляется:
io.lettuce.core.RedisCommandExecutionException: READONLY You can't write against a read only slave.
at io.lettuce.core.ExceptionFactory.createExecutionException(ExceptionFactory.java:135)
at io.lettuce.core.LettuceFutures.awaitOrCancel(LettuceFutures.java:122)
at io.lettuce.core.cluster.ClusterFutureSyncInvocationHandler.handleInvocation(ClusterFutureSyncInvocationHandler.java:123)
at io.lettuce.core.internal.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:80)
at com.sun.proxy.$Proxy135.setex(Unknown Source)
at com.xueqiu.infra.redis4.RedisClusterImpl.lambda$setex$164(RedisClusterImpl.java:1489)
at com.xueqiu.infra.redis4.RedisClusterImpl$$Lambda$1422/1017847781.apply(Unknown Source)
at com.xueqiu.infra.redis4.RedisClusterImpl.execute(RedisClusterImpl.java:526)
at com.xueqiu.infra.redis4.RedisClusterImpl.executeTotal(RedisClusterImpl.java:491)
at com.xueqiu.infra.redis4.RedisClusterImpl.setex(RedisClusterImpl.java:1489)
READONLY
, так как Redis Cluster обычно отправляет перенаправлениеMOVED
для команд записи в реплике. - person mp911de   schedule 03.08.2020