Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型。它借鉴了 Amazon 的 Dynamo 和 Google's BigTable 的数据结构和功能特点,采用 Memtable 和 SSTable 的方式进行存储。在 Cassandra 写入数据之前,需要先记录日志 ( CommitLog ),然后数据开始写入到 Column Family 对应的 Memtable 中,Memtable 是一种按照 key 排序数据的内存结构,在满足一定条件时,再把 Memtable 的数据批量的刷新到磁盘上,存储为 SSTable 。
Cassandra 的数据模型是基于列族(Column Family)的四维或五维模型。它借鉴了 Amazon 的 Dynamo 和 Google’s BigTable 的数据结构和功能特点,采用 Memtable 和 SSTable 的方式进行存储。在 Cassandra 写入数据之前,需要先记录日志 ( CommitLog ),然后数据开始写入到 Column Family 对应的 Memtable 中,Memtable 是一种按照 key 排序数据的内存结构,在满足一定条件时,再把 Memtable 的数据批量的刷新到磁盘上,存储为 SSTable 。*
Apache Cassandra™ is a massively scalable open source NoSQL database. Cassandra is perfect for managing large amounts of structured, semi-structured, and unstructured data across multiple data centers and the cloud. Cassandra delivers continuous availability, linear scalability, and operational simplicity across many commodity servers with no single point of failure, along with a powerful dynamic data model designed for maximum flexibility and fast response times.
CommitLog是一个文件追加日志文件,客户端的任何数据写入到cassandra都必须要先写入commitLog,然后在将数据写入到memtables中。以防止服务器宕机,而memtables只是保存在内存中,如果不先写入到cimmitLog,则会丢失数据。当重启的时候,cassandra从commitLog中读取数据写入到memtables中。
CommitLog默认commitlog_segment_size_in_mb是32M,当文件超过这个大小的时候,cassandra会自动的进行创建新的日志文件,而以前的日志文件则可以归档、删除或者轮训一次。
Memtables是基于内存的数据结构,基本上每一个表都存在一个活跃的memtable。当memtables占用内存大小超过了memtables设置的阈值或者commitLog日志文件达到最大值的时候,cassandra会将memtables回写到SSTables中。
SSTables是保存在硬盘上的数据文件。当memtables回写到SSTables的时候,cassandra会将多个SSTable文件归并为一个SSTable,并且删除原来的SSTable文件。
每一个SSTable都压缩多个组件到一个文件上:
Apache-cassandra官网
Apache Cassandra架构理解
以上观点纯属个人看法,如有不同,欢迎指正。
email:babymm@aliyun.com
github:https://github.com/babymm