Instalación de ValKey: El Fork Open Source de Redis

ValKey es el fork open source de Redis creado por la Linux Foundation en 2024 como respuesta al cambio de licencia de Redis a SSPL, garantizando la continuidad de un almacén en memoria de código completamente abierto bajo la licencia BSD. Totalmente compatible con el protocolo y los comandos de Redis, ValKey puede reemplazar cualquier instalación de Redis sin modificar el código de la aplicación en servidores Linux.

Requisitos Previos

  • Ubuntu 20.04/22.04 o CentOS/Rocky Linux 8+
  • Al menos 512 MB de RAM (más según el tamaño del dataset)
  • Acceso root o usuario con privilegios sudo

Instalación de ValKey

Instalación en Ubuntu/Debian

# Añadir repositorio oficial de ValKey
curl -fsSL https://packages.valkey.io/valkey-signing.gpg \
    | sudo gpg --dearmor -o /usr/share/keyrings/valkey-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/valkey-archive-keyring.gpg] \
    https://packages.valkey.io/valkey-io/$(lsb_release -rs)/apt $(lsb_release -cs) main" \
    | sudo tee /etc/apt/sources.list.d/valkey.list

sudo apt-get update
sudo apt-get install -y valkey

# Habilitar e iniciar el servicio
sudo systemctl enable valkey-server
sudo systemctl start valkey-server

# Verificar instalación
valkey-cli ping
# Respuesta: PONG
valkey-server --version

Instalación desde código fuente

# Instalar dependencias de compilación
sudo apt-get install -y build-essential tcl libssl-dev

# Clonar repositorio de ValKey
git clone https://github.com/valkey-io/valkey.git
cd valkey

# Compilar con soporte TLS
make BUILD_TLS=yes

# Ejecutar tests (opcional pero recomendado)
make test

# Instalar en el sistema
sudo make install

# Verificar versión compilada
valkey-server --version

Instalación con Docker

# Ejecutar ValKey con Docker
docker run -d \
    --name valkey \
    -p 6379:6379 \
    -v valkey_data:/data \
    --restart unless-stopped \
    valkey/valkey:latest \
    valkey-server \
    --requirepass "mi_password_segura" \
    --save 900 1 \
    --appendonly yes

# Verificar funcionamiento
docker exec valkey valkey-cli -a "mi_password_segura" ping

Configuración Básica

# Crear archivo de configuración
sudo cat > /etc/valkey/valkey.conf << 'EOF'
# ================================================================
# Configuración de ValKey
# ================================================================

# ---- RED ----
bind 127.0.0.1 -::1
port 6379
protected-mode yes

# Contraseña de acceso (cambiar en producción)
requirepass "contraseña_muy_segura"

# ---- PERSISTENCIA ----
# RDB Snapshots
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/valkey

# AOF para mayor durabilidad
appendonly yes
appendfilename "valkey.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes

# ---- MEMORIA ----
maxmemory 2gb
maxmemory-policy allkeys-lru

# ---- RENDIMIENTO ----
hz 10
dynamic-hz yes
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
lazyfree-lazy-user-del yes

# Optimizaciones de latencia
latency-tracking yes
latency-tracking-info-percentiles 50 99 99.9

# ---- SEGURIDAD ----
# Renombrar comandos peligrosos (opcional)
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command DEBUG ""

# ---- LOGS ----
loglevel notice
logfile /var/log/valkey/valkey-server.log

# ---- CONEXIONES ----
maxclients 10000
tcp-keepalive 300

EOF

sudo mkdir -p /var/log/valkey /var/lib/valkey
sudo chown valkey:valkey /var/log/valkey /var/lib/valkey

sudo systemctl restart valkey-server
sudo systemctl status valkey-server

Compatibilidad con Redis

ValKey implementa el protocolo RESP completamente:

# Conexión con redis-cli (totalmente compatible)
redis-cli -p 6379 -a "contraseña_muy_segura"

# O con valkey-cli
valkey-cli -p 6379 -a "contraseña_muy_segura"

# Comandos básicos
SET clave "valor con TTL de 5 minutos"
EXPIRE clave 300
TTL clave
GET clave

# Estructuras de datos avanzadas
# Hash
HSET configuracion:app host "localhost" puerto 8080 debug false
HMGET configuracion:app host puerto

# Lista
LPUSH sesiones:activas "sesion-abc123" "sesion-def456"
LLEN sesiones:activas
LRANGE sesiones:activas 0 -1

# Set ordenado (ranking)
ZADD leaderboard 3500 "jugador1" 4200 "jugador2" 2100 "jugador3"
ZREVRANK leaderboard "jugador2"  # Posición de jugador2

# Contadores atómicos
INCR visitas:pagina:inicio
INCRBY visitas:pagina:inicio 10

# Transacciones
MULTI
SET contador 0
INCR contador
EXEC

# Scripting Lua
valkey-cli EVAL "
    local val = redis.call('GET', KEYS[1])
    if val then
        return redis.call('INCR', KEYS[1])
    else
        redis.call('SET', KEYS[1], ARGV[1])
        return ARGV[1]
    end
" 1 mi:contador 0

Compatibilidad con librerías de cliente Redis:

# Las librerías existentes de Redis funcionan sin cambios:
# Python: redis-py
# Node.js: ioredis, node-redis
# Java: Jedis, Lettuce
# PHP: predis, phpredis
# Ruby: redis-rb
# Go: go-redis

# Ejemplo con Python (usando redis-py, sin cambios)
python3 << 'EOF'
import redis

# Conectar a ValKey usando el cliente de Redis
r = redis.Redis(
    host='localhost',
    port=6379,
    password='contraseña_muy_segura',
    decode_responses=True
)

# Verificar conexión
print(r.ping())  # True

# Operaciones normales
r.set('test', 'valkey funciona')
print(r.get('test'))  # valkey funciona

# Usar pipeline para rendimiento
pipe = r.pipeline()
for i in range(100):
    pipe.set(f'clave:{i}', f'valor:{i}')
pipe.execute()

print(f"Claves en ValKey: {r.dbsize()}")
EOF

Clustering

Configurar un clúster de ValKey para alta disponibilidad:

# Configuración de nodo para clúster
cat > /etc/valkey/valkey-cluster.conf << 'EOF'
# Configuración de nodo de clúster ValKey
port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

# Persistencia
appendonly yes
appendfsync everysec

# Red
bind 0.0.0.0
requirepass "cluster_password_segura"
masterauth "cluster_password_segura"
EOF

# Iniciar 6 nodos (3 primarios + 3 réplicas) en servidores separados
# O en el mismo servidor con puertos diferentes (solo para pruebas)

# Para pruebas en un solo servidor:
for port in 7000 7001 7002 7003 7004 7005; do
    mkdir -p /tmp/cluster-test/$port
    
    cat > /tmp/cluster-test/$port/valkey.conf << EOF
port $port
cluster-enabled yes
cluster-config-file nodes-$port.conf
cluster-node-timeout 5000
appendonly yes
dir /tmp/cluster-test/$port
EOF

    valkey-server /tmp/cluster-test/$port/valkey.conf --daemonize yes
done

# Crear el clúster
valkey-cli --cluster create \
    127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
    127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
    --cluster-replicas 1 \
    --cluster-yes

# Verificar el estado del clúster
valkey-cli -p 7000 cluster info
valkey-cli -p 7000 cluster nodes

# Conectar a un clúster desde la CLI
valkey-cli -c -p 7000  # -c habilita modo clúster con redirección automática

Configuración de Sentinel para alta disponibilidad sin clúster:

# Configuración de Sentinel
cat > /etc/valkey/sentinel.conf << 'EOF'
# Sentinel de ValKey para alta disponibilidad
port 26379
sentinel monitor mi-primario 127.0.0.1 6379 2
sentinel auth-pass mi-primario "contraseña_muy_segura"
sentinel down-after-milliseconds mi-primario 30000
sentinel parallel-syncs mi-primario 1
sentinel failover-timeout mi-primario 180000
EOF

# Iniciar Sentinel
valkey-sentinel /etc/valkey/sentinel.conf

Migración desde Redis

# OPCIÓN 1: Reemplazar el binario (misma versión de protocolo)
# Detener Redis
sudo systemctl stop redis-server

# Copiar los datos persistidos al directorio de ValKey
sudo cp /var/lib/redis/dump.rdb /var/lib/valkey/dump.rdb
sudo cp /var/lib/redis/appendonly.aof /var/lib/valkey/valkey.aof 2>/dev/null || true
sudo chown valkey:valkey /var/lib/valkey/dump.rdb

# Iniciar ValKey
sudo systemctl start valkey-server

# Verificar que los datos están disponibles
valkey-cli -a "contraseña" dbsize
valkey-cli -a "contraseña" info keyspace

# OPCIÓN 2: Migración en vivo con replicación
# En ValKey, configurar como réplica de Redis temporalmente
valkey-cli -a "contraseña" replicaof redis-original-host 6379

# Esperar sincronización
valkey-cli -a "contraseña" info replication | grep "master_sync_in_progress"

# Cuando esté sincronizado (master_sync_in_progress:0):
valkey-cli -a "contraseña" replicaof no one

# Actualizar la configuración de la aplicación al nuevo servidor

# OPCIÓN 3: Usando redis-dump para migración completa
# Instalar redis-dump
pip3 install redis-dump-load

redis-dump -u "redis://:password@redis-original:6379" \
    | redis-load -u "valkey://:contraseña@localhost:6379"

Benchmark de Rendimiento

# Instalar herramientas de benchmark
sudo apt-get install -y redis-tools

# Benchmark básico
valkey-benchmark -a "contraseña" -t set,get -n 1000000 -q

# Benchmark con concurrencia alta
valkey-benchmark \
    -a "contraseña" \
    -t set,get,incr,lpush,sadd,zadd \
    -n 5000000 \
    -c 200 \
    -P 32 \
    --threads 4

# Benchmark de latencia
valkey-cli -a "contraseña" --latency-history -i 1

Monitorización

# Comandos de monitorización
valkey-cli -a "contraseña" info all | grep -E "used_memory|connected_clients|hit_rate"

# Monitorización en tiempo real
valkey-cli -a "contraseña" monitor  # Muestra todos los comandos en tiempo real

# Estadísticas de rendimiento
valkey-cli -a "contraseña" info stats | grep -E "total_commands|instantaneous_ops|keyspace"

# Script de monitorización
cat > /usr/local/bin/valkey-monitor.sh << 'EOF'
#!/bin/bash
# Monitorización básica de ValKey

PASS="contraseña_muy_segura"

echo "=== Estado de ValKey ==="
valkey-cli -a "$PASS" info server | grep -E "valkey_version|uptime_in_seconds"
echo ""
echo "=== Memoria ==="
valkey-cli -a "$PASS" info memory | grep -E "used_memory_human|maxmemory_human|mem_fragmentation_ratio"
echo ""
echo "=== Rendimiento ==="
valkey-cli -a "$PASS" info stats | grep -E "total_commands|instantaneous_ops_per_sec|keyspace_hits"
echo ""
echo "=== Clientes ==="
valkey-cli -a "$PASS" info clients | grep -E "connected_clients|blocked_clients"
EOF

chmod +x /usr/local/bin/valkey-monitor.sh

# Ejecutar periódicamente con cron
echo "*/5 * * * * root /usr/local/bin/valkey-monitor.sh >> /var/log/valkey/monitor.log 2>&1" \
    | sudo tee /etc/cron.d/valkey-monitor

Solución de Problemas

ValKey no responde a las conexiones:

# Verificar estado del servicio
sudo systemctl status valkey-server

# Verificar que escucha en el puerto
ss -tlnp | grep 6379

# Revisar el log
sudo tail -f /var/log/valkey/valkey-server.log

Error de autenticación:

# Verificar la contraseña configurada
sudo grep requirepass /etc/valkey/valkey.conf

# Conectar con la contraseña correcta
valkey-cli -a "contraseña_muy_segura" ping

Alto uso de memoria:

# Ver qué claves ocupan más espacio
valkey-cli -a "pass" --bigkeys

# Analizar la distribución de tipos de datos
valkey-cli -a "pass" info keyspace

# Ajustar maxmemory y la política de evicción
valkey-cli -a "pass" config set maxmemory 3gb
valkey-cli -a "pass" config set maxmemory-policy allkeys-lru

Conclusión

ValKey ofrece la garantía de un futuro open source para el ecosistema compatible con Redis, respaldado por la Linux Foundation y contribuciones de grandes empresas tecnológicas. Su compatibilidad total con el protocolo Redis elimina cualquier barrera de migración, permitiendo a organizaciones que usan Redis 7.2 o anterior adoptar ValKey de forma transparente. Con el mismo rendimiento y características que Redis, más el compromiso de mantenerse como software libre bajo licencia BSD, ValKey es la elección natural para infraestructuras de hosting que requieren un almacén en memoria confiable y sin restricciones de licencia.