Architecture in brief for Cassandra 2.0

翻译自由的柠檬
原文链接http://www.datastax.com/documentation/cassandra/2.0/cassandra/architecture/architectureIntro_c.html
版本:0.1(2014-12-19 00:09)

Cassandra 2.0架构简介(译文)

Cassandra设计的目的是为了处理多节点上的大数据工作负载,同时不产生单点故障。它的架构基于一个重要的认识,那就是系统和硬件的故障会发生而且确实会发生。Cassandra通过使用异构节点的对等分布式系统来解决这个问题,其中数据分布在集群的所有节点之上。在集群里,每个节点每一秒钟都会交换信息。每个节点上顺序写入的提交日志记录下写操作以保证数据持久性。然后,数据会被索引并写入到一个叫做内存表(memtable)的内存结构,内存表很像一个回写缓存。一旦这个内存结构填满,数据就会以一种SSTable形式的数据文件写到磁盘上。所有的写操作在集群里都是自动分区和复制的。Cassandra使用一种叫做压缩(compaction)的过程定期整理SSTable,丢弃不用的数据和tombstones(数据已被删除的标志)。

Cassandra是面向行的数据库。Cassandra的架构允许任意授权用户通过CQL语言连接到任何数据中心的任一节点。为了使用方便,CQL使用了和SQL相似的语法。从CQL的角度看,数据库是由表组成的。通常,集群为每个应用分配了一个键空间(keyspace)。开发者可以通过cqlsh或应用程序语言驱动访问CQL。

客户端的读写请求可以发送到集群中的任何一个节点。当客户端发起一个请求连接到一个节点,那么这个节点就会作为这个客户端操作的协调者。协调者作为客户端应用和持有请求数据的节点之间的代理。协调者基于集群的配置情况来决定环上的哪个节点应该接收请求。更多细节参见客户端请求

关键结构

  • 节点
    存储数据的地方。节点是Cassandra的基础组件。

  • 数据中心
    相关节点的集合。一个数据中心既可以是物理的,也可以是虚拟的。不同的工作负载应该使用独立的数据中心,或是物理的或是虚拟的。复制是由数据中心设置的。使用独立的数据中心可以防止Cassandra的事务被其他的工作负载影响,并且可以使请求尽量相互靠近,从而达到更低的延迟。根据复制因子的设定,数据可以被写到多个数据中心。然而,数据中心永远也不应该在物理上跨越多个地点。

  • 集群
    一个集群包含一个或多个数据中心。集群可以跨越物理上的多个地点。

  • 提交日志
    为了达到持久性,所有的数据都会先写到提交日志。在所有的数据都转存到SSTable之后,日志数据就可以归档、删除或者回收。


  • 有序的列集合,通过行的形式获取数据。一个行包含多个列并有一个主键。键的第一部分是列名。

  • SSTable
    排序的字符串表(SSTable)是一个不可变的数据文件,Cassandra把内存表定期地写到这个文件中。SSTable是只能追加的,并且顺序地存储在磁盘上,SSTable中维持着所有Cassandra表。

配置Cassandra的关键组件

  • Gossip
    一种对等通信协议,用来在一个Cassandra集群中发现并共享其他节点位置和状态信息。为了在重启之后能立即使用,每个节点也会在本地持久化Gossip信息。

  • 分区程序
    分区程序决定如何把数据分布到集群中的多个节点,以及把数据的第一份拷贝放到哪个节点上。分区程序基本上就是计算分区键标记(token)的一个哈希函数。每一行都通过一个分区键唯一标识,并通过标记的值分发到整个集群。Murmur3Partitioner是新Cassandra集群的默认分区策略,并且对于大多数情况来说都是正确的选择。

    你必须为每个节点设置一个分区程序并且分配一个num_tokens的值。你设置的标记的数量取决于系统的硬件容量。如果没有使用虚拟节点(vnodes),那么可以使用initial_token的设置。

  • 复制因子
    集群内部复制节点的总数。复制因子为1意味着一个节点上的每一行只有一个拷贝。复制因子为2的意思是每行都有两个拷贝,而每个拷贝存在不同的节点上。所有的复制品都一样重要;没有首要的或主要的复制品。你可以为每个数据中心定义复制因子。通常情况下你应该设置大于1的复制策略,但是不能大于集群中节点的数量。

  • 复制品存放策略
    Cassandra在多个节点上存储数据的拷贝(复制品),以确保可靠性和容错性。复制策略决定把复制品存放在哪些节点上。数据的第一个复制品就是第一个拷贝;无论从哪个意义上说,它都不是唯一的。对于大多数部署来说,强烈推荐使用NetworkTopologyStrategy,因为如果将来需要扩展到多个数据中心的话就容易多了。

    当创建一个键空间时,你必须要定义复制品存放策略和你想要的复制品数量。

  • 告密者(snitch)
    告密者定义了复制策略用来在数据中心或机架(拓扑)存放复制品的一组机器。

    在创建集群时,你必须要配置一个告密者。所有的告密者都使用一个动态告密者层,它们会进行监控并选择对读操作性能最好的复制品。在缺省情况下,这个告密者是激活的,并且在大多数情况下推荐使用。在cassandra.yaml中可以为每个节点配置动态告密者的阈值。

    缺省的SimpleSnitch并不知道数据中心或机架信息。它可以用在单数据中心部署或公有云中的单区域(single-zone)部署。推荐在生产环境下使用GossipingPropertyFileSnitch。它定义了一个节点的数据中心和机架并使用gossip向其他节点传播信息。

  • cassandra.yaml配置文件
    设置集群初始化属性、表的缓存参数、调优和资源使用的属性、超时设置、客户端连接、备份和安全的主要配置文件。

    缺省情况下,可以在cassandra.yaml文件中配置一个节点管理的数据所存放的目录。

    • 安装包安装:/var/lib/cassandra
    • Tarball安装:install_location/data/data

    在一个生产环境的集群部署中,你可以把commitlog-directory改到和data_file_directories不同的磁盘驱动器上。

  • 系统键空间表属性
    你可以通过写程序来配置基于键空间或基于表的存储配置属性,或者使用一个客户端程序来做,例如CQL。