Instalación de ScyllaDB: NoSQL de Alto Rendimiento Compatible con Cassandra

ScyllaDB es una base de datos NoSQL de alto rendimiento y baja latencia, compatible con Apache Cassandra a nivel de protocolo CQL y esquema, pero reescrita en C++ con una arquitectura shard-per-core que elimina los cuellos de botella del modelo Java de Cassandra. Capaz de procesar millones de operaciones por segundo con latencias de un solo dígito en milisegundos, ScyllaDB es la opción ideal para casos de uso que requieren escalabilidad horizontal en servidores Linux.

Requisitos Previos

  • Ubuntu 20.04/22.04 o CentOS/Rocky Linux 8+
  • Al menos 8 GB de RAM (16 GB recomendado para producción)
  • CPU moderna de 64 bits con múltiples núcleos
  • SSD NVMe para almacenamiento de datos (muy recomendado)
  • Kernel Linux 4.14+ con soporte para io_uring
  • Acceso root o usuario con privilegios sudo

Instalación de ScyllaDB

Instalación en Ubuntu/Debian

# Instalar ScyllaDB usando el instalador automático
curl -sSf https://downloads.scylladb.com/downloads/scylla/downloads/oss/ubuntu/install.sh \
    | sudo bash

# O manualmente:
sudo apt-get install -y apt-transport-https wget gnupg

# Añadir clave GPG y repositorio
wget -O - https://downloads.scylladb.com/oss/scylla/repo/ubuntu/focal/scylladb-5.4/scylladb.list.gpg \
    | sudo apt-key add -

sudo wget -O /etc/apt/sources.list.d/scylladb.list \
    https://downloads.scylladb.com/oss/scylla/repo/ubuntu/focal/scylladb-5.4/scylladb.list

sudo apt-get update
sudo apt-get install -y scylla

Instalación en CentOS/Rocky Linux

# Añadir repositorio RPM
sudo wget -O /etc/yum.repos.d/scylladb.repo \
    https://downloads.scylladb.com/oss/scylla/repo/el/8/scylladb-5.4/scylladb.repo

sudo yum install -y scylla

Configuración inicial del sistema

# Ejecutar el script de configuración del sistema
# Este script optimiza el kernel, la red y el disco para ScyllaDB
sudo scylla_setup \
    --no-coredump-setup \
    --no-sysconfig-setup \
    --no-raid-setup \
    --no-ntp-setup \
    --io-setup 1 \
    --no-swap-setup \
    --no-rsyslog-setup

# Habilitar e iniciar ScyllaDB
sudo systemctl enable scylla-server
sudo systemctl start scylla-server

# Verificar el estado
sudo systemctl status scylla-server
nodetool status

Configuración del Clúster

Configurar ScyllaDB para producción o en clúster:

sudo cat > /etc/scylla/scylla.yaml << 'EOF'
# ================================================================
# Configuración de ScyllaDB
# ================================================================

# ---- IDENTIDAD DEL NODO ----
cluster_name: 'mi-cluster-produccion'

# ---- RED ----
# IP del nodo actual (cambiar en cada nodo)
listen_address: 192.168.1.10

# IP para el cliente (puede ser la misma)
rpc_address: 0.0.0.0
broadcast_rpc_address: 192.168.1.10

# ---- NODOS SEMILLA (seed nodes) ----
# Los seeds ayudan a los nuevos nodos a unirse al clúster
seed_provider:
  - class_name: org.apache.cassandra.locator.SimpleSeedProvider
    parameters:
      - seeds: "192.168.1.10,192.168.1.11,192.168.1.12"

# ---- ALMACENAMIENTO ----
data_file_directories:
  - /var/lib/scylla/data

commitlog_directory: /var/lib/scylla/commitlog

# ---- RENDIMIENTO ----
# ScyllaDB detecta automáticamente los recursos del sistema
# No es necesario configurar manualmente threads o memoria

# Política de compactación por defecto
compaction_throughput_mb_per_sec: 64

# ---- SEGURIDAD ----
# Autenticación (habilitar en producción)
authenticator: PasswordAuthenticator
authorizer: CassandraAuthorizer

# TLS (configuración básica)
# server_encryption_options:
#   internode_encryption: dc
#   certificate: /etc/scylla/certs/db.crt
#   keyfile: /etc/scylla/certs/db.key

# ---- CONSISTENCIA ----
# Factor de replicación se configura a nivel de keyspace

EOF

sudo systemctl restart scylla-server

# Verificar que el nodo está operativo
nodetool status
# Esperar hasta ver: UN (Up Normal) para el nodo actual

Interfaz CQL

Usar el shell CQL para administrar datos:

# Conectar al shell CQL
cqlsh localhost

# Con autenticación habilitada:
cqlsh localhost -u cassandra -p cassandra

# Cambiar la contraseña del superusuario por defecto
ALTER USER cassandra WITH PASSWORD 'nueva_password_segura';

# Crear un nuevo superusuario y eliminar el por defecto
CREATE USER admin WITH PASSWORD 'admin_password_segura' SUPERUSER;

Operaciones básicas con CQL:

-- Crear keyspace con replicación
CREATE KEYSPACE mi_app
WITH REPLICATION = {
    'class': 'NetworkTopologyStrategy',
    'datacenter1': 3  -- Factor de replicación 3 en el DC1
};

-- Usar el keyspace
USE mi_app;

-- Crear tabla optimizada para las consultas previstas
-- ScyllaDB/Cassandra requiere diseño de tablas orientado a consultas
CREATE TABLE usuarios (
    id UUID PRIMARY KEY,
    email TEXT,
    nombre TEXT,
    creado_en TIMESTAMP,
    activo BOOLEAN
) WITH compaction = {
    'class': 'LeveledCompactionStrategy'
};

-- Tabla con clave de partición compuesta (para distribución de carga)
CREATE TABLE metricas_servidor (
    host TEXT,
    fecha DATE,
    hora TIMESTAMP,
    cpu DOUBLE,
    memoria DOUBLE,
    PRIMARY KEY ((host, fecha), hora)
) WITH CLUSTERING ORDER BY (hora DESC)
  AND default_time_to_live = 2592000;  -- TTL 30 días

-- Insertar datos
INSERT INTO usuarios (id, email, nombre, creado_en, activo)
VALUES (uuid(), '[email protected]', 'María García', toTimestamp(now()), true);

-- Consultar con filtros
SELECT * FROM usuarios WHERE id = <UUID>;

-- Consultar datos de series temporales
SELECT host, hora, cpu, memoria
FROM metricas_servidor
WHERE host = 'web-01'
  AND fecha = '2024-03-15'
  AND hora >= '2024-03-15 08:00:00'
  AND hora <= '2024-03-15 18:00:00';

-- Actualizar con TTL individual
UPDATE usuarios USING TTL 86400
SET activo = false
WHERE id = <UUID>;

-- Eliminar
DELETE FROM usuarios WHERE id = <UUID>;

Arquitectura Shard-per-Core

ScyllaDB asigna un shard a cada núcleo de CPU, eliminando la contención:

# Ver la arquitectura de shards del nodo
nodetool describecluster

# Ver distribución de datos por shard
curl http://localhost:10000/metrics | grep scylla_scheduler_shares

# Ver estadísticas de rendimiento por shard
nodetool tpstats

# Verificar el uso de CPU por shard (debe ser uniforme)
top -H -p $(pgrep scylla) | head -30

# Ver el número de shards configurados
curl -s http://localhost:10000/metrics | grep "scylla_scheduler_queue_length"

# Configurar el número de shards (normalmente automático)
# En /etc/scylla/scylla.yaml:
# seastar.smp=8  # Para servidor de 8 núcleos

Monitorización

Monitorizar ScyllaDB con herramientas integradas:

# Estado del clúster
nodetool status

# Estadísticas de tabla
nodetool tablestats mi_app.usuarios

# Estado de compactación
nodetool compactionstats

# Ver latencias de operaciones
nodetool tpstats

# Métricas de rendimiento actuales
nodetool info

# Ver las 10 consultas más lentas
cqlsh -e "SELECT * FROM system.local;"

# Instalar Prometheus y exportar métricas de ScyllaDB
# ScyllaDB expone métricas en: http://localhost:9180/metrics

cat > /etc/prometheus/scylla.yml << 'EOF'
# Configuración de Prometheus para ScyllaDB
scrape_configs:
  - job_name: 'scylladb'
    static_configs:
      - targets: ['localhost:9180']
    relabel_configs:
      - source_labels: [__address__]
        target_label: __address__
        replacement: '${1}'
EOF

Dashboard de Grafana para ScyllaDB:

# Importar el dashboard oficial de ScyllaDB en Grafana
# Dashboard ID: 16995 (ScyllaDB Overview)
# Disponible en: https://grafana.com/grafana/dashboards/

# O usar el stack completo de monitorización de ScyllaDB
git clone https://github.com/scylladb/scylla-monitoring.git
cd scylla-monitoring
./start-all.sh -s scylla-servers -d data-dir

Migración desde Cassandra

# FASE 1: Validar compatibilidad
# ScyllaDB es compatible con Cassandra 3.x y 4.x en CQL y SSTable

# Verificar la versión de protocolo CQL que usa la aplicación
# ScyllaDB soporta CQL nativo v3 y v4

# FASE 2: Migración de schema
# Exportar el schema de Cassandra
cqlsh cassandra-host -e "DESCRIBE FULL SCHEMA" > schema.cql

# Importar el schema en ScyllaDB
cqlsh scylladb-host -f schema.cql

# FASE 3: Migración de datos con sstableloader
# En el nodo de Cassandra, crear un snapshot
nodetool snapshot -t migration-snapshot

# Copiar los archivos SSTable al nodo ScyllaDB
scp -r /var/lib/cassandra/data/mi_keyspace/* \
    scylladb-host:/var/lib/scylla/data/mi_keyspace/

# Cargar los SSTables en ScyllaDB
sstableloader -d 192.168.1.10 \
    /var/lib/scylla/data/mi_keyspace/mi_tabla-*/

# FASE 4: Verificar integridad
cqlsh scylladb-host -e "SELECT count(*) FROM mi_app.usuarios;"
cqlsh cassandra-host -e "SELECT count(*) FROM mi_app.usuarios;"

Ajuste de Rendimiento

# ScyllaDB se autoajusta, pero hay parámetros que mejorar:

# 1. Deshabilitar THP (Transparent Huge Pages)
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
echo "never" | sudo tee /sys/kernel/mm/transparent_hugepage/enabled

# Persistir la configuración
cat > /etc/rc.local << 'EOF'
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
EOF

# 2. Aumentar el número de archivos abiertos
cat > /etc/security/limits.d/scylla.conf << 'EOF'
scylla soft nofile 65535
scylla hard nofile 65535
EOF

# 3. Optimizar la configuración de red
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 65536 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

# 4. Calibrar el I/O con el script de ScyllaDB
sudo scylla_io_setup

# 5. Verificar el perfil de rendimiento
sudo scylla_performance_setup

Solución de Problemas

El nodo no se une al clúster:

# Verificar la conectividad entre nodos (puerto 7000 inter-node)
telnet 192.168.1.11 7000

# Revisar los logs de arranque
sudo journalctl -u scylla-server -n 100
sudo tail -f /var/log/scylla/scylla.log

# Verificar que los seeds son alcanzables
nodetool gossipinfo

Alto uso de CPU:

# Ver qué operaciones consumen más
nodetool tpstats | head -30

# Ver compactaciones en curso
nodetool compactionstats

# Limitar el throughput de compactación si impacta el rendimiento
nodetool setcompactionthroughput 32

Lecturas lentas:

# Verificar el nivel de consistencia de las consultas
# Usar QUORUM en lugar de ALL para mejor rendimiento
# cqlsh> CONSISTENCY QUORUM;

# Verificar que las tablas tienen las claves de partición correctas
# Las consultas WITHOUT ALLOW FILTERING deben usar la clave de partición completa
nodetool tablestats mi_app.mi_tabla | grep "Read latency"

Conclusión

ScyllaDB combina la compatibilidad total con el ecosistema de Cassandra y su protocolo CQL con un motor de ejecución en C++ que extrae el máximo rendimiento del hardware moderno mediante la arquitectura shard-per-core. El resultado es una base de datos NoSQL capaz de servir cargas de trabajo que requerirían múltiples nodos de Cassandra con un único servidor ScyllaDB, reduciendo significativamente los costes de infraestructura. Para aplicaciones que ya usan Cassandra, la migración a ScyllaDB es transparente y puede realizarse sin tiempo de inactividad mediante la replicación de SSTables.