Cassandra
Tips
- apache/cassandra
 - 配置文件 http://cassandra.apache.org/doc/latest/configuration/cassandra_config_file.html
 - http://projects.spring.io/spring-data-cassandra/
 - 客户端
 - 数据模型
 - 硬件要求 - 生产最低 2 核 8G,推荐 8 核 32G
 
# 启动用于测试的服务
# 暴露 JMX 和 CQL 端口
# 使用了 mmap, 在 mac 下不能映射 volume
docker run -it --rm -p 9042:9042 -p 7199:7199 -v /data/cassandra/dev:/var/lib/cassandra cassandra
# 本地连接 docker 中的服务器
cqlsh `docker-machine ip`
# 可从容器中将配置拷贝出来
docker cp cassandra:/etc/cassandra config
# 自定义 yaml 配置
JVM_OPTS="$JVM_OPTS -Dcassandra.config=file://$PWD/config/cassandra.yaml" cassandra -f
# 默认配置目录 /usr/local/etc/cassandra/
# 默认数据目录 /usr/local/var/lib/cassandra/
brew install cassandra
-- 创建空间
CREATE KEYSPACE Excelsior
WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
USE Excelsior;
-- 创建一个最小表
CREATE TABLE t (k text PRIMARY KEY);
-- 插入和查询
INSERT INTO t(k) values('Hello');
SELECT * FROM t;
-- http://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlshDescribe.html
-- 显示所有表
DESCRIBE TABLES;
Notes
org.apache.cassandra.config.YamlConfigurationLoader- 加载 YAML 配置
 
org.apache.cassandra.config.Config- 配置类
 
- 主键
- 类型
- 分片
 - 集群
 
 
 - 类型
 
Doc Notes
- 端口
- 7000 集群通信
 - 7001 集群通信 SSL
 - 9042 客户端
 - 7199 JMX
 
 - 默认 BLOB 最大 16M
- max_mutation_size_in_kb
 - commitlog_segment_size_in_mb 的一半
 
 - BLOB 没有做特殊优化, 建议 <10MB 单个值, 更大的 BLOB 建议应用分块
 - 分片键相同的行在同一个分片
 - STATIC 列由同一个分片共享
- 与 COMPACT STORAGE 冲突
 
 - 主键由两部分组成
- 分片键, Partition Key
 - 族群列, Clustering Columns
 PRIMARY KEY (a)- 分片键 a
 - 没有族群列
 
PRIMARY KEY (a, b, c)- 分片键 a
 - 族群列 b, c
 
PRIMARY KEY ((a, b), c)- 组合分片键 a,b
 - 族群列
 
 - COMPACT STORAGE
- 创建后不可修改
 - 4.0 后已经移除, 不建议使用
 - 限制
- 不能使用集合和 STATIC 列
 - 如果一个 compact table 有至少一列 clustering column,那么在主键之外只能有一列
 - 也就意味着在创建后不能修改列定义
 - compact table 只限制了创建的索引, 而 materialized view 是不受限制的
 
 
 - CLUSTERING ORDER
- 创建后不可修改
 - 用于修改族群列的顺序
 - 限制
- 会影响 SELECT 能够使用的 order 顺序
 - 如果 
WITH CLUSTERING ORDER (a DESC, b ASC)- 可以使用 
ORDER BY (a DESC, b ASC),ORDER BY (a ASC, b DESC) - 不能使用 
ORDER BY (a ASC, b ASC),ORDER BY (a DESC, b DESC) 
 - 可以使用 
 - 会修改默认顺序
- 分片内会以定义的顺序返回
 
 - 在某些查询中,反序查询可能会有一定的性能影响
 
 
 - 创建表时的 WITH 选项
 - Materialized View
- 由三个部分组成
- SELECT 语句
 - 主键
- 必须包含所有基础表的主键
 - 只能包含一个额外列作为主键
 
 - 选项
 
 
 - 由三个部分组成
 - 安全
- 角色
- 可以有密码
 - 可以控制是否允许登陆
 
 - 权限
- 类型
- CREATE
 - ALTER
 - DROP
 - SELECT
 - MODIFY
 - AUTHORIZE
 - DESCRIBE
 - EXECUTE
 
 - 资源
- ALL KEYSPACES -> KEYSPACE -> TABLE
 - ALL FUNCTIONS -> KEYSPACE -> FUNCTION
 - ALL ROLES -> ROLE
 - ALL MBEANS -> MBEAN
 
 
 - 类型
 - 用户
- 主要用于兼容
 - 相当于新版本中的角色
 
 
 - 角色
 - 函数
- 标量函数
 - 聚合函数
 - 处于安全考虑, 用户定义函数默认是关闭的, 
enable_user_defined_functions - 用户定义函数会运行在沙箱中
 - 內建函数
cast类型转换SELECT avg(cast(count as double)) FROM myTabletoken计算分片键uuid生成 UUIDnow生成 timeuuid
 - 用户定义函数
- 使用 Java 编写
 - 上下文为 
org.apache.cassandra.cql3.functions.UDFContext 
 
 - JSON
- 依然是强类型的
 - 只是简化基于 JSON 的操作
 - 提供 fromJSON 和 toJSON 函数
 
 - 触发器
- 创建触发器需要制定对应的 Java 类
 - 将 Java 类放在 
lib/triggers 
 
Cassandra 4.0
- Java 11
 - Virtual Tables
- backed by an API instead of data
 
 - Audit Logging
 - Full Query Logging (FQL)
 - Internode Messaging 增强
 - Streaming 增强
- Netty NIO
 - Zero Copy
 
 - Transient Replication