El título es bastante identificativo. Este post explica cómo instalar y configurar Redis (la base de datos/caché key-value) en CentOS 6 desde source, si por alguna razón no pudiéramos o no quisiéramos instalar mediante yum.
Descarga e instalación
Podemos descargar la última versión estable de Redis directamente desde la web oficial. Bastará con extraer el tarball y ejecutar «make«:
[root@myserver]# wget http://redis.googlecode.com/files/redis-2.6.13.tar.gz
[root@myserver]# tar xzf redis-2.6.13.tar.gz
[root@myserver]# cd redis-2.6.13
[root@myserver]# make
Si todo ha ido bien, ya tendremos Redis listo. Como seguramente habremos descomprimido el tarball en un directorio temporal, en mi caso he preferido cubrirme las espaldas y mover el directorio extraido (y posteriormente recompilado con make) a /etc/redis/installation_files.
[root@myserver]# cd ..
[root@myserver]# mv redis-2.6.13 installation_files
[root@myserver]# mkdir /etc/redis
[root@myserver]# mv installation_files /etc/redis/
Finalmente, se copiarán los ejecutables de servidor y cliente para que estén accesibles desde el PATH:
[root@myserver]# echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin[root@myserver]# cp /etc/redis/installation_files/src/redis-server /usr/local/bin/
[root@myserver]# cp /etc/redis/installation_files/src/redis-cli /usr/local/bin/
En la documentación oficial, existe una sección llamada «Cómo instalar Redis de la forma apropiada para un entorno en producción», que nos propone algunos pasos adicionales:
- Creación del script de inicio, al que sugiere llamar «redis»seguido del número de puerto en el que se ejecutará.
[root@myserver]# cp /etc/redis/installation_files/utils/redis_init_script /etc/init.d/redis_6379
- Éste script de inicio, desafortunadamente, no está en un formato válido para CentOS, pues el chkconfig no lo reconoce. Para que lo considere, es necesario incluir una línea con el orden de ejecución del script, en la cabecera:
[root@myserver]# head /etc/init.d/redis_6379
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
#
# CHKCONFIG LEVEL
# chkconfig: – 85 15
- Creación del fichero de configuración, al que también propone llamarle igual que el puerto de ejecución:
[root@myserver]# cp /etc/redis/installation_files/redis.conf /etc/redis/6379.conf
- Creación del directorio dbpath o directorio donde almacenará los datos Redis. Dentro de ese directorio, se creará un nuevo subdirectorio que se llamará igual que el puerto de ejecución de la instancia:
[root@myserver]# mkdir /var/redis
[root@myserver]# mkdir /var/redis/6379
Testeo de la instalación
La documentación oficial de Redis nos propone ejecutar un «make test» justo tras la recompilación inicial.
[root@myserver]# cd /etc/redis/installation_files
[root@myserver]# make test
cd src && make test
make[1]: se ingresa al directorio `/etc/redis/src’
You need tcl 8.5 or newer in order to run the Redis test
make[1]: *** [test] Error 1
make[1]: se sale del directorio `/etc/redis/src’
make: *** [test] Error 2
En mi caso el make test ha fallado por la falta del paquete tcl, que se ha instalado con yum:
[root@myserver]# yum install tcl.x86_64
Tras la solución del error, he ejecutado de nuevo el «make test» para obtener un informe sobre los posibles errores que se ha encontrado mi instalación de Redis:
[root@myserver]# make test
[…]
!!! WARNING The following tests failed:
*** [err]: Cant’ start the Redis server
[…]
ERROR:[30713] 06 May 09:48:46.409 * Max number of open files set to 10032
En este caso, el error es debido a que los «open files» están por defecto en el servidor. Ésto podemos verificarlo con «uname -a» y solucionarlo de forma temporal con «uname -n <número>» y de forma permanente configurando el fichero /etc/security/limits.conf:
[root@myserver]# ulimit -a
[…]
open files (-n) 1024
[…]
[root@myserver]# ulimit -n 12000
[root@myserver]# ulimit -a
[…]
open files (-n) 12000
[…]
Tras solucionar este problema, la posterior ejecución de «make test» ha finalizado sin errores, mostrando el siguiente mensaje:
«\o/ All tests passed without errors!»
Primera ejecución de Redis
Para verificar que todo está funcionando, bastará con ejecutar desde cualquier directorio, el comando «redis-server» (que recordemos habremos metido en el path, unos pasos antes).
[root@myserver]# pwd
/tmp
[root@myserver]# redis-server
[…]
[5029] 06 May 10:40:52.334 * The server is now ready to accept connections on port 6379
Esta ejecución lanzará el servidor de Redis sin ningún fichero de configuración, y por tanto, usará la configuración por defecto (de hecho, nos mostrará un WARNING durante la ejecución del server, avisándonos precisamente de ésto).
En otra terminal, podremos ejecutar el cliente de Redis para verificar que todo funcione, tal y como nos propone la documentación oficial:
[user@myserver]$ redis-cli ping
PONG
Configuración de Redis
Tras los testeos de la configuración por defecto, podremos pasar a configurar nuestro fichero «/etc/redis/6379.conf», realizando los siguientes cambios:
- Cambiar «daemonize» a yes
daemonize yes
- Cambiar el fichero de pid para que use el nombre del puerto por el que se ejecuta (NOTA: es importante seguir la nomenclatura propuesta, pues el script de inicio usa este tipo de nomenclatura para buscar en fichero de PID y el de configuración)
pidfile /var/run/redis_6379.pid
- Cambiar el puerto en caso de que estemos usando otro (por defecto el 6379)
port 6379
- Ajustar, si se quiere, el «loglevel» entre (debug, verbose, notice y warning)
loglevel notice
- Cambiar la ubicación del fichero de logs
logfile /var/log/redis_6379.log
- Especificar el «working directory» o directorio donde se almacenarán los datos:
dir /var/redis/6379
Finalmente bastará con añadir el script de inicio de redis:
[root@myserver]# chkconfig redis_6379 on
Con ésto, ya estaremos listos para ejecutar nuestro servidor de Redis:
[root@myserver]# service redis_6379 start
Starting Redis server…
NOTA: De nuevo, comentar que es importante hacer caso de las sugerencias en cuanto a estructura y nomenclatura de los directorios (de datos y de instalación) y ficheros (pid, config, log, etc.), puesto que el script de inicio usa dicha nomenclatura:
[root@qa init.d]# grep -v «^#» /etc/init.d/redis_6379 | head -7
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cliPIDFILE=/var/run/redis_${REDISPORT}.pid
CONF=»/etc/redis/${REDISPORT}.conf«
Fuentes: