警告:Sentinel 无法在磁盘上保存新配置!!!:设备或资源繁忙

问题描述 投票:0回答:2

我正在尝试在 docker 上设置一主一从和一哨兵,为此我编写了这个 docker compose 文件。

version: '3'
services:
  redis-master:
    container_name: "redis-master"
    image: redis
    ports:
      - "6379:6379"
    command: "redis-server /etc/redis.conf"
    volumes:
      - "./data/master:/data/"
      - "./master.conf:/etc/redis.conf"

  redis-slave:
    container_name: "redis-slave"
    image: redis
    ports:
      - "6380:6379"
    command: "redis-server /etc/redis.conf"
    volumes:
      - "./data/slave:/data/"
      - "./slave.conf:/etc/redis.conf"
    depends_on:
      - redis-master

  redis-sentinel:
    container_name: 'redis-sentinel'
    image: redis
    ports:
      - "26379:26379"
    command: >
      bash -c "chmod 777 /etc/sentinel.conf
      && redis-server /etc/sentinel.conf --sentinel"
    volumes:
      - "./sentinel.conf:/etc/sentinel.conf"
    depends_on:
      - redis-master
      - redis-slave

但是当我尝试使用

sudo docker-compose up --build --force
构建它时,除了 redis-sentinel 之外,所有服务都运行良好。我在日志中收到此错误

redis-sentinel    | 1:X 16 Dec 2021 19:15:21.486 # +sdown master mymaster 172.23.0.2 6379
redis-sentinel    | 1:X 16 Dec 2021 19:15:21.486 # +odown master mymaster 172.23.0.2 6379 #quorum 1/1
redis-sentinel    | 1:X 16 Dec 2021 19:15:21.486 # +new-epoch 8
redis-sentinel    | 1:X 16 Dec 2021 19:15:21.487 # +try-failover master mymaster 172.23.0.2 6379
redis-sentinel    | 1:X 16 Dec 2021 19:15:22.955 # Could not rename tmp config file (Device or resource busy)
redis-sentinel    | 1:X 16 Dec 2021 19:15:22.955 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy

我知道这是一些文件权限,我必须使 Sentinel.conf 可执行,但我无法在 docker 中想到任何可能的解决方案。

docker docker-compose redis docker-machine redis-sentinel
2个回答
6
投票

首先哨兵命令应该只有这样(稍后我们会整理权限):

redis-server /etc/sentinel.conf --sentinel

为了解决该警告,您必须执行以下操作(对于所有 Redis 节点 - 主节点、从节点、哨兵节点):

在 docker-compose.yml 所在的文件夹中,创建一个“config”文件夹,其结构如下:

/config
  /redis-master
     redis.conf
  /redis-slave
     redis.conf
  /redis-sentinel
     redis.conf

在 config/redis-master 文件夹中,将当前的 master.conf 文件复制为 redis.conf(为了简单起见)。

在 config/redis-slave 中,将当前的 slave.conf 文件复制为 redis.conf

在 config/redis-sentinel 中,您将当前的 sentinel.conf 复制为 redis.conf

然后,执行此命令,以便授予“config”文件夹中所有内容的完全权限:

chmod -R 0777 config/

现在,在 docker-compose 中更改服务定义,如下所示: (注意我在“命令”和“卷”部分中的更改)

  redis-master:
    container_name: "redis-master"
    image: redis
    ports:
      - "6379:6379"
    command: "redis-server /etc/redis-config/redis.conf"
    volumes:
      - "./data/master:/data/"
      - "./config/redis-master:/etc/redis-config"
  redis-slave:
    container_name: "redis-slave"
    image: redis
    ports:
      - "6380:6379"
    command: "redis-server /etc/redis-config/redis.conf"
    volumes:
      - "./data/slave:/data/"
      - "./config/redis-slave:/etc/redis-config"
    depends_on:
      - redis-master
  redis-sentinel:
    container_name: 'redis-sentinel'
    image: redis
    ports:
      - "26379:26379"
    command: "redis-server /etc/redis-config/redis.conf --sentinel"
    volumes:
      - "./config/redis-sentinel:/etc/redis-config"
    depends_on:
      - redis-master
      - redis-slave

结论:

  1. 为了让redis有修改配置的权限,你必须挂载整个配置文件夹,而不是文件本身(并且文件夹内容应该是可写的)。
  2. 备份所有原来的master.conf、slave.conf、sentinel.conf文件。请注意,redis 会更改您的本地配置文件(redis.conf),因为最终您将执行故障转移,因此从配置将变成主配置,而主配置则相反。如何避免将更改提交到源代码管理取决于您。例如,您可以将原始文件保存在单独的文件夹中,并在运行“docker-compose up”命令之前通过部署脚本将它们复制到安装的文件夹中。
  3. redis 将应用于这些配置文件的所有更改都将附加在配置的末尾,并前面带有此注释:
# Generated by CONFIG REWRITE

这个解决方案经过我的测试并且有效。在阅读了 @yossigo 关于类似警告的答案后,我提出了这个解决方案:

https://github.com/redis/redis/issues/8172


0
投票

补充Alexandru的答案,也可以先将Redis配置文件从主机复制到容器内某个路径中的容器中,只是为了挂载它,然后在容器启动时创建config文件夹,以便Redis可以在其中写入无缝连接,如本例所示 =>

# ...
  my_redis_container:
    command: ["bash", "-c", "mkdir -p /etc/redis-config && cp /redis.conf /etc/redis-config/redis.conf && redis-server /etc/redis-config/redis.conf"]
    image: redis:7.2.5
    ports:
      - "6379:6379"
    volumes:
      - ./where/I/store/my/redis.conf:/redis.conf
# ...

这更加便携,因为您不需要更改主机上的权限。

© www.soinside.com 2019 - 2024. All rights reserved.