Cassandra

Cassandra知识梳理

Cassandra 简介

Apache Cassandra是一个开源,分布式和分散/分布式存储系统(数据库),用于管理分布在世界各地的大量结构化数据。它提供高可用性服务,没有单点故障。

  • 它具有可伸缩性,容错性和一致性。
  • 它是一个面向列的数据库。
  • 其分发设计基于亚马逊的Dynamo及其在Google的Bigtable上的数据模型。
  • 它创建于Facebook,与关系数据库管理系统截然不同。
  • Cassandra实现了Dynamo风格的复制模型,没有单点故障,但是添加了更强大的“column family”数据模型。
  • 一些大型公司(例如Facebook,Twitter,Cisco,Rackspace,ebay,Twitter,Netflix等)正在使用Cassandra。

Cassandra特点

以下是Cassandra的一些功能:

  • 弹性可扩展性– Cassandra具有高度可扩展性;它允许添加更多硬件,以根据需求容纳更多客户和更多数据。
  • 始终在线-Cassandra没有单点故障,并且可以连续用于无法承受故障的关键业务应用程序。
  • 快速的线性规模性能-Cassandra具有线性可扩展性,即,随着集群中节点数量的增加,它可以提高吞吐量。因此,它保持了快速的响应时间。
  • 灵活的数据存储-Cassandra可容纳所有可能的数据格式,包括:结构化,半结构化和非结构化。它可以根据需要动态适应对数据结构的更改。
  • 轻松进行数据分发-Cassandra通过在多个数据中心之间复制数据,提供了在所需位置分发数据的灵活性。
  • 事务支持-Cassandra支持原子性,一致性,隔离性和持久性(ACID)等属性。
  • 快速写入-Cassandra旨在在廉价的商品硬件上运行。它执行快速的写入,并且可以存储数百TB的数据,而不会牺牲读取效率

Cassandra应用场景

  • 社交媒体:用户状态更新频繁场景;点赞、评论、转发
  • 物联网:设备状态更新;行程轨迹;视频监控;

  • 互联网/电商/娱乐/教育:用户元数据;商品品类信息;商品详情;浏览记录;监控日志;

  • 金融风控:用户画像;标签;圈人;事件流;

Cassandra架构

集群架构

Cassandra集群由成节点(Node)、机架(Rack)和数据中心(Data Center)组成。

 

  • 节点(Node)
    指运行Cassandra实例的服务器。节点可以是物理主机、云上的机器实例,或者是Docker容器。
  • 机架(Rack)
    指一组相互靠近的Cassandra节点。机架可以是包含连接到公共网络交换机节点的物理机架。在云端,机架通常指在同一可用区域中运行机器实例集合。
  • 数据中心(Data Center)
    指逻辑机架的集合,通常位于同一栋建筑中,通过可靠的网络连接。在云端,数据中心通常映射到云区域。如阿里云上的华北1区,华南2区。

一致性Hash

实现数据的分区分布和扩容缩容的数据迁移

Gossip内部通信协议

Cassandra使用Gossip的协议维护集群的状态, 在对等节点的网络传播下保持集群状态一致性,这是个端对端的通信协议。通过Gossip,每个节点都能知道集群中包含哪些节点,以及这些节点的状态,

反熵机制

利用anti-entropy(反熵)机制实现数据读取过程中节点之间的比对,保证数据一致性

可调一致性

hinted handoff机制:按照最终一致性的模式,可以极大提升集群可用性

Cassandra数据存储

Cassandra的数据包括在内存中的和磁盘中的数据

这些数据主要分为三种: CommitLog:主要记录客户端提交过来的数据以及操作。这种数据被持久化到磁盘中,方便数据没有被持久化到磁盘时可以用来恢复。 Memtable:用户写的数据在内存中的形式,它的对象结构在后面详细介绍。其实还有另外一种形式是BinaryMemtable 这个格式目前 Cassandra 并没有使用,这里不再介绍了。 SSTable:数据被持久化到磁盘,这又分为 Data、Index 和 Filter 三种数据格式。

 CommitLog 数据格式

Cassandra在写数据之前,需要先记录日志,保证Cassandra在任何情况下宕机都不会丢失数据,这就是CommitLog日志。要写入的数据按照一定格式组成 byte 组数,写到 IO 缓冲区中定时的被刷到磁盘中持久化。Commitlog是server级别的。每个Commitlog文件的大小是固定的,称之为一个CommitlogSegment。

当一个Commitlog文件写满以后,会新建一个的文件。当旧的Commitlog文件不再需要时,会自动清除。

Memtable 内存中数据结构

数据写入的第二个阶段,MemTable是一种内存结构,当数据量达到块大小时,将批量flush到磁盘上,存储为SSTable。优势在于将随机IO写变成顺序IO写,降低大量的写操作对于存储系统的压力。每一个columnfamily对应一个memtable。也就是每一张表对应一个。用户写的数据在内存中的形式,

SSTable 数据格式

SSTable是Read Only的,且一般情况下,一个ColumnFamily会对应多个SSTable,当用户检索数据时,Cassandra使用了Bloom Filter,即通过多个hash函数将key映射到一个位图中,来快速判断这个key属于哪个SSTable。

为了减少大量SSTable带来的开销,Cassandra会定期进行compaction,简单的说,compaction就是将同一个ColumnFamily的多个SSTable合并成一个SSTable。

在Cassandra中,compaction主要完成的任务是:

