- 架构简介
Cassandra是设计用于跨多节点方式处理大数据,它没有单点故障;这种架构设计之初就考虑到了系统和硬件故障。Cassandra地址发生失效问题,通过采用跨节点的分布式系统,将数据分布在集群中的所有节点上解决。每个节点使用P2P的gossip协议来改变集群中的自己和其他节点的状态信息。写操作按顺序记录在每个节点的commit log上,以确保数据持久化。数据写入到一个in-memory结构,叫做memtable,类似于一个write-back缓存。每当memtable满了时,数据就写入到硬盘SSTable数据文件中。所有的写都自动分区和复制。Cassandra定期的使用compaction压缩SSTable。丢弃标记为tombstone的过期数据。为了保证集群数据的一致性,可以采用不同的repair机制。
Cassandra是一个分区行存储数据库,行被保存在tables且必须有一个primary key。Cassandra的架构允许任何授权用户连接到任意数据中心的任意节点,使用CQL语言访问数据。为了使用简单,CQL使用类SQL语法。开发人员通过使用cqlsh,DevCenter和应用驱动来访问CQL。典型的,一个集群有一个keyspace对于每个应用,包含了很多不同的tables,类似于schema。
客户端的读和写可以被发送到集群中的任意节点。当一个客户端连接到一个节点,那个节点服务器作为特殊的客户端操作的coordinator。Coordinator作为客户端应用和节点之间的代理。Coordinator基于集群的配置,决定了请求被发送到哪个节点上。
2.关键结构
- Node
存储数据的地方,是Cassandra的基础组件。
- Data center
相关节点的集合。Data center可以是物理的datacenter或者是虚拟的data center。不同的workloads应该使用不同的data center。使用不同的data center可以预防Cassandra事物不被其他的workloads影响,保证请求发送到低延迟的data center。依赖于复制因子,数据可以被写入到多个data center。Data centers不能跨物理位置。
- Cluter
一个集群包含一个或多个data centers。它可以跨物理位置。
- Commit log
所有的数据第一次都被写入到commit log作持久化。之后数据被flush到SSTables。
- SStable
A sorted stringtable(SSTable)是一个不可变的数据文件,Cassandra将memtables定期的写入其中。
3.Cassandra关键组件和配置
- Gossip
Gossip是一中P2P的通讯协议,Cassandra用它来发现并分享节点间的地址和状态信息。Gossip的信息也被持久化到本地节点,当有节点启动的时候,这些信息就被立即使用。
- Partitioner
Partitioner决定了集群节点的数据分布。基本上,partitioner是一个hash函数,计算partition key的token值。每行数据通过partition key进行唯一识别的,通过token值分布在集群。Murmur3Partitioner是新的Cassandra集群的缺省的分区策略,大部分案例都使用这个选项。
你必须设定partitioner,给每个节点分配一个num_tokens值。分配tokens的数据取决于系统的hardwarecapabilities。如果没有使用虚节点(vnodes),使用initial_token设置。
- Replication factor(复制因子)
集群中副本的总数量。Replication factor为1则每行有1个副本。Replication factor为2则每行有2个副本,每个副本都在不同的节点上。所有的副本都是同等重要的,没有主副本之说。通常情况下应该设置replication factor大于1,但不超过集群节点数量。
- Replica placement strategy(副本存储策略)
Cassandra存储数据副本在多个节点上,确保了可靠性和容错性。replication strategy决定了哪个节点存放副本。对于大部分部署,建议使用NetworkTopologyStrategy,因为它很容易扩展到多个datacenters。
当你创建keyspace时,你必须指定replica placement strategy和Replication factor。
- Snitch
Snitch决定了节点属于哪个数据中心和机架。Snitch通知Cassandra网络拓扑以便请求被有效的路由,并且允许Cassandra在服务器增加到数据中心或机架的时候能够分发副本。
创建集群是必须指定snitch。所有的 snitches使用动态snitchlayer,监控性能和选择最佳的副本读取。它是缺省配置并且建议使用它在大部分部署中。在cassandra.yaml配置文件中配置动态snitch阀值。
缺省的SimpleSnitch无法识别数据中心或机架信息。即使用它作为但data center部署。GossipingPropertyFileSnitch建议在生产环境中使用。它定义了节点的data center,使用gossip传播信息到其他节点。
- cassandra.yaml配置文件
这个是配置集群初始化属性、表的缓存参数、调优和资源利用率属性、超时设置、客户端连接、备份和安全的主要配置文件。
默认情况下,节点用于存储数据的位置配置在cassandra.yaml里面。
在生产环境下,可以把commitlog-directory和data_file_directories放到不同的磁盘驱动器。
- System keyspace table properties
你可以设置存储配置属性在每一个keyspace或每一个table,基于编程方式或使用客户端应用,比如CQL。