← Tilbage til databaser

CockroachDB

NewSQL

En distribueret SQL-database der kombinerer PostgreSQL-kompatibilitet med horisontal skalerbarhed og geo-distribution.

Beskrivelse

CockroachDB er en cloud-native, distribueret SQL-database inspireret af Google Spanner. Navnet kommer fra kakerlakkens evne til at overleve - databasen er designet til at fortsætte med at fungere selv hvis noder går ned. CockroachDB giver dig det bedste fra begge verdener: ACID-transaktioner og SQL-forespørgsler (som traditionelle databaser) plus horisontal skalering og fejltolerance (som NoSQL). Den er wire-kompatibel med PostgreSQL, hvilket betyder at de fleste PostgreSQL-apps kan køre uden ændringer. Under overfladen bruger CockroachDB Raft consensus-protokollen til at replikere data på tværs af noder og implementerer serializable isolation som standard - det stærkeste isolationsniveau. Data kan geo-distribueres med konfigurerbar lokalitet for at overholde GDPR og reducere latenstid. CockroachDB håndterer automatisk load balancing, failover og data-rebalancering når noder tilføjes eller fjernes. Dette gør den perfekt til globale applikationer der har brug for stærk konsistens.

Features

  • PostgreSQL wire-protokol-kompatibilitet
  • Horisontal skalering (tilføj noder on-the-fly)
  • ACID-transaktioner på tværs af distribuerede noder
  • Automatisk failover og selv-helbredning
  • Geo-partitionering for datalokalitet
  • Serializable isolation som standard
  • Multi-region replikering
  • Intet enkelt fejlpunkt

Query Eksempel

-- CockroachDB bruger PostgreSQL-compatible SQL

-- 1. Opret database
CREATE DATABASE ecommerce;
USE ecommerce;

-- 2. Opret tabel med geo-partitioning
CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  email STRING UNIQUE NOT NULL,
  name STRING,
  region STRING NOT NULL,
  created_at TIMESTAMP DEFAULT now()
);

-- Geo-partition data efter region
ALTER TABLE users PARTITION BY LIST (region) (
  PARTITION eu VALUES IN ('eu-west', 'eu-north'),
  PARTITION us VALUES IN ('us-east', 'us-west'),
  PARTITION asia VALUES IN ('asia-east', 'asia-south')
);

-- Pin partitions til specific regions
ALTER PARTITION eu OF TABLE users 
  CONFIGURE ZONE USING constraints = '[+region=eu-west-1]';

ALTER PARTITION us OF TABLE users 
  CONFIGURE ZONE USING constraints = '[+region=us-east-1]';

-- 3. Transactions (distributed ACID)
BEGIN;

INSERT INTO users (email, name, region) 
VALUES ('peter@email.dk', 'Peter Hansen', 'eu-west');

INSERT INTO orders (user_id, total) 
VALUES ((SELECT id FROM users WHERE email = 'peter@email.dk'), 999.99);

COMMIT;

-- 4. Standard SQL queries
SELECT 
  u.name,
  u.email,
  COUNT(o.id) as order_count,
  SUM(o.total) as total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name, u.email
HAVING SUM(o.total) > 1000
ORDER BY total_spent DESC;

-- 5. Show cluster info
SHOW RANGES FROM TABLE users;
SHOW ZONE CONFIGURATION FOR TABLE users;

-- 6. Follower reads (reduce latency)
SELECT * FROM users 
AS OF SYSTEM TIME follower_read_timestamp()
WHERE region = 'eu-west';

-- 7. Backup (distributed)
BACKUP DATABASE ecommerce 
TO 's3://my-backup-bucket/cockroach-backup?AWS_ACCESS_KEY_ID=xxx';

-- 8. Index creation
CREATE INDEX idx_users_region ON users(region);
CREATE INDEX idx_users_email ON users(email) STORING (name);

-- 9. Change data capture
CREATE CHANGEFEED FOR TABLE users 
INTO 'kafka://kafka-server:9092'
WITH updated, resolved;

-- 10. Multi-region setup
ALTER DATABASE ecommerce SET PRIMARY REGION "us-east-1";
ALTER DATABASE ecommerce ADD REGION "eu-west-1";
ALTER DATABASE ecommerce ADD REGION "asia-east-1";

-- 11. Survive region failure
ALTER DATABASE ecommerce SURVIVE REGION FAILURE;

-- Node.js eksempel
const { Client } = require('pg');

const client = new Client({
  host: 'localhost',
  port: 26257,
  user: 'root',
  database: 'ecommerce'
});

await client.connect();

// Distributed transaction
try {
  await client.query('BEGIN');
  
  const result = await client.query(
    'INSERT INTO users (email, name, region) VALUES ($1, $2, $3) RETURNING id',
    ['test@email.com', 'Test User', 'eu-west']
  );
  
  const userId = result.rows[0].id;
  
  await client.query(
    'INSERT INTO orders (user_id, total) VALUES ($1, $2)',
    [userId, 99.99]
  );
  
  await client.query('COMMIT');
  console.log('Transaction committed successfully');
} catch (error) {
  await client.query('ROLLBACK');
  console.error('Transaction failed:', error);
}

Anvendelsesområder

  • Globale applikationer med multi-region deployment
  • Systemer med høj tilgængelighed (99,99%+ uptime)
  • Finansielle applikationer der kræver ACID
  • SaaS-platforme med uforudsigelig vækst
  • Applikationer med GDPR-datalokalitetskrav

Fordele

  • Skalerer horisontalt som NoSQL
  • ACID-garantier på tværs af distribueret system
  • PostgreSQL-kompatibel (SQL)
  • Automatisk load balancing og rebalancering
  • Ingen manuel sharding nødvendig

Ulemper

  • Højere latenstid end single-node databaser
  • Mere kompleks at operere
  • Dyrt i cloud (mange noder)
  • Ikke alle PostgreSQL-funktioner understøttet
  • Indlæringskurve for distribuerede koncepter

Bedst til

  • Globale SaaS-applikationer
  • Finansielle systemer med strenge konsistenskrav
  • E-handel med verdensomspændende kunder
  • Multi-tenant applikationer
  • Applikationer der skal skalere uforudsigeligt

Ikke anbefalet til

  • Små applikationer (overkill)
  • Single-region applikationer
  • Ultralav latenstid-krav (< 10ms)
  • Budgetbevidste projekter (dyrt)
  • Simple CRUD-apps (MySQL/Postgres er nok)

Relaterede databaser

PostgreSQLGoogle SpannerYugabyteDBTiDBAmazon Aurora