1) 垃圾回收: cassandra并不直接删除数据,因此磁盘空间会消耗得越来越多,compaction 会把标记未删除的数据真正删除;

2) 合并SSTable:compaction 将多个 SSTable 合并为一个(合并的文件包括索引文件,数据文件,bloom filter文件),以提高读操作的效率;

3) 生成 MerkleTree:在合并的过程中会生成关于这个ColumnFamily中数据的 MerkleTree,用于与其他存储节点对比以及修复数据。

每个SSTables是由多个组件存储在单个文件中:

  •  Data.db:实际的数据。
  •  Index.db:来自分区key的索引,定位到data.db文件,因此在大的分区中,也会包含分区行的索引。
  •  Summary.db:摘要,分区键的内容。
  •  Filter.db:Bloom过滤器在SSTable的分区key。
  •  CompressionInfo.db:关于偏移量和在data.db文件压缩的块长度的元数据。
  •  Statistics.db:存储SSTable的元数据,包括时间戳、tombstones、集群键、压缩率、修复等还有更多的信息。
  •  Digest.crc32: CRC-32算法的data.db文件。
  •  TOC.txt:SSTable组件文件的简单的列表。

 

LSM-Tree(Log-Structured-Merge-Tree) 日志结构合并树

 

Cassandra操作

 

CREATE KEYSPACE IF NOT EXISTS test  WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : '0' };
 
DESCRIBE keyspaces;
DESCRIBE KEYSPACE test;
 
USE tutorial;
 
CREATE TABLE IF NOT EXISTS tutorial
(
    id          timeuuid PRIMARY KEY,
    title       text,
    description text,
    published   boolean
);
 
DESCRIBE table tutorial;
 
insert into test.tutorial (id,title,description,published) values (now(),'title1','description1',true);

 

Cassandra备份与恢复

 复制策略

Cassandra使用复制策略来存储和维护数据的多个副本。每个分区都有一个主分区副本和多个备份分区副本,可以根据需要进行配置。数据复制可以保证数据的高可用性和灾难恢复。

  数据备份

Cassandra提供了多种数据备份方法,包括手动备份和自动备份。手动备份可以通过CQL命令或命令行工具进行,自动备份可以通过设置定期备份的时间间隔和备份文件路径来实现。

  数据恢复

Cassandra提供了多种数据恢复方法,包括手动恢复和自动恢复。手动恢复可以通过CQL命令或命令行工具进行,自动恢复可以通过设置自动恢复选项来实现。

  增量备份

Cassandra支持增量备份,只备份发生变化的部分,可以提高备份效率和减少备份文件大小。

Cassandra与HBase

对比项

Cassandra

HBase

一致性

可调一致性(AP):在读取过程中完成最终一致性

强一致性(CP):数据写入时强一致性

可用性

1,基于Consistent Hash相邻节点复制数据,数据存在于多个节点,无单点故障。

2,某节点宕机,hash到该节点的新数据自动路由到下一节点做 hinted handoff,源节点恢复后,推送回源节点。

3,通过Gossip协议维护集群所有节点的健康状态,并发送同步请求,维护数据一致性。

4,SSTable,纯文件,单机可靠性一般。

1,存在单点故障,Region Server宕机后,短时间内该server维护的region无法访问,等待failover生效。

2,通过Master维护各Region Server健康状况和Region分布。

3,多个Master,Master宕机有zookeeper的paxos投票机制选取下一任Master。Master就算全宕机,也不影响Region读写。Master仅充当一个自动运维角色。

4,HDFS为分布式存储引擎,一备三,高可靠,0数据丢失。

5,HDFS的namenode是一个SPOF。

伸缩性

1,Consistent Hash,快速定位数据所在节点。

2,扩容需在Hash Ring上多个节点间调整数据分布。

1,通过Zookeeper定位目标Region Server,最后定位Region。

2,Region Server扩容,通过将自身发布到Master,Master均匀 分布。

读写性能

数据读写定位非常快。

数据读写定位可能要通过最多6次的网络RPC,性能较低。

可维护性

架构无中心化,维护成本低。

新增keyspace需要重启整个集群。

组件过多,架构复杂,维护成本较高。

但是删除表非常方便。

二级索引

支持

不支持

锁与事务

Client Timestap(Dynamo使用vector lock)

Optimistic Concurrency Control

map/reduce

支持不是很好

1,通过Zookeeper定位目标Region Server,最后定位Region。

2,Region Server扩容,通过将自身发布到Master,Master均匀 分布。

存储

LSM-Tree、本地磁盘

LSM-TreeHDFS

分布式架构

去中心化,节点无差异,支持集群没有HBase

中心化,分HMasterHReginServer节点,支持超大集群

SQL支持

良好,CQL语法较为全面,但不支持join

比较差

使用场景

OLTP--联机事务处理

OLAP--联机分析处理

小结

1,弱一致性,数据可能丢失。AP

2,可用性高。

3,扩容方便。

4,如果不需要map/reduce的话,维护相当简单

1,强一致性,0数据丢失。CP

2,可用性低。

3,扩容方便。

4,组件过多,架构复杂,维护成本较高。

 

Cassandra小结

  • 运维容易,机器成本低,适合小规模集群应用,可用快速支撑海量数据查询业务

  • 高可用,高TPS随机读取,支持海量数据,支持CQL、支持二级索引,适合部分场景代替MySQL

  • 不适合一致性要求很高应用场景
posted @ 2024-02-20 17:19  April.Chen  阅读(68)  评论(0编辑  收藏  举报