redis 使用一段时间后,变成了只读副本
来源:15-5 项目部署:使用docker进行部署

qq_慕田峪3144384
2023-04-09
问题:为什么我的 redis 使用过一段时间后就报错了:Redis Connection error: ReplyError: READONLY You can’t write against ,重启 redis 后就好了
redis 配置:
docker-compose.yml
# Use root/example as user/password credentials
version: '3.1'
...
redis:
image: redis
restart: always
ports:
- 6379:6379
app.module.ts
@Global()
@Module({
imports: [
RedisModule.forRootAsync({
useFactory: (configService: ConfigService, logger: LoggerService) => {
const host = configService.get(ConfigEnum.REDIS_HOST);
const port = configService.get(ConfigEnum.REDIS_PORT);
const password = configService.get(ConfigEnum.REDIS_PASSWORD);
const url = password ? `redis://${password}@${host}:${port}` : `redis://${host}:${port}`;
return {
config: {
url,
reconnectOnError: err => {
logger.error(`Redis Connection error: ${err}`, url);
return true;
},
},
};
},
}),
],
})
export class AppModule {}
用法:
await this.redis.set(`${to}_code`, code, 'EX', 60 * 30);
gpt 回答:
当您遇到 “Redis Connection error: ReplyError: READONLY You can’t write against” 错误时,这意味着您的 Redis 客户端正在尝试写入一个只读的 Redis 实例。这通常发生在您连接到的 Redis 实例是主实例的只读副本时。在某些情况下,这可能是因为您的 Redis 客户端配置了负载均衡,而某个节点被标记为只读。
重启 Redis 服务可能会临时解决问题,因为在重启后,所有的副本将重新连接到主实例。但是,如果配置不当或者负载均衡策略导致的问题,重启可能并非长久之计。
要解决这个问题,您可以:
确保您的客户端连接到正确的 Redis 实例。如果您只有一个 Redis 实例,那么确保客户端连接到这个实例。如果您使用的是 Redis 集群,确保客户端连接到主实例而不是只读副本。
检查您的客户端是否配置了正确的负载均衡策略。在某些情况下,负载均衡策略可能导致客户端将写入操作路由到只读副本。确保您的负载均衡策略不会将写入操作路由到只读副本。
如果您使用的是 Redis Sentinel,确保 Sentinel 正确配置并监控主实例。Sentinel 可能会在主实例出现故障时提升一个副本为新的主实例。确保 Sentinel 正确地检测到主实例并将其标记为主实例。
通过审查和修改您的配置,您应该能够解决这个问题并避免在将来重新出现。
1回答
-
Brian
2023-04-11
高端,小伙伴GPT中得可以啊,这个提示是比较奇怪,你有没有修改过redis的配置?
可以考虑重新创建一个redis实例,docker-compose down && docker-compose up -d
根据你提供的信息,我也查询了一下,这个报错是由于redis把自己当成了slave,如果redis是master则不会有这个问题,可以在 Redis 命令行中执行 SLAVEOF NO ONE 命令来将 Redis 实例设置为主节点
022023-05-09
相似问题