Cassandra介绍和一些常用操作
Cassandra是一个高可靠的大规模分布式存储系统。高度可伸缩的、一致的、分布式的结构化key-value存储方案,集Google BigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身。Cassandra使用了Google BigTable的数据模型,与面向行的传统的关系型数据库不同,这是一种面向列的数据库,列被组织成为列族(Column Family),在数据库中增加一列非常方便。Cassandra的系统架构与Dynamo一脉相承,是基于O(1)DHT(分布式哈希表)的完全P2P架构,与传统的基于Sharding的数据库集群相比,Cassandra可以无缝地加入或删除节点,非常适于对于节点规模变化比较快的应用场景。 Cassandra的数据会写入多个节点,来保证数据的可靠性,在一致性、可用性和网络分区耐受能力(CAP)的折衷问题上,Cassandra比较灵活,用户在读取时可以指定要求所有副本一致(高一致性)、读到一个副本即可(高可用性)或是通过选举来确认多数副本一致即可(折衷)。这样,Cassandra可以适用于有节点、网络失效,以及多数据中心的场景。Cassandra是一套开源分布式NoSQL数据库系统,设计思想采用了google的BigTable的数据模型和Amazon的Dynamo的完全分布式架构,因而它具有很好的扩展性且不存在单点故障。 Hadoop HBase NoSQL数据库是为高扩展性系统设计的,采用了key/value模型,但它的缺点,正如NoSQL这个名字表明地那样,不支持SQL操作。这听起来像是一个很严重的缺陷。下面介绍一些在SQL中常见的操作怎样在cassandra中自然而又有效的实现。 0.示例column family表1: CREATE TABLE example ( id int,name ascii,age bigint,gender bigint,high varint,PRIMARY KEY (id,name,age) ) WITH CLUSTERING ORDER BY (name ASC,age ASC) AND bloom_filter_fp_chance = 0.1 AND caching = '{"keys":"ALL","rows_per_partition":"NONE"}' AND comment = '' AND compaction = {'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy'} AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'} AND dclocal_read_repair_chance = 0.1 AND default_time_to_live = 86400 AND gc_grace_seconds = 86400 AND max_index_interval = 2048 AND memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND read_repair_chance = 0.0 AND speculative_retry = '99.0PERCENTILE';
表1内容: id | name | age | gender | high ----+------+-----+--------+------
5 | ee | 25 | 1 | 168
1 | aa | 10 | 1 | 165
2 | bb | 20 | 0 | 170
4 | dd | 40 | 0 | 190
6 | ff | 30 | 0 | 168
3 | cc | 30 | 1 | 180
表2: CREATE TABLE test ( id int,PRIMARY KEY ((id,name),age) ) WITH CLUSTERING ORDER BY (age ASC) AND bloom_filter_fp_chance = 0.1 AND caching = '{"keys":"ALL","rows_per_partition":"NONE"}' AND comment = '' AND compaction = {'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy'} AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'} AND dclocal_read_repair_chance = 0.1 AND default_time_to_live = 86400 AND gc_grace_seconds = 86400 AND max_index_interval = 2048 AND memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND read_repair_chance = 0.0 AND speculative_retry = '99.0PERCENTILE';
表2内容: id | name | age | gender | high ----+------+-----+--------+------
1 | aa | 10 | 1 | 165
6 | ff | 30 | 0 | 168
4 | dd | 40 | 0 | 190
3 | cc | 30 | 1 | 180
5 | ee | 25 | 1 | 168
2 | bb | 20 | 0 | 170
1.查询在example表,id是分区主键,(name,age)是排序主键 select * from example where id = 1;
select * from example where id = 1 and name = ''aa";
select * from example name = ''aa" allow filtering;
select * from example name > ''aa" allow filtering;
select * from example age = 30 allow filtering; ----X
select * from test where id = 3; ---X
select * from test where age > 20 allow filtering;
如果使用分区主键查询的话,需要指定全部的分区主键,不能使用部分分区主键查询。 2.创建二级索引如果我们想直接查example表的age和test表的name了么? CREATE INDEX ON example(age);
CREATE INDEX ON test(name);
我们就能在desc example和desc test的时候看到下面的语句了: desc example:
CREATE INDEX example_age_idx ON ad.example (age);
desc test:
CREATE INDEX test_name_idx ON ad.test (name);
但是建的二级索引只能支持=查询,不支持范围查询。 3.分页查询1,2.x的api里面有支持分页查询。 cqlsh:> select * from example limit 2;
id | name | age | gender | high ----+------+-----+--------+------
5 | ee | 25 | 1 | 168
1 | aa | 10 | 1 | 165
(2 rows)
cqlsh:> select * from example where token(id) > token(1) limit 2;
id | name | age | gender | high ----+------+-----+--------+------
2 | bb | 20 | 0 | 170
4 | dd | 40 | 0 | 190
(2 rows)
cqlsh:> select * from example where token(id) > token(4) limit 2;
id | name | age | gender | high ----+------+-----+--------+------
6 | ff | 30 | 0 | 168
3 | cc | 30 | 1 | 180
4.复杂Select从现在起考虑一个基本的例子:存在一对多关系的department和employee。我们需要两个Column Family(简称“CF”):Emps和Deps。在Emps中,employee ID作为key,employee的name,birthday和city作为column;在Deps中,department ID作为key,department name作为column。 5.Join查询: 6.Group By例如查询: 7.Order By为了支持排序操作,你可以使用OrderPreservingPartitioner对数据按照key进行排序。具体可参见:Cassandra: RandomPartitioner vs OrderPreservingPartitioner 为了支持4-7的这些操作,我们针对查询存储了冗余数据,这样做意味着: 参考文章
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |