cassandra笔记
Cassandra学习笔记
cassandra笔记
横向比较nosql数据库
nosql数据库(not only sql),分布式
使用nosql的改变需求点
- 高并发读写请求
- 高容量和高效的存储需求
- 高扩展性和高可用性需求
传统关系型数据库量大瓶颈,第一数据横向扩展能力低下,第二数据的高效路存储和访问的需求满足能力低
nosql数据库特点:
- 易扩展
- 灵活的数据模型
- 高可用
- 大数据量高性能
nosql根据数据模型4类:
- 键值存储(key-value) redis
- 面向表(table-oriented) hbase cassandra
- 面向文本(document-oriented) mongodb
- 面向图(graph-oriented) neo4j
nosql趋势
nosql用户量
2018年最新的所有数据库排名前20
Cassandra快速入门
- 发展简史 两位从Amazon跳槽到Facebook的dynamo工程师完成的,Java语言编写。2009年1月成为Apache孵化项目
- Cassandra优点:
- 高度可扩展性
- 高度可用性,无单点故障,p2p去中心化处理
- nosql列簇实现
- 非常高的写入吞吐量和良好的读取吞吐量
- cql查询语言(0.8版本开始支持)
- 范围查询(键的范围)
- 可调节的一致性
- 灵活的模式
- Cassandra的应用场景(目前Apple,Facebook,ebay,360,饿了么,taobao):
- 待处理的数据量很大
- 数据量超过关系型数据库的承载能力
- 大量集群
Cassandra安装与运行
Cassandra目录结构
- bin 可执行脚本
- conf 配置
Cassandra.yml 常用的配置参数:
- cluster_name 集群的名字,默认Test Cluster
- listen_address 监听的IP或主机,默认localhost
- commitlog_directory commitlog的保存路径,压缩包方式保存
- data_file_directories 数据文件的存放目录
- save_caches_directory 缓存存放目录
- commit_failure_policy(stop,stop_commit,ignore) 提交失败是的策略
- disk_failure_policy(stop,stop_paranoid,best_offert,ignore) 磁盘故障
- endpoint_snitch 定位节点喝路由请求
- rpc_address 监听客户端链接的地址
- seed_provider 需要联系的节点地址
- compaction_throughput_mb_per_sec 限定特定吞吐量下的压缩速率,推荐16-32
- memtable_total_space_in_mb 最大使用内存空间数量
- concurrent_reads 并发读取数量
- concurrent_writes 并发写数量
- incremental_backuos 是否增量备份
- snapshot_before_compaction 压缩前执行快照
- interface 接口
- Javadoc 帮助文档
- lib 依赖的jar包
Cassandra数据模型与CQL查询语言
Cassandra数据模型
- 列(Column)
- 超级列(Super Column)
- 列族(Column Familes)
- 键空间(Keyspaces)
- 集群(Cluster)
- 复合键(Composite Keys)
- Cassandra与传统关系数据库差别
- Cassandra的排序规则
- Cassandra数据设计实例
CQL查询语言
- CQL的概念
- CQL基本含义
概念:CQL是Cassandra Query Language的简称,CQL由类似SQL的语句组成,包括修改,查询,爆粗,变更数据的存储方式等等功能。每一行语句由(;)结束
select * from mytable; update mytable set someColumn='Some Value' where columnName='Something Else';
- 大小写不敏感
忽略大小写:在CQL里,可以space,column和table的名称是忽略大小写的,除非用双引号”括起来,才是大小写敏感的。如果不用双引号括起来,即使CQL携程大小写,也会被保存位小写
CQL关键字是忽略大小写的,例如,关键字SELECT和select是等价的。用双引号引起来就变成大小写严格区分了
CREATE TABLE test( Foo int PRIMARY KEY, "Bar" int )
- 常用数据类型
- CQL命名规则
需要字母或数字开头,满足正则表达式[a-zA-Z0-9_]*
- CQL注释规则
单行注释:使用–或者//注释内容
多行注释:使用/**注释内容**/
- CQL保留字
正常不使用保留字,如果要使用,可以用“”括起来
- CQL数据定义语句
- CREATE keyspace(创建keyspacce)
语法:CREATE keyspace (if not exists)? with
注意:ID恩替反而长度需要小鱼等于32,大小写敏感,可以使用双引号定义大小写敏感的名字
create keyspace excelsior with replication={'class':'simplestrategy','replication_factor':3} create keyspace excalibur with replication={'class':'networktopoligystrategy','DC1':1,'DC2':3} and durable_writes=false;
- use keyspace(切换键空间)
- alter keyspace(修改键空间)
alter keyspace <identifer> with <proteries>
alter keyspace excelsior with replication={‘class’:‘simplestrategy’,‘replication_factor’:4}
- drop keyspace(删除键空间)
语法:
drop keyspace (if not exists)? <identifer>
drop keyspace excelsior;
- 触发器
- 自定义类型使用
CREATE KEYSPACE complex WITH replication = {'class' : 'SimpleStrategy', 'replication_factor' : 3}; CREATE TYPE complex.phone ( alias text, number text ); CREATE TYPE complex.address ( street text, city text, zip_code int, phones list<frozen<phone>> ); CREATE TABLE complex.accounts ( email text PRIMARY KEY, name text, addr frozen<address> ); -- 自定义类型:phone和address。
- CREATE keyspace(创建keyspacce)
语法:CREATE keyspace (if not exists)? with
注意:ID恩替反而长度需要小鱼等于32,大小写敏感,可以使用双引号定义大小写敏感的名字
- CQL数据操作语句
CQL数据操作语句主要是INSERT,UPDATE,DELETE,具体包括
- INSTERT
- UPDATE
- DELETE
- BATCH(原子性的操作,要么都执行成功,否则回滚)
- cql操作演示
- CQL数据查询语句
- 语法:
<select-stmt> ::= SELECT ( JSON )? <select-clause> FROM <tablename> ( WHERE <where-clause> )? ( ORDER BY <order-by> )? ( PER PARTITION LIMIT <integer> )? ( LIMIT <integer> )? ( ALLOW FILTERING )? <select-clause> ::= DISTINCT? <selection-list> <selection-list> ::= <selector> (AS <identifier>)? ( ',' <selector> (AS <identifier>)? )* | '*' <selector> ::= <identifier> | <term> | WRITETIME '(' <identifier> ')' | COUNT '(' '*' ')' | TTL '(' <identifier> ')' | CAST '(' <selector> AS <type> ')' | <function> '(' (<selector> (',' <selector>)*)? ')' <where-clause> ::= <relation> ( AND <relation> )* <relation> ::= <identifier> <op> <term> | '(' <identifier> (',' <identifier>)* ')' <op> <term-tuple> | <identifier> IN '(' ( <term> ( ',' <term>)* )? ')' | '(' <identifier> (',' <identifier>)* ')' IN '(' ( <term-tuple> ( ',' <term-tuple>)* )? ')' | TOKEN '(' <identifier> ( ',' <identifer>)* ')' <op> <term> <op> ::= '=' | '<' | '>' | '<=' | '>=' | CONTAINS | CONTAINS KEY <order-by> ::= <ordering> ( ',' <odering> )* <ordering> ::= <identifer> ( ASC | DESC )? <term-tuple> ::= '(' <term> (',' <term>)* ')'
- 例子:
SELECT name, occupation FROM users WHERE userid IN (199, 200, 207); SELECT JSON name, occupation FROM users WHERE userid = 199; SELECT name AS user_name, occupation AS user_occupation FROM users; SELECT time, value FROM events WHERE event_type = 'myEvent' AND time > '2011-02-03' AND time <= '2012-01-01' SELECT COUNT(*) FROM users; SELECT COUNT(*) AS user_count FROM users;
第一:索引查询
cassandra是支持创建二级索引的,索引可以创建在除了第一个主键之外所有的列上,当然有些类型除外,例如集合类型。
CREATE TABLE test( a INT, b INT, c INT, d INT, e INT, m INT, PRIMARY KEY(a,b,c)); CREATE INDEX ON test(c); CREATE INDEX ON test(e);
在第一主键a上创建索引是不可以的:
CREATE INDEX ON test(a) //X
索引列只可以用=号查询,所以SELECT * FROM test WHERE e=1; //是可以 SELECT * FROM test WHERE e>1; //就不行了。
如果你的查询条件里,有一个是根据索引查询,那其它非索引非主键字段,可以通过加一个ALLOW FILTERING来过滤实现、 例如:
SELECT * FROM test WHERE e=1 AND m>2 ALLOW FILTERING;
第二:排序 cassandra也是支持排序的,order by。 当然它的排序也是有条件的,
- 必须有第一主键的=号查询。cassandra的第一主键是决定记录分布在哪台机器上,也就是说cassandra只支持单台机器上的记录排序。
- 那就是只能根据第二、三、四…主键进行有序的,相同的排序。
- 不能有索引查询
SELECT * FROM test WHERE a=1 ORDER BY b DESC; SELECT * FROM test WHERE a=1 ORDER BY b DESC, c DESC; SELECT * FROM test WHERE a=1 ORDER BY b ASC; SELECT * FROM test WHERE a=1 ORDER BY b ASC, c ASC;
以上都是可以的。
SELECT * FROM test ORDER BY b DESC; //没有第一主键 不行 SELECT * FROM test WHERE a=1 ORDER BY c DESC; //必须以第二主键开始排序 SELECT * FROM test WHERE a=1 ORDER BY b DESC, c ASC; //不是相同的排序。 SELECT * FROM test WHERE e=1 ORDER BY b DESC; //不能有索引。
其实cassandra的任何查询,最后的结果都是有序的,默认的是b asc, c asc,因为它内部就是这样存储的。 当然这个默认存储排序方式,是可以在建表的时候指定的。
CREATE TABLE test( a INT, b INT, c INT, d INT, e INT, m INT, PRIMARY KEY(a,b,c)) WITH CLUSTERING ORDER BY (b DESC, c ASC);