Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynamo (分布式的Key-Value存储系统)更丰富,最初由Facebook开发并贡献给apache
介绍
- Cassandra 是一款 Open Source NoSQL Database,用来管理海量数据,速度快,而不会丢数据。
- 使用场景
- 互联网类应用,如日志、消息、feed流、订单、账单、网站等
- 多活
- 写密集、统计和分析型工作
- 数据驱动的业务
 
- 核心概念
- CQL(Cassandra Query Language)是 cassandra 中提供的一种类 SQL 查询语言
- 数据中心(Data Center, DC)是指在同一地域下,电力、网络隔离的一组节点- 
- 在多DC的部署架构下面,DC之间内网互通,同一DC内网络延时更小,不同DC之间故障隔离
 
- Partitioner用来确定将数据均衡分布在节点上的策略- 
- 云数据库 Cassandra 中,默认使用 Murmur3Partitioner
 
- 副本数(Replication factor)表示数据在集群中存几副本- 
- 例如:副本数为 2 表示每行数据在集群中保存了两个副本,每个副本都在不同的节点上面
- 云数据库Cassandra中,副本数由用户在创建 keyspace 时指定
 
- 副本策略(Replica placement strategy)用来确定将副本存放在哪个节点上面- 
- 云数据库 Cassandra 中,副本策略由用户在创建 keyspace 时指定
- 推荐您使用 NetworkTopologyStrategy 策略,可更便捷地将集群扩展至多个DC
 
- KeySpace:一个 KeySpace 下包含若干个表,用户可以在 keyspce 这个级别指定副本策略
- Cluster一个集群包含一个或多个数据中心
- SSTable(Sorted String Table)一个 SSTable 是一个不可变的数据文件,Cassandra 定期将 memtables 写入其中
- 提交日志(Commit log)为了持久性,所有数据写入之前都要首先写入- 提交日志(日志写入优先)- 
- 所有数据都刷新到SSTables之后,就可以对其进行归档、删除或回收
 
- CQL Table按表行获取的有序列的集合
- Node存储数据的节点
- snitch将一组机器定义为数据中心和机架(拓扑),副本策略使用这些数据中心和机架放置副本
 
部署
常用端口
- 7199JMX(8080 pre Cassandra 0.8.xx)
- 7000节点间通信(非 TLS)
- 7001TLS 节点间通信
- 9160Thrift 客户端 API
- 9042CQL 本地传输端口
使用 Docker 安装 Cassandra
docker pull cassandra:latest
docker network create cassandra
docker run --rm -d --name cassandra --hostname cassandra --network cassandra cassandra
CQL
Cassandra 查询语言 (CQL) 与 SQL 非常相似,但适合 Cassandra 的无 JOIN 结构。
-- Create a keyspace
CREATE KEYSPACE IF NOT EXISTS store WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : '1' };
-- Create a table
CREATE TABLE IF NOT EXISTS store.shopping_cart (
userid text PRIMARY KEY,
item_count int,
last_update_timestamp timestamp
);
-- Insert some data
INSERT INTO store.shopping_cart
(userid, item_count, last_update_timestamp)
VALUES ('9876', 2, toTimeStamp(now()));
INSERT INTO store.shopping_cart
(userid, item_count, last_update_timestamp)
VALUES ('1234', 5, toTimeStamp(now()));
- 从 data.cql加载数据到 Cassandra
docker run --rm --network cassandra -v "$(pwd)/data.cql:/scripts/data.cql" -e CQLSH_HOST=cassandra -e CQLSH_PORT=9042 -e CQLVERSION=3.4.6 nuvo/docker-cqlsh
$ docker run --rm -it --network cassandra nuvo/docker-cqlsh cqlsh cassandra 9042 --cqlversion='3.4.5'
Connected to Test Cluster at cassandra:9042.
[cqlsh 5.0.1 | Cassandra 4.0.4 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.
cqlsh>
# 查
SELECT * FROM store.shopping_cart;
# 写
INSERT INTO store.shopping_cart (userid, item_count) VALUES ('4567', 20);