Saltearse al contenido

Tu grafo en S3

El caso de uso principal. Tu base de datos en grafo vive en tu bucket de S3.

  1. Instalar el cliente

    Ventana de terminal
    pip install namidb
  2. Exportar las credenciales de AWS (o apoyarse en un rol IAM de EC2 / EKS / Lambda)

    Ventana de terminal
    export AWS_ACCESS_KEY_ID=AKIA...
    export AWS_SECRET_ACCESS_KEY=...
    export AWS_DEFAULT_REGION=us-east-1

    Los únicos permisos IAM que NamiDB necesita sobre el bucket son s3:GetObject, s3:PutObject, s3:DeleteObject, s3:ListBucket. Eso es todo. Sin tabla de locks de DynamoDB, sin servicio separado de metadata.

  3. Abrir (o bootstrapear) un namespace

    import namidb as tg
    client = tg.Client("s3://my-bucket/data?ns=prod&region=us-east-1")
  4. Escribir Cypher

    client.cypher("CREATE (a:Person {name: 'Alice', age: 30})")
    client.cypher("CREATE (b:Person {name: 'Bob', age: 25})")
    client.cypher(
    "MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'}) "
    "CREATE (a)-[:KNOWS {since: 2020}]->(b)"
    )
    result = client.cypher(
    "MATCH (p:Person) WHERE p.age >= $min RETURN p.name AS name, p.age AS age",
    params={"min": 18},
    )
    print(result.to_pandas())
  5. Reinicia el proceso. Abre un notebook en otra máquina con el mismo URI.

    El grafo sigue ahí. El bucket es la base de datos.

Por qué funciona

  • Los conditional writes (If-Match / If-None-Match) sobre S3 reemplazan el consenso externo. El objeto manifest se muta por compare-and-swap, así que dos writers pueden competir y solo uno gana — el que pierde reintenta contra la nueva versión.
  • Single-writer-per-namespace con epoch fencing. Los lectores escalan libremente; solo un mutador a la vez por namespace.
  • La durabilidad es la que te da S3: 99.999999999% (11 nueves) de durabilidad de objeto, replicación multi-AZ.
  • El costo escala a cero cuando ningún cliente abre el namespace — no hay compute corriendo, no hay tabla de DynamoDB aprovisionada.

Usar Cloudflare R2 para egress cero

R2 no cobra egress y tiene soporte completo de conditional writes compatible con S3. Mismo esquema, con el endpoint de R2 y region=auto:

import namidb as tg
client = tg.Client(
"s3://my-bucket?ns=prod"
"&endpoint=https://<ACCOUNT_ID>.r2.cloudflarestorage.com"
"&region=auto"
)

Si estás corriendo NamiDB fuera de AWS — en Cloudflare Workers, Fly.io, tu VPS, tu laptop — R2 casi siempre es la decisión correcta.

¿Y los backups?

Ventana de terminal
aws s3 sync s3://my-bucket/data/ ./backup-2026-05-19/

Eso es todo. NamiDB nunca escribe a ningún otro lado.

Multi-tenancy

Cada namespace es una carpeta bajo el prefijo de tu bucket:

s3://my-bucket/data/
├── tenant-acme/
│ ├── manifest.json
│ ├── wal/
│ └── sst/
├── tenant-globex/
│ ├── manifest.json
│ ├── wal/
│ └── sst/
└── tenant-initech/
├── ...

Cada ?ns=… abre un namespace aislado. Operativamente: los tenants son carpetas.

Siguiente