Cassandra_架构

来源:互联网 发布:微软软件开发工具 编辑:程序博客网 时间:2024/06/01 13:11
  1. System keyspace

    用于存储关于集群的原数据,以帮助各种操作的顺利进行。不仅存储了本地节点的元数据,也存储了提示切换信息,这些元数据包括:
    节点令牌;
    集群名;
    用于支持动态装载的keyspace和schema的定义;
    迁移数据;
    节点是否自举成功。
    schema的定义存储于两个列族之中:Schema列族保存用户的keyspace和schema的定义;Migrations列族则用于记录对keyspace的变更。
    System keyspace是无法手工修改的。

  2. 对等结构(P2P)

    主从结构:主节点具有对数据的控制权,从节点与主节点进行数据同步。任何变更都会写入主节点,并从主节点传送给从节点。这个模型是对读数据优化的,允许客户端从任意节点读取数据。但是,这个模型中数据复制是从主到从单向的,这带来一个严重的后果,所有些操作都必须送到主节点;也就是说,存在一个潜在的单点故障。在主从结构中,主节点掉线的后果很严重。
    对等结构:所有节点的地位彼此相同,没有主从差别。更加易于通过增加节点来扩展系统。

  3. gossip与故障监测

    为了做到无中心、容忍网络分裂,Cassandra使用了一个gossip(留言)协议来进行环内通信,这样每个节点都会有其他节点的状态信息。gossip协议(流言协议,也叫“传染协议”),通常假设网络是不可靠的,常见于大规模、无中心的网络系统,经常作为分布式数据库中的一种自动数据副本复制机制。gossip是一种节点可以按照自己的期望,自行选择与之交换信息的节点的通信方式
    gossip会用于故障监测,所以Gossiper类会维护一个节点列表,存储节点的死活信息

  4. 逆熵与读修复

    逆熵是Cassandra的副本同步机制,用于保障不同节点上的数据都更新到最新的版本
    在每次更新之后,逆熵算法都被引入。这会对数据进行校验和,并与其他节点比较校验和,如果校验和不同,就进行数据交换。如果一个读操作发现了同一时间戳的不同值,Cassandra会直接使用一个决胜机制来进行值的比较,以确保读修复不会进入死循环。

  5. memtable、SSTable、commit log

    进行写操作的时候,数据是直接写入到commit log中的。commit log是Cassandra为了达到持久性而引入的一种错误恢复机制。写操作只有写入到commit log才被认为是成功的。这样即使数据还没有进入内存存储结构中(memtable),也可以进行数据恢复
    数据写入commit log后,会写入到memtable内存数据结构中。当memtable之中存储的对象数量达到阈值以后,memtable会被刷入磁盘,放在一个称为SSTable的文件中。然后创建一个新的memtable接收数据。
    所有的写操作都是顺序进行的,写一个值不需要任何读或者定位操作,因为所有的写都是以追加的方式写入的,这正是Cassandra的写操作性能出众的原因。压紧操作定期地重新组织数据,通过拆分,写操作是直接的追加写,之后的压紧可以组织数据,从而获得更好的读性能。对于读操作,会首先检查memtable来查找值

  6. 提示移交

    提示移交允许Cassandra对于写操作永远可用,降低离线节点恢复服务之后的不一致的时间

  7. 压紧

    压紧操作用于合并SSTable,在压紧操作过程中,SSTable中的数据会被合并:键值进行合并,列被组织合在一起,丢弃墓碑,创建新的索引。压紧操作是通过合并大的累积文件而释放空间的过程。这个操作是完全透明的,并且在整个服务器的声明周期中持续进行。
    在压紧操作中,合并后的数据是有序的,对这些有序的数据会创建一个新的索引文件,同时上述这些刚刚合并的、有序的、有索引的数据会被写入一个单独的新的SSTable之中(每个SSTable包含三个文件:数据、索引、过滤程序)。
    压紧的另一个重要功能是通过降低定位的次数来提高性能。
    Cassandra中有多种不同的压紧操作。主压紧的触发原因有两种:通过节点探测触发或是自动进行。节点探测会给被探测节点的相邻节点发送一个TreeRequest消息,当一个节点收到TreeRequest时,会立刻进行一次只读压紧,来验证列族。
    可以通过降低压紧线程的优先级来提高整体性能,使用如下参数设置:
    -Dcassandra.compaction.priority = 1
    这会影响CPU的使用率,而非IO的。

  8. Bloom filter

    Bloom filter是一种提升性能的手段,是一种用于判断一个元素是否是一个集合的成员的超快速、但不确定的算法。Bloom filter将数据集里的值映射为一个位数组,并将一个大数据集凝练为一个摘要字符串。Bloom filter位于内存中,这样可以减少查找键值时的磁盘访问,从而改善性能。

  9. 墓碑

    当执行一个删除操作时,数据并不会被立刻删除。会被视为一个更新操作,在相应的值上放一个墓碑。墓碑是一个删除标记,当执行压紧时,比墓碑更老的内容会被清理掉。有一个相关设置,称为Garbage Collection Grace Seconds(垃圾回收时延),这个时间是服务器对一个墓碑进行垃圾回收之前的等待时间,Cassandra会一直跟踪墓碑的年龄,一旦某个墓碑的寿命比GCGraceSeconds更长了,就会回收它。这个时延的设计目的是留下足够长的时间,以便于恢复数据。

  10. 分阶段事件驱动架构(SEDA)

    在一个典型的应用中,一个单独的任务单位经常会在一个线程内来完成。Cassandra却有所不同:它的并发模型是基于SEDA的,一个工作可以从一个线程开始,之后再移交给另一个线程。一个操作被细分为不同的阶段,与阶段关联的线程池来决定执行的任务。因为每个阶段由不同的线程池处理,Cassandra可以因此获得显著地性能收益。
    Cassandra中,作为阶段的操作有:
    ·读
    ·Mutation
    ·Gossip
    ·响应
    ·逆熵
    ·负载均衡
    ·迁移
    ·流

原创粉丝点击