Apache Cassandra

分布式 NoSQL 数据库 - 线性扩展、无单点故障、处理海量数据

TL;DR

是什么:为高可用性和可扩展性设计的分布式 NoSQL 数据库。

为什么用:无单点故障、线性扩展、处理海量数据。

Quick Start

使用 Docker 安装

docker run --name cassandra -p 9042:9042 -d cassandra:latest

连接

docker exec -it cassandra cqlsh

创建 keyspace 和表

CREATE KEYSPACE myapp WITH replication = {
  'class': 'SimpleStrategy',
  'replication_factor': 1
};

USE myapp;

CREATE TABLE users (
  user_id UUID PRIMARY KEY,
  name TEXT,
  email TEXT,
  created_at TIMESTAMP
);

Cheatsheet

命令描述
DESCRIBE KEYSPACES;列出 keyspaces
USE keyspace;选择 keyspace
DESCRIBE TABLES;列出表
DESCRIBE TABLE name;显示表结构
SELECT * FROM table;查询数据
INSERT INTO table (...) VALUES (...);插入数据
EXIT;退出 cqlsh

Gotchas

数据建模(查询优先)

-- 基于查询设计表,而非关系
-- 查询:获取用户的所有帖子,按时间排序
CREATE TABLE posts_by_user (
  user_id UUID,
  post_id TIMEUUID,
  title TEXT,
  content TEXT,
  PRIMARY KEY (user_id, post_id)
) WITH CLUSTERING ORDER BY (post_id DESC);

CRUD 操作

-- 插入
INSERT INTO users (user_id, name, email, created_at)
VALUES (uuid(), 'John', '[email protected]', toTimestamp(now()));

-- 查询
SELECT * FROM users WHERE user_id = some-uuid;

-- 更新
UPDATE users SET name = 'Johnny'
WHERE user_id = some-uuid;

-- 删除
DELETE FROM users WHERE user_id = some-uuid;

主键结构

-- 仅分区键
PRIMARY KEY (user_id)

-- 分区键 + 聚簇列
PRIMARY KEY (user_id, created_at)

-- 复合分区键
PRIMARY KEY ((country, city), user_id)

集合类型

-- 列表
emails LIST<TEXT>

-- 集合
tags SET<TEXT>

-- 映射
properties MAP<TEXT, TEXT>

Next Steps