Chinaunix首页 | 论坛 | 博客
  • 博客访问: 552943
  • 博文数量: 89
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2699
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-14 22:27
个人简介

其实,我只是个研究生。在这里,我能感觉到自己的存在。

文章分类
文章存档

2014年(16)

2013年(73)

分类: NOSQL

2013-05-27 14:41:10

Cassandra的内部数据存储结构
1. 数据信息一共分为以下3类:
(1)data目录:用于存储真正的数据文件,即后面将要讲到的SSTable文件。如果服务器有多个磁盘,可以指定多个目录,每一个目录都在不同的磁盘中,这样Cassandra就可以利用更多的硬盘空间。
(2)commitlog目录:用于存储未写入SSTable中的数据,每次Cassandra系统中有数据写入,都会先将数据记录在该日志文件中,以保证Cassandra在任何情况下宕机都不会丢失数据,如果服务器有足够多的磁盘,可以将目录设置一个data目录和cache目录不同的磁盘中,以提升读写功能。
(3)cache目录:用于存储系统中的缓存数据。
Cassandra提供了两种记录Commitlog的方式:周期记录(periodic)和批量记录(batch)。
注:如果不允许数据丢失,可以使用周期的方式记录Commitlog,如果写入数据量非常大,同时可以承担由于机器宕机导致的数据丢失的风险,则使用批量记录方式记录Commitlog。
2. 数据写入Commitlog后,将缓存在Memtable中。Cassandra中每一个Memtable只为一个Cloumnfamily提供服务。当下面3个条件中任意一个满足后,会将Memtable中缓存的数据写入磁盘,形成一个SSTable文件:
(1)Memtable中缓存的数据达到容量上限
(2)Memtable中包含的数据的条数超过上限
(3)Memtable中距离上次将缓存的数据写入磁盘的时间超过某一个间隔。
3. 每当有数据进入Mentable中时,会将数据保存在成员变量ColumnFamilies中,并解析这个数据,排除重复或是已经过期的数据。
当Cassandra需要将Mentable中缓存的数据写入磁盘时,会按照内存中key的顺序写入SSTable中。
使用Memtable中的优势在于:将随即IO写变为顺序IO时,降低大量的写操作对存储系统的压力。
(1)Filter文件:
Filter文件用于快速定位某一个key是否在该SSTable文件中存在。
为了判断某一个key是否存在于SSTable文件中,Cassandra使用了布隆过滤器(Bloom Filter)。Cassandra使用布隆过滤器的好处在于可以减少占用的存储空间和内存空间。并提高了查询速度。
(2)Index文件:
在Index文件中,保存两类信息:key值和该key值在Data文件中对应的位置。Index文件中保存在SSTable中所有的key以及该key在Data文件中的位置。
如果要寻找一个key在Data文件中的位置,只需要顺序扫描Index文件就可以了。
Cassandra还提供一个叫做keycache的缓存,用于缓存上一次查找的key在Data中的位置。这样当下一次查询同样的key时,就不需要读取Index文件了。这个参数可以在配置文件keys_cached中进行配置。
4. 在Data文件中,保存了3类信息:key值,ColumnIndex和ColumnValue的值。其中ColumnIndex包括两类信息:Bloom Filter和Index。
5. 系统表空间:
在Cassandra中,除了用户自己定义的Keyspace之外,还有一个特殊的Keyspace:名称为System的系统表空间。用户不能在Cassandra中创建名为System的Keyspace,只能由Cassandra系统自动创建。系统表空间的主要有以下两个作用:
(1)管理Cassandra的系统元数据信息。
(2)缓存HINT数据。
6. 如果Cassandra发现某一个节点宕机,就会将发送宕机节点的数据以HINT的形式发送给另外一台Cassandra服务器。接收到HINT数据的Cassandra服务器将数据缓存到系统表空间中,当其发现宕机的Cassandra恢复后,将缓存HINT数据发送给恢复的服务器,完成数据传输后,将缓存的HINT数据从系统表空间中删除。

阅读(3458) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~