es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¡ADVERTENCIA! ¡Sentinel no pudo guardar la nueva configuración en el disco!: ¡Dispositivo o recurso ocupado!

Estoy tratando de configurar un maestro, un esclavo y un sentinela en Docker, para eso escribí este archivo 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

Pero cuando intento construirlo usando sudo docker-compose up --build --force, todos los servicios se ejecutan correctamente excepto redis-sentinel. Obtengo este error en los registros:

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

Entiendo que esto se debe a algún problema de permisos de archivo y tengo que hacer que el sentinel.conf sea ejecutable, pero no puedo pensar en ninguna posible solución en Docker.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Según los registros de errores, parece que el problema está relacionado con los permisos del archivo sentinel.conf. El mensaje de error indica que Sentinel no pudo guardar la nueva configuración en disco porque el archivo está ocupado.

    Para resolver este problema, puedes intentar las siguientes soluciones:

    1. Cambia la propiedad del archivo sentinel.conf al mismo usuario/grupo utilizado por la imagen de Redis. Puedes encontrar esta información en el Dockerfile de la imagen de Redis. Por ejemplo, si la imagen de Redis utiliza el usuario/grupo “redis:redis”, puedes cambiar la propiedad del archivo sentinel.conf utilizando el siguiente comando:
      sudo chown redis:redis sentinel.conf
      

      Puedes agregar este comando a tu Dockerfile o a la sección de comandos del archivo docker-compose.

    2. Agrega un retraso antes de iniciar el contenedor de Redis Sentinel para asegurarte de que los contenedores de Redis Master y Slave estén activos y en funcionamiento primero. Puedes hacer esto agregando un comando “sleep” a la sección de comandos del contenedor de Redis Sentinel. Por ejemplo:

      command: >
       bash -c "sleep 10
       && chmod 777 /etc/sentinel.conf
       && redis-server /etc/sentinel.conf --sentinel"
      

      Esto retrasará el inicio del contenedor de Redis Sentinel en 10 segundos, dándole tiempo suficiente para que los otros contenedores se inicien.

    3. Utiliza un enfoque diferente para configurar Redis Sentinel, como utilizar un archivo de configuración dedicado para Sentinel en lugar de utilizar el mismo archivo que los contenedores de Redis Master y Slave. Esto puede ayudar a evitar conflictos y problemas de permisos. Por ejemplo, puedes crear un archivo sentinel.conf separado y montarlo en el contenedor de Redis Sentinel como un volumen.

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

      En este caso, asegúrate de otorgar los permisos necesarios al archivo sentinel.conf antes de montarlo en el contenedor de Redis Sentinel.

Comments are closed.