警告:Sentinel 无法将新配置保存在磁盘上!!!:设备或资源繁忙
WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
我正在尝试在 docker 上设置一主一从和一哨兵,为此我写了这个 docker 组合文件。
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.
中想出任何可能的解决方案
首先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 中的服务定义,如下所示:
(注意我在“命令”和“卷”部分所做的更改)
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
结论:
- 为了让redis有权修改配置,你必须挂载整个配置文件夹,而不是文件本身(文件夹内容应该是可写的)。
- 备份所有原始master.conf、slave.conf、sentinel.conf文件。请注意,redis 会更改您的本地配置文件 (redis.conf),因为最终您将执行故障转移,因此从配置将变成主配置,而主配置则相反。如何避免将更改提交到源代码管理取决于您。例如,您可以将原始文件保存在一个单独的文件夹中,然后在 运行 "docker-compose up" 命令之前通过部署脚本将它们复制到安装的文件夹中。
- redis 将应用于这些配置文件的所有更改都将附加在配置的末尾,并在前面加上此注释:
# Generated by CONFIG REWRITE
这个解决方案已经过我的测试并且有效。在阅读@yossigo 关于类似警告的回答后,我想出了这个解决方案:
我正在尝试在 docker 上设置一主一从和一哨兵,为此我写了这个 docker 组合文件。
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.
中想出任何可能的解决方案首先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 中的服务定义,如下所示: (注意我在“命令”和“卷”部分所做的更改)
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
结论:
- 为了让redis有权修改配置,你必须挂载整个配置文件夹,而不是文件本身(文件夹内容应该是可写的)。
- 备份所有原始master.conf、slave.conf、sentinel.conf文件。请注意,redis 会更改您的本地配置文件 (redis.conf),因为最终您将执行故障转移,因此从配置将变成主配置,而主配置则相反。如何避免将更改提交到源代码管理取决于您。例如,您可以将原始文件保存在一个单独的文件夹中,然后在 运行 "docker-compose up" 命令之前通过部署脚本将它们复制到安装的文件夹中。
- redis 将应用于这些配置文件的所有更改都将附加在配置的末尾,并在前面加上此注释:
# Generated by CONFIG REWRITE
这个解决方案已经过我的测试并且有效。在阅读@yossigo 关于类似警告的回答后,我想出了这个解决方案: