首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >警告:哨兵无法将新配置保存在磁盘上!:设备或资源繁忙

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

Stack Overflow用户
提问于 2021-12-16 19:26:59
回答 1查看 1.5K关注 0票数 0

我正试图在码头上设置一个主站、一个从站和一个哨兵,为此我编写了这个对接者撰写文件。

代码语言:javascript
复制
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构建它时,除了红哨之外,所有服务都运行得很好。我在日志中发现了这个错误

代码语言:javascript
复制
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可执行,但我不能想出任何可能的解决方案在码头。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-04 14:47:43

首先,哨兵命令应该是这样的(稍后我们将整理权限):

代码语言:javascript
复制
redis-server /etc/sentinel.conf --sentinel

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

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

代码语言:javascript
复制
/config
  /redis-master
     redis.conf
  /redis-slave
     redis.conf
  /redis-sentinel
     redis.conf

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

内部配置/redis-从您将当前的slave.conf文件复制为redis.conf

内部配置/redis-哨兵,您将把当前的sentinel.conf复制为redis.conf

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

代码语言:javascript
复制
chmod -R 0777 config/

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

代码语言:javascript
复制
  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"
代码语言:javascript
复制
  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
代码语言:javascript
复制
  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有修改配置的权限,您可以挂载整个配置文件夹,而不是文件本身(并且文件夹内容应该是writable).

  • Back-up所有原始的master.conf、slave.conf、sentinel.conf文件。请注意,redis将更改您的本地配置文件(redis.conf),因为最终您将执行故障转移,因此从配置将被转换为主配置,与主配置相反。这取决于您如何避免将更改提交到源代码管理。例如,您可以将原始文件保存在一个单独的文件夹中,并通过部署脚本将它们复制到已挂载的文件夹中,然后运行“docker-复合up”命令。

  • 将应用于这些配置文件的所有更改都将追加到配置的末尾,并在此注释之前添加:

代码语言:javascript
复制
# Generated by CONFIG REWRITE

这个解决方案是由我测试和它的工作。在阅读了@yossigo关于类似警告的答复后,我拿出了这个解决方案:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70384566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档