赞
踩
Apache Cassandra是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存收件箱等简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身。Facebook于2008将 Cassandra 开源,此后,由于Cassandra良好的可扩放性,被Digg、Twitter等知名Web 2.0网站所采纳,成为了一种流行的分布式结构化数据存储方案。
它是一个开源的、分布式、无中心、支持水平扩展、高可用的KEY-VALUE类型的NOSQL数据库。
官网文档地址http://cassandra.apache.org/doc/latest/
Apache Cassandra,目前最新版3.0.13
DataStax Community Edition(基于Apache Cassandra,推荐使用)
- 支持yum、rpm快速安装
- yum安装升级方便
- 目录环境自动配置
- 方便与OpsCenter结合
CQL开发工具-DevCenter
运维工具-OpsCenter
DataStax是针对Cassandra进行商业化运作的公司。
由亚马逊的Dynamo与Google 的BigTable两部分组成。
什么叫数据库的一致性?读操作一定会返回最新写入的结果。
Cassandra是最终一致性(弱一致性):成功写入后,读取的并不一定是最新数据,但过一段时间(毫秒级别,跨机房时间会更长)所有副本才会达成一致。
Cassandra是最终一致性原因:优化写入性能,支持ONE、Qurum、ALL等。
Cassandra支持致性调节:当要求成功写入节点数与副本数一致时,即ALL时,认为是强一致性的。
CAP理论指出在一个分布式系统中,你只能强化其中两个方面
- Consistent:一致性,每次读取都是最新的数据
- Available:可用性,客户端总是可以读写数据
- Partition Tolerant:分区耐受性,数据库分散到多台机器,即使某台机器故障,也可以提供服务
DataStax Java Driver for Apache Cassandra是Apache Cassandra的一个Java驱动。它支持Cassandra Query Language version 3(CQL3)和Cassandra的二进制协议。它主要包括以下模块。
- driver-core:核心层
- driver-mapping:对象映射
- driver-extras:JAVA驱动的可选特性
- driver-examples
- driver-tests
驱动文档地址http://docs.datastax.com/en/developer/java-driver/3.0/
Cassandra | 关系数据库 |
---|---|
水平扩展 | Yes |
高可用性 | Yes |
查询方式 | CQL(类似SQL),API |
一致性 | 可调节一致性 |
事务支持 | 1.X支持行级事务,2.X支持轻量级事务处理机制 |
Cassandra概述与数据模型设计https://wenku.baidu.com/view/8eaabe6987c24028915fc386.html
DB-Engine数据库排名https://db-engines.com/en/ranking
HBase位于15名。
如果有不熟悉命令的,进行cqlsh
命令行模式后,输入help
进行查看支持的命令。
CQL是一种类似SQL的查询语言,它支持相当丰富的数据类型,如下。
cql_type ::= native_type | collection_type | user_defined_type | tuple_type | custom_type
native_type ::= ASCII
| BIGINT
| BLOB
| BOOLEAN
| COUNTER
| DATE
| DECIMAL
| DOUBLE
| DURATION
| FLOAT
| INET
| INT
| SMALLINT
| TEXT
| TIME
| TIMESTAMP
| TIMEUUID
| TINYINT
| UUID
| VARCHAR
| VARINT
数据库数据类型与JAVA数据类型的映射关系。
CQL3 data type | Getter name | Java type |
---|---|---|
ascii | getString | java.lang.String |
bigint | getLong | long |
blob | getBytes | java.nio.ByteBuffer |
boolean | getBool | boolean |
counter | getLong | long |
date | getDate | LocalDate |
decimal | getDecimal | java.math.BigDecimal |
double | getDouble | double |
float | getFloat | float |
inet | getInet | java.net.InetAddress |
int | getInt | int |
list | getList | java.util.List |
map | getMap | java.util.Map |
set | getSet | java.util.Set |
smallint | getShort | short |
text | getString | java.lang.String |
time | getTime | long |
timestamp | getTimestamp | java.util.Date |
timeuuid | getUUID | java.util.UUID |
tinyint | getByte | byte |
tuple | getTupleValue | TupleValue |
user-define types | getUDTValue | UDTValue |
uuid | getUUID | java.util.UUID |
varchar | getString | java.lang.String |
varint | getVarint | java.math.BigInteger |
Cassandra的存储抽象结构和数据库一样,keyspace对应关系数据库的database或schema,column family对应于table。
示例如下:
CREATE KEYSPACE iotstp WITH replication = {'class': 'SimpleStrategy','replication_factor': 1};
其它操作
ALTER KEYSPACE iotstp WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 4};
use iotstp;
DROP KEYSPACE iotstp;
查看当前有哪些keyspace使用命令desc keyspaces
。
创建示例如下:
CREATE TABLE IF NOT EXISTS iotstp.user (
id timeuuid,
tenant_id timeuuid,
email text,
additional_info text,
PRIMARY KEY (id, tenant_id)
);
修改示例:
alter_table_statement ::= ALTER TABLE table_name alter_table_instruction
alter_table_instruction ::= ADD column_name cql_type ( ',' column_name cql_type )*
| DROP column_name ( column_name )*
| WITH options
ALTER TABLE iotstp.user ADD address varchar;
ALTER TABLE iotstp.user
WITH comment = 'A most excellent and useful table'
AND read_repair_chance = 0.2;
删除表
drop_table_statement ::= DROP TABLE [ IF EXISTS ] table_name
清空表
truncate_statement ::= TRUNCATE [ TABLE ] table_name
查看当前有哪些table使用命令desc tables
。
select查询
select_statement ::= SELECT [ JSON | DISTINCT ] ( select_clause | '*' )
FROM table_name
[ WHERE where_clause ]
[ GROUP BY group_by_clause ]
[ ORDER BY ordering_clause ]
[ PER PARTITION LIMIT (integer | bind_marker) ]
[ LIMIT (integer | bind_marker) ]
[ ALLOW FILTERING ]
select_clause ::= selector [ AS identifier ] ( ',' selector [ AS identifier ] )
selector ::= column_name
| term
| CAST '(' selector AS cql_type ')'
| function_name '(' [ selector ( ',' selector )* ] ')'
| COUNT '(' '*' ')'
where_clause ::= relation ( AND relation )*
relation ::= column_name operator term
'(' column_name ( ',' column_name )* ')' operator tuple_literal
TOKEN '(' column_name ( ',' column_name )* ')' operator term
operator ::= '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | CONTAINS | CONTAINS KEY
group_by_clause ::= column_name ( ',' column_name )*
ordering_clause ::= column_name [ ASC | DESC ] ( ',' column_name [ ASC | DESC ] )*
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 (*) AS user_count FROM users;
insert插入
insert_statement ::= INSERT INTO table_name ( names_values | json_clause )
[ IF NOT EXISTS ]
[ USING update_parameter ( AND update_parameter )* ]
names_values ::= names VALUES tuple_literal
json_clause ::= JSON string [ DEFAULT ( NULL | UNSET ) ]
names ::= '(' column_name ( ',' column_name )* ')'
INSERT INTO NerdMovies (movie, director, main_actor, year)
VALUES ('Serenity', 'Joss Whedon', 'Nathan Fillion', 2005)
USING TTL 86400;
INSERT INTO NerdMovies JSON '{"movie": "Serenity",
"director": "Joss Whedon",
"year": 2005}';
update更新
update_statement ::= UPDATE table_name
[ USING update_parameter ( AND update_parameter )* ]
SET assignment ( ',' assignment )*
WHERE where_clause
[ IF ( EXISTS | condition ( AND condition )*) ]
update_parameter ::= ( TIMESTAMP | TTL ) ( integer | bind_marker )
assignment ::= simple_selection '=' term
| column_name '=' column_name ( '+' | '-' ) term
| column_name '=' list_literal '+' column_name
simple_selection ::= column_name
| column_name '[' term ']'
| column_name '.' `field_name
condition ::= simple_selection operator term
UPDATE NerdMovies USING TTL 400
SET director = 'Joss Whedon',
main_actor = 'Nathan Fillion',
year = 2005
WHERE movie = 'Serenity';
UPDATE UserActions
SET total = total + 2
WHERE user = B70DE1D0-9908-4AE3-BE34-5573E5B09F14
AND action = 'click';
delete 删除
delete_statement ::= DELETE [ simple_selection ( ',' simple_selection ) ]
FROM table_name
[ USING update_parameter ( AND update_parameter )* ]
WHERE where_clause
[ IF ( EXISTS | condition ( AND condition )*) ]
DELETE FROM NerdMovies USING TIMESTAMP 1240003134
WHERE movie = 'Serenity';
DELETE phone FROM Users
WHERE userid IN (C73DE1D3-AF08-40F3-B124-3FF3E5109F22, B70DE1D0-9908-4AE3-BE34-5573E5B09F14);
更新与删除只支持按主键进行,意思是where关键字后面必须携带主键字段。
如果采用datastax社区免费版本,则下载地址https://academy.datastax.com/planet-cassandra//cassandra/,我下载的为windows 3.0.9版本。
当cassandra安装好后,配置文件放在安装目录的conf目录下,如我的机器中F:\Program Files\DataStax Community\apache-cassandra\conf
,配置文件名为cassandra.yaml
,主要关注以下两部分。
- Main runtime properties(主要的cassandra运行时属性)
a) cluster_name:集群名,同一集群的多个节点,集群名要一致
b) seeds: 种子节点,集群中的全部机器的ip,以逗号隔开
c) storage_port: Cassandra服务器与服务器之间连接的端口号,一般不需要修改,但要保证此端口上没有防火墙
d) listen_address: Cassandra集群中服务器与服务器之间相互通信的地址。如果留空,将默认使用服务器的机器名
e) native_transport_port: 默认的CQL本地服务端口,本地的cql客户端与服务器交互的端口
- Changing the location of directories(相关的文件目录)
a) data_file_directories: 数据文件存放的目录,一个或多个
b) commitlog_directory: 提交信息的日志文件存放的目录
c) saved_caches_directory: 缓存存放的目录
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。