# start the image
sudo docker run -d --name citus -p 5432:5432 -e POSTGRES_PASSWORD=mypass citusdata/citus:13.0
cambiar mypass por una contraseña que quieras usar
# verify it's running, and that Citus is installed:
sudo psql -U postgres -h localhost -d postgres -c "SELECT * FROM citus_version();"
Agrega el repositorio de Citus:
Descarga y ejecuta el script para agregar el repositorio de Citus.
curl https://install.citusdata.com/community/deb.sh | sudo bash
Instala la extensión Citus y el servidor:
Instala el paquete del servidor de Citus para PostgreSQL:
sudo apt-get -y install postgresql-17-citus-13.0
Configura Citus:
Habilita la extensión Citus:
sudo pg_conftool 17 main set shared_preload_libraries citus
Esto instala una configuración centralizada en /etc/postgresql/17/main y crea una base de datos en /var/lib/postgresql/17/main .
Configura el servidor PostgreSQL para escuchar conexiones desde cualquier dirección:
sudo pg_conftool 17 main set listen_addresses '*'
Permite el acceso sin restricciones en tu red local:
host all all 10.0.0.0/8 trust.
Reinicia el servidor de PostgreSQL para aplicar los cambios:
sudo service postgresql restart
sudo update-rc.d postgresql enable
Crea la extensión en tu base de datos:
Conéctate a tu base de datos como el usuario postgres.
Ejecuta el comando CREATE EXTENSION citus; para activar Citus en la base de datos.
sudo -i -u postgres psql -c "CREATE EXTENSION citus;"
¡Claro que sí! Aquí tienes un ejemplo de una pequeña base de datos distribuida y los pasos para implementarla usando PostgreSQL con la extensión Citus.
Imaginemos que estamos construyendo un sistema de analítica web para múltiples clientes (empresas). Cada empresa tiene su propio sitio web y queremos registrar las visitas y los clics de sus usuarios. Este es un caso de uso perfecto para una base de datos distribuida porque podemos distribuir los datos por empresa, asegurando que toda la información de un cliente resida en el mismo nodo, lo que hace las consultas por cliente extremadamente rápidas.
Nuestra base de datos tendrá 3 tablas:
empresas: Almacena la información de nuestros clientes.
usuarios: Registra los usuarios que visitan los sitios web de las empresas.
eventos_web: Una tabla grande que registrará cada clic o vista de página (eventos).
Prerrequisito
Necesitas tener una instancia de PostgreSQL con la extensión Citus instalada y configurada. La forma más sencilla de experimentar es usando la imagen oficial de Docker de Citus.
Paso 1: Conectarse y Crear las Tablas
Primero, nos conectamos a nuestra base de datos PostgreSQL y creamos las tablas como lo haríamos normalmente.
SQL
-- Tabla para nuestros clientes (empresas)
CREATE TABLE empresas (
id BIGSERIAL PRIMARY KEY,
nombre VARCHAR(255) NOT NULL,
fecha_registro TIMESTAMPTZ DEFAULT NOW()
);
-- Tabla para los usuarios finales de cada empresa
CREATE TABLE usuarios (
id BIGSERIAL PRIMARY KEY,
empresa_id BIGINT REFERENCES empresas(id), -- Clave foránea a empresas
email VARCHAR(255) UNIQUE
);
-- Tabla para registrar los eventos (será muy grande)
CREATE TABLE eventos_web (
id BIGSERIAL,
empresa_id BIGINT REFERENCES empresas(id), -- Clave para distribuir los datos
usuario_id BIGINT REFERENCES usuarios(id),
url_visitada VARCHAR(1024),
fecha_evento TIMESTAMPTZ DEFAULT NOW()
);
Paso 2: Habilitar la Extensión Citus
Dentro de tu base de datos, ejecuta el siguiente comando. Esto "activa" las capacidades distribuidas de Citus.
SQL
CREATE EXTENSION citus;
Paso 3: Definir la Clave de Distribución y Distribuir las Tablas 🚀
Este es el paso más importante. Le diremos a Citus cómo queremos "particionar" (o hacer sharding) nuestras tablas. La clave aquí es la columna empresa_id, ya que es nuestra unidad lógica de aislamiento.
Distribuir la tabla empresas: La distribuimos por su propia clave primaria, id.
SQL
-- Distribuimos la tabla de empresas por su ID
SELECT create_distributed_table('empresas', 'id');
Distribuir las tablas usuarios y eventos_web: Las distribuimos usando empresa_id. Esto le indica a Citus que mantenga todos los usuarios y eventos de una misma empresa en el mismo nodo físico. Esto se llama co-location y es clave para el rendimiento.
SQL
-- Distribuimos usuarios y eventos por el ID de la empresa
-- Esto asegura que los datos relacionados estén en el mismo nodo
SELECT create_distributed_table('usuarios', 'empresa_id');
SELECT create_distributed_table('eventos_web', 'empresa_id');
💡 ¿Qué acabamos de hacer? Hemos instruido a Citus para que, cuando insertemos datos, mire el valor de empresa_id y envíe esa fila al nodo de trabajo correspondiente. Todos los datos con el mismo empresa_id irán al mismo lugar.
Paso 4: Cargar Datos de Ejemplo
Ahora, insertemos algunos datos. Notarás que los comandos INSERT son exactamente los mismos que usarías en un PostgreSQL normal. Citus se encarga de redirigir los datos por debajo.
SQL
-- Insertar dos empresas
INSERT INTO empresas (nombre) VALUES ('TechGlobal'), ('InnovaSolutions');
-- Insertar usuarios para TechGlobal (empresa_id = 1)
INSERT INTO usuarios (empresa_id, email) VALUES
(1, 'ana@techglobal.com'),
(1, 'juan@techglobal.com');
-- Insertar usuarios para InnovaSolutions (empresa_id = 2)
INSERT INTO usuarios (empresa_id, email) VALUES
(2, 'sofia@innova.io'),
(2, 'carlos@innova.io');
-- Insertar eventos para TechGlobal (empresa_id = 1)
-- Suponiendo que los usuarios 1 y 2 son de TechGlobal
INSERT INTO eventos_web (empresa_id, usuario_id, url_visitada) VALUES
(1, 1, '/precios'),
(1, 2, '/inicio'),
(1, 1, '/contacto');
-- Insertar eventos para InnovaSolutions (empresa_id = 2)
-- Suponiendo que los usuarios 3 y 4 son de InnovaSolutions
INSERT INTO eventos_web (empresa_id, usuario_id, url_visitada) VALUES
(2, 3, '/blog/articulo-1'),
(2, 4, '/productos'),
(2, 4, '/soporte');
Paso 5: Realizar Consultas Distribuidas
¡La mejor parte! Puedes consultar tus datos como si estuvieran en una sola máquina. Citus paraleliza las consultas a través de los nodos de trabajo y junta los resultados.
Consulta 1: Contar todos los eventos en el sistema.
Citus preguntará a cada nodo cuántos eventos tiene y sumará los resultados.
SQL
SELECT COUNT(*) FROM eventos_web;
Consulta 2: Obtener todos los eventos y los emails de los usuarios para una empresa específica.
Esta consulta es muy eficiente porque gracias a la co-location (empresa_id), todos los datos necesarios (usuarios y eventos_web para empresa_id = 1) están en el mismo nodo. El JOIN se ejecuta localmente en ese nodo sin necesidad de mover datos a través de la red.
SQL
SELECT
u.email,
e.url_visitada,
e.fecha_evento
FROM eventos_web e
JOIN usuarios u ON e.usuario_id = u.id
WHERE e.empresa_id = 1;
¡Y listo! Acabas de diseñar, crear, poblar y consultar una base de datos relacional distribuida. Has aprovechado el poder de la distribución horizontal manteniendo la simplicidad y la riqueza del SQL.