Este artículo le enseñará cómo ejecutar una o más instancias de Redis en un servidor Linux usando systemd para generar copias de un servicio. Usaré Redis como ejemplo, pero también puede usar PostgreSQL o cualquier otro servicio siempre que pueda configurar el puerto.

Instalar Redis

La forma más fácil de instalar Redis en Linux es con el administrador de paquetes de distribución. Así es como lo haría en openSUSE:

sudo zypper install redis

En caso de que su distribución no proporcione un paquete de Redis, siempre puede seguir estas instrucciones para compilarlo desde cero.

Configurar una instancia de Redis

Una vez instalado, deberá crear un archivo de configuración para cada instancia del servicio que desea ejecutar.

  1. Agregar un archivo de configuración

    Haga una copia del archivo de ejemplo/predeterminado que proporciona el paquete

     cd /etc/redis/
     cp default.conf.example my_app.conf
    

    Use un nombre que lo ayude a reconocer el propósito de la instancia. Por ejemplo, si cada instancia se asignará a una aplicación diferente, asígnele el nombre de la aplicación. Si cada instancia se asignará a la misma aplicación, use el puerto en el que se ejecutará.

  2. Cambiar la propiedad del archivo de configuración

    El archivo de configuración debe ser propiedad de “root” y pertenecer al grupo “redis”.

     chown root.redis my_app.conf
    
  3. Editar “my_app.conf”

    Agregue un “pidfile”, un “logfile” y un “dir”

     pidfile /var/run/redis/my_app.pid
     logfile /var/log/redis/my_app.log
     dir /var/lib/redis/my_app/
    

    Cada uno de estos atributos tiene que coincidir con el nombre del archivo de configuración sin la extensión.

    Asegúrese de que la opción “daemonize” esté establecida en “no” (este es el valor predeterminado)

     daemonize no
    

    Si establece esta opción en sí, Redis y systemd interferirán entre sí al generar los procesos.

    Defina un número de “puerto”.

     port 6379
    

    Recuerde que cada instancia debe ejecutarse en un puerto diferente.

  4. Guarda el archivo de configuración

  5. Cree el directorio de la base de datos en la ubicación dada en el archivo de configuración

     install -d -o redis -g redis -m 0750 /var/lib/redis/my_app
    

    El directorio de la base de datos debe ser propiedad del usuario “redis” y pertenecer al grupo “redis” y con permisos 750.

Repita los pasos en Configurar una instancia de Redis para cada instancia que desee configurar. En mi caso configuré una segunda instancia llamada “my_other_app”

.
├── default.conf.example
├── my_app.conf
└── my_other_app.conf

Agregar Units a systemd para el servicio Redis

Para que systemd sepa cómo habilitar e iniciar cada instancia individualmente, deberá agregar una unidad de servicio dentro del directorio de configuración del sistema ubicado en /etc/systemd/system. Para mayor comodidad, es posible que también desee iniciar / detener todas las instancias a la vez. Para eso necesitarás agregar una unidad objetivo.

En caso de que haya instalado Redis en openSUSE, estos dos archivos ya se le proporcionarán en el directorio de la unidad del sistema /usr/lib/systemd/system.

  1. Cree el archivo de la unidad de servicio redis@.service con los siguientes contenidos:

     [Unit]
     Description=Redis
     After=network.target
     PartOf=redis.target[Service]
     Type=simple
     User=redis
     Group=redis
     PrivateTmp=true
     PIDFile=/var/run/redis/%i.pid
     ExecStart=/usr/sbin/redis-server /etc/redis/%i.conf
     Restart=on-failure[Install]
     WantedBy=multi-user.target redis.target
    

    The unit file is separated in sections. Each section consists of variables and the value assigned to them. In this example:

    • After: cuando la instancia de Redis está habilitada, comenzará solo después de que se haya iniciado la red.
    • PartOf: esta instancia pertenece a redis.target y comenzará / se detendrá como parte de ese grupo
    • Type: simplemente significa que el proceso de servicio no se bifurca.
    • %i: un especificador expandido por systemd a la instancia “my_app”.
  2. Cree el archivo de unidad de destino redis.target con los siguientes contenidos:

[Unit]
Description=Redis target allowing to start/stop all redis@.service instances at once

Interactuando con Redis

Si todo salió como se esperaba, debería poder interactuar con las instancias individuales:

systemctl start redis@my_app
systemctl enable redis@my_other_app

Y también con todas las instancias al mismo tiempo:

systemctl restart redis.target
systemctl stop redis.target

Solución de problemas

Si las cosas no salieron como se esperaba y no puede iniciar la instancia, asegúrese de verificar el estado de la instancia:

systemctl status redis@my_app

Si el problema no aparece allí, consulte el diario del sistema:

journalctl -u redis@my_app

Por ejemplo, si olvidó otorgar los permisos correctos al archivo de configuración, verá algo como esto dentro del diario:

Apr 23 10:02:53 mxps redis-server[26966]: 26966:C 23 Apr 10:02:53.917 # Fatal error, can’t open config file ‘/etc/redis/my_app.conf’

Agradecimientos

Gracias a los mantenedores del paquete de Redis de openSUSE por crear un paquete tan bueno que puedes aprender de él.

El libro Cómo funciona Linux proporciona los detalles sobre cómo funcionan las instancias systemd.