redis 警告:Sentinel无法将新配置保存到磁盘上!!!:设备或资源忙碌

hk8txs48  于 2023-03-22  发布在  Redis
关注(0)|答案(1)|浏览(1362)

我试图在docker上设置一个master,一个slave和一个sentinel,为此我编写了这个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中想到任何可能的解决方案。

noj0wjuj

noj0wjuj1#

首先,sentinel命令应该只有这样(我们后面会整理权限):

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

为了解决这个警告,你必须执行以下操作(对于所有redis节点- master,slave,sentinel):
在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中更改服务定义,如下所示:(请注意我在“命令”和“卷”部分的更改)
一个一个三个一个一个一个一个一个四个一个一个一个一个一个五个一个
结论:
1.为了让redis拥有修改配置的权限,你必须挂载整个配置文件夹,而不是文件本身(文件夹内容应该是可写的)。
1.备份所有原始的master.conf,slave.conf,sentinel.conf文件(redis.conf),因为最终你会执行故障转移,所以从配置会变成主配置,而主配置则相反。如何避免将更改提交到源代码控制取决于你。例如,你可以将原始文件保存在一个单独的文件夹中,在运行“docker-compose up”命令之前,通过部署脚本将它们复制到挂载的文件夹中。

  1. redis将应用于这些配置文件的所有更改将附加在配置文件的末尾,并在此注解之前:
# Generated by CONFIG REWRITE

这个解决方案是由我测试,它的工作。我出来后,阅读@yossigo的回答类似的警告这个解决方案:
https://github.com/redis/redis/issues/8172

相关问题