Cassandra入门调研

Cassandra 最新版本3.11.3;

以下可能有不正确的地方欢迎留言

核心定义:

gossip作为集群中结点的通信协议,无主从之分

peer to peer

W + R > N;一般来说 w和r的取值为(n+1)/2,保证有超过一半的node写入成功,保证最终一致性。但是也可以自由控制ANY,ONE,QUORUM,ALL 等

倾向于AP,一致性哈希(Consistent Hash Ring)&水平扩展,基于column

性能情况

写入操作非常高效,这对于实时数据非常大的应用场景,Cassandra的这一特性无疑极具优势。

数据读取方面则要视情况而定:

  • 如果是单个读取即指定了键值,会很快的返回查询结果。
  • 如果是范围查询,由于查询的目标可能存储在多个节点上,这就需要对多个节点进行查询,所以返回速度会很慢
  • 读取全表数据,非常低效。

相关文档链接

使用情况

一般查询

针对主键和索引列查询,2.1开始可以使用集合索引;3.0以后非索引列查询

1、第一主键(分区键) 只能用=号查询

  2、第二主键 支持= 、>、 < 、>=、 <=

  3、索引列 只支持=号

根据第一主键来确定数据存储的节点,不然就需要查询所有节点的数据,虽然可以通过索引来查找,但是效率非常低。

count(*) 很慢 ??

关联查询

Cassandra并不支持关联查询,也不支持分组和聚合操作。

cassandra建立中间表来进行关联操作

Cassandra中通过数据冗余来实现高效的查询效果。将关联查询转换为单一的表操作。

分页

假设主键为(key1,key2,key3)

select * from table limit 2;

1、第一次查询,得到的记录数若小于pageSize,那么就说明后面没数据,若等于pageSize,那就不知道是否还有数据,则需要进行第二次查询。

记录第一次分页中最后一条的key1,key2,key3

select * from table where token(key1)=token(key1) and (key2,key3)>(key2,key3) limit 2 ALLOW FILTERING;

select * from teacher where token(key1)>token(key1) limit num;

2、第二次查询,先从token(key1))=开始查,若在token(key1)=的查询中出现记录数(searchedCounts)小于pageSize,则转向token(key1)>的开始查,若token(key1)>的查询记录数小于(pageSize – searchedCounts),那么就说明没有数据了,若token(key1)>的查询记录数等于(pageSize – searchedCounts),那么重复第二次查询。

综上所述,知道后面没有数据的点只有两个,1、第一次查询的时候;2、token(key1)>的时候,其他时候都不能断定后面没有数据,cassandra 的分页查询,主要是通过查询结果的默认的排列顺序来实现的。

分组和聚合

不支持group by 、max、min、jion 也不支持子查询,强调反范式,通过冗余数据的方式来实现前面的操作.

【空间换时间】

总的来说,在建立Cassandra数据模型的时候,要求对数据的读取需求尽可能的清晰,然后利用反范式的设计方式来实现快速的读取,原则就是以空间来换取时间。

主键和分区键

primary key((type, day), ts) 联合主键;其中第一主键(type,day)作为Partition Key

Partition Key 决定Cassandra会用哪个节点来记录该数据。

第一个组成被称为是Partition Key,而后面的各组成则被称为是Clustering Key,而Clustering Key则用来在Partition内部排序,查询时Partition/Clustering Key类似mysql的最左原则.如果一个Primary Key只包含一个域,那么其将只拥有Partition Key而没有Clustering Key。

基本概念

Column,Super Column,Column Family以及Keyspace

keyspace 类比database;Column Family 类比table

keyspace就是Column Family的集合,键空间是Cassandra的数据容器,可以理解为关系型数据库中的数据库(Database)。对于一个Keyspace来说,有以下几个属性:

  • 数据复制节点数目(Replication factor ):定义Keyspace中每行数据的复制节点数目,如果定义为三,在哈希环上,每行数据将会有三个拷贝节点,并且都能够被客户端请求到。
  • 复制替换策略(Replica placement strategy):定义在一致性哈希环中某个节点的替换策略。
  • 列族(Column Families):类似于关系型数据库中的表(Table),是列的容器。

Column是Cassandra所支持的最基础的数据模型。该模型中可以包含一系列键值对:

{
     "name": "张三",
     "value": "zhangsan",
     "timestamp": 123456789
     }

Super Column则包含了一系列Column。在一个Super Column中的属性可以是一个Column的集合:

----> 不再建议使用;谨慎操作

{
    "name": "Cassandra Example",
    "value": {
        "auther": { "name": "Auther Name", "value": "Sam", "timestamp": 123456789},
        "publisher": { "name": "Publisher", "value": "China Press", "timestamp": 234567890}
    }
}

而一个Column Family则是一系列Column(Super Column)的集合。在该集合中,每个Column都会有一个与之相关联的键:

Authers = {
    “1332”: {
        "name": "Auther Name",
        "value": "Sam",
        "timestamp": 123456789
    },
    “1452”: {
        “name”: “Auther Name”,
        “value”: “Lucy”,
        “timestamp”: 012343437
    }
}

列族(Column Families)

[Keyspace][ColumnFamily][Key][Column]

Solandra 结合sola和cassandra的实时分布式搜索引擎

https://github.com/tjake/Solandra 过时了,不更新

猜你喜欢

转载自blog.csdn.net/Zzhou1990/article/details/86235677