Cassandra1.2文档学习(13)—— 数据读取
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_reads_c.html#concept_ds_vrp_4qx_zj
不像大部分数据库。Cassandra从固态硬盘中平行随机读取数据性能很好,具有极低的延迟。不推荐使用常见的硬盘。Cassandra读和写一样,数据是被key分隔开,去除了很多关系型数据库需要用到的复杂查询。
首先,Cassandra会检查 Bloom filter。每一个SSTable有一个与之关联的 Bloom filter, Bloom filter用来通过key在真正通过磁盘 I/O查询数据前检测是否有SSTable是否可能含有查询的数据。如果 Bloom filter检测出数据存在,那么SSTable可能包含数据,但如果 Bloom filter检测出数据不存在,那么SSTable中一定不包含数据。
如果 Bloom filter检测出数据存在,Cassandra会检查 partition key cache并且采取一下行动中的一个:
•如果在缓存中发现了一个索引条目:
◦Cassandra去压缩位移图中查找包含数据的压缩块
◦读取磁盘上包含数据的压缩块并返回结果集。
•如果在缓存中没有发现了一个索引条目:
◦Cassandra搜索partition summary去确定索引条目在磁盘上的确切的位置
◦接下来,为了读取索引条目,卡桑德拉第一时间读取磁盘,如果列是相邻的,在SSTable中执行一个单一的查询和一个顺序的读取(一系列读取)。
◦Cassandra去压缩位移图中查找包含数据的压缩块
◦读取磁盘上包含数据的压缩块并返回结果集。

在Cassandra 1.2 及之后的版本, Bloom filter 和压缩位移图不再是堆,这大大加强了节点处理数据的能力。内存中,只有分区键缓存是固定大小的。其他部分随个数据集增加而增加。
•Bloom filter 的大小增长到大约1-2 GB每十亿分区。在极端的情况下,每一行可以有一个分区,所以在一台机器可以有几十亿的条目。 Bloom filter是可以调整的如果你需要交换存储器性能。
•默认情况下,分区总结是一个分区的指标样本。你可以在cassandra.yaml文件通过改变index_interval 属性的值来配置采样频率。你可以增加index_interval到512。Cassandra 1.2.5通过在java虚拟机中使用原长代替装箱数以减少分区总结的大小。
•压缩位移图的大小增长到大约1-3 GB每TB压缩。你越压缩数据,你会有更多的压缩快和更大的压缩位移图。
即使压缩位移图会消耗CPU资源,压缩仍是默认启用的。采用压缩会让页面缓存更有效率,通常,几乎总会有回报的。
一、读取集群行
使用CQL 3模式,Cassandra的存储引擎使用复合列存储集群行。所有使用相同分区键的逻辑行存储在单一的物理行。在一个分区内,对于查询来说所有的行不是相等价值的。分区的开始——第一行,聚合了你的key定义——对于查询来说价值比较低因为对于索引的分区级别没有必要。
二、关于读取路径
当一个节点接受到对于某一行的一个读取请求,为了产生所需的数据,闭合从所有包含那一行column的SSTable中组合数据,包括从任何未将数据刷新到SSTable的memtable。
此图描绘了一个读请求读取路径,仍然是更新写入路径的那个例子:

例如,有一行数据包含了用户的信息,并且此时你需要更新用户的email地址。Cassandra不会在另一个数据文件中重写完整的一行,只是仅仅将新的email地址放在一个新的数据文件中。用户的名字和密码仍然存在旧的数据文件中。
在此图中SSTable中的红线是一行的碎片,这些碎片Cassandra需要去整合然后返回用户最终的请求结果。Cassandra缓存了合并后的值,而不是原始的行碎片。 这样节省了CPU和磁盘I/O。

行缓存是一个写入缓存,所以如果你有一个高速缓存的行并且你更新了那一行,它将在缓存更新,你仍然不要去合并。
三、写入模式是如何影响读取的
Cassandra中数据的 compaction strategy类型是可以配置的并且会显著影响读取的性能。当行经常更新时,使用SizeTieredCompactionStrategy往往会造成数据碎片。 LeveledCompactionStrategy (LCS)设计用来在上述条件下防止碎片的产生。
四、行缓存是如何影响读取的
对于任何数据库,所取的数据在内存中时读取会更快。尽管现在的存储系统某种形式上的缓存去更快的访问到热门的数据,并不是所有的存储系统会降低性能当缓存容量超出并且磁盘I / O是需要的。Cassandra的读取性能受益于 built-in caching(内置缓存)。对于那些经常访问的行,Cassandra有一个内置的key缓存和一个可选的行缓存。
五、压紧和压缩是如何影响读取的
为了防止读取速度下降,压紧在后台运行,并且没有随机I/O。压缩最大化了节点的的存储容量并且减少了磁盘I/O,特别是读取为主的负载。
当因为读取的负担加重,Cassandra增加中I/O活动时,典型的方式是向集群中增加更多的节点。Cassandra避免在读取文件中途解压数据,使得压缩透明化。
Cassandra1.2文档学习(13)—— 数据读取的更多相关文章
- Cassandra1.2文档学习解读计划——为自己鼓劲
最近想深入研究一下Cassandra,而Cassandra没有中文文档,仅有的一些参考书都是0.7/0.6版本的.因此有个计划,一边学习文档(地址:http://www.datastax.com/do ...
- Cassandra1.2文档学习(9)—— 数据写入
数据参考:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/manage_dml ...
- Cassandra1.2文档学习(6)—— 客户端数据请求
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...
- Cassandra1.2文档学习(3)——数据分配和复制
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...
- Cassandra1.2文档学习(11)—— 删除数据
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_ ...
- Cassandra1.2文档学习(10)—— 插入和更新数据
参考数据:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_ ...
- Cassandra1.2文档学习(15)—— 配置数据一致性
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_config ...
- Cassandra1.2文档学习(1)——Cassandra基本说明
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...
- Cassandra1.2文档学习(14)—— 事务和并发控制
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_ ...
随机推荐
- Spring 的微内核与FactoryBean扩展机制--转载
作者:江南白衣 原文地址: http://www.blogjava.net/calvin/archive/2005/08/30/11099.html http://www.blogjava.net/c ...
- [Security] Automatically adding CSRF tokens to ajax calls when using jQuery--转
地址:http://erlend.oftedal.no/blog/?blogid=118 When building a ajax based application, you want to pro ...
- Fedora安装
转载:http://www.51ou.com/browse/fedora/33174.html 安装fedora后的20个系统设置 安装VirtualBox增强工具 1.编辑sudoers文件,先备份 ...
- linux - 输入输出重定向 及 管道
> 正确结果重定向 2> 错误结果重定向 &> 正确和错误全部重定向 >> 追加,其它同> 标准输出实际上就是显示器,比如我们使用cat命令打开一个文件,文 ...
- SSH整合_struts.xml 模板
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...
- 【记忆化搜索】Codeforces Round #295 (Div. 2) B - Two Buttons
题意:给你一个数字n,有两种操作:减1或乘2,问最多经过几次操作能变成m: 随后发篇随笔普及下memset函数的初始化问题.自己也是涨了好多姿势. 代码 #include<iostream> ...
- echars3.0 柱状图y轴字体斜放
xAxis: [ { type: 'category', axisLabel: { interval: 0, rotate: 45,//倾斜角度设置,是什么时针未测 margin: 2 //距离上部的 ...
- Linux 命令 - alias: 设置或显示别名
当一个命令太长或者不符合用户的习惯,那么可以为该命令指定一个符合用户习惯的别名.比如习惯 DOS 命令的用户可以使用 alias md='mkdir' 命令将 md 来替换 mkdir.有时也为经常调 ...
- C# 为网络程序添加用户代理
如何为网络程序添加用户代理,本人推荐使用UrlMkSetSessionOption函数, 不过该函数有一个弱点不可以X64编译,X86编译软件才可以调用该函数 否则会一直返回!S_OK意义错误.第二呢 ...
- Servlet之初识
doHeader 用于处理HEADER请求doGet 用于处理GET请求,也可以自动的支持HEADER请求doPost 用于处理POST请求 doPut 用于处理PUT请求 doDelete 用于处理 ...