Cassandra 是一个开源的、分布式、去中心化的数据库系统,具有高度可扩展性和高可用性,旨在处理分布在多台服务器上的大量结构化数据,且没有单点故障。在发展过程中,cassandra 不断完善和优化其功能,逐渐成为流行的 NoSQL 宽表数据库之一,被广泛应用于大规模数据存储、高并发读写等场景。它从 Google 的 Bigtable 中吸取了 LSM 单机引擎的精华,又学习了 Amazon Dynamo 做分布式、管理集群和灾难容错等方面的经验。得益于 Facebook 将其开源的决策以及社区的持续优化,cassandra 在 NoSQL 宽表领域占据了重要地位。
一、基本特点
弹性可扩展性:可以轻松添加更多硬件来容纳更多客户和数据。
- 始终在线:不存在单点故障,能连续用于关键业务应用程序。
- 快速的线性规模性能:具有线性可扩展性,随着集群中节点数量增加可提高吞吐量,保持快速响应时间。
- 灵活的数据存储:能够容纳所有可能的数据格式,包括结构化、半结构化和非结构化,还可根据需求动态适应数据结构的更改。
- 便捷的数据分发:通过在多个数据中心复制数据,能灵活地在所需位置分发数据。
- 事务支持:支持原子性、一致性、隔离性和持久性(ACID)等属性。
- 快速写入:设计用于在廉价的商用硬件上运行,执行快速写入操作,可存储数百 TB 数据而不牺牲读取效率。
Cassandra 的数据模型与传统关系型数据库有较大不同。它的数据分布在多台计算机上,最外层的容器称为 cluster(集群),Cassandra 以环形格式将节点排列在集群中,并为其分配数据。Keyspace(键空间)是数据的最外层容器,其基本属性包括复制因子(集群中将接收相同数据副本的计算机数)和副本放置策略等,一个键空间可以包含一个或多个 column family(列族),而列族又是行集合的容器,每行包含有序的列。
Cassandra 的分布式设计基于亚马逊的 Dynamo 及其在谷歌的 Bigtable 上的数据模型,实现了 Dynamo 风格的复制模型,并添加了更强大的“column family”数据模型。一些大型公司如 Facebook、Twitter、Cisco、Rackspace、eBay、Netflix 等都在使用 Cassandra。
在数据复制方面,Cassandra 集群中的一个或多个节点会充当给定数据段的副本。如果检测到某些节点响应的值过时,Cassandra 会将最新值返回给客户端,并在后台执行读取修复以更新过时的值。
Cassandra 使用 gossip 协议让节点彼此通信并检测集群中的故障节点。其组件包括存储数据的 node(节点)、相关节点的集合 data center(数据中心)、包含一个或多个数据中心的 cluster、用于崩溃恢复机制的 commit log(提交日志)、驻留内存的数据结构 mem-table(内存表)、磁盘文件 sstable 以及用于测试元素是否为集合成员的 bloom filter(布隆过滤器)等。
用户可以使用 Cassandra 查询语言(CQL)通过节点访问 Cassandra,CQL 将数据库 keyspace 视为表,程序员使用 cqlsh 进行查询。客户端接近任何节点进行读写操作,该节点(协调器)在客户端和保存数据的节点之间扮演代理角色。
写操作时,每个写入活动会先写入 commit log,然后数据被捕获并存储在 mem-table 中,当 mem-table 已满时,数据将被写入 sstable 数据文件,所有写入会自动分区并在整个集群中复制,Cassandra 还会定期合并 sstable 并丢弃不必要的数据。读操作时,Cassandra 从 mem-table 中获取值,并检查 bloom 过滤器以找到保存所需数据的适当 sstable。
二、与关系型数据库的区别
Cassandra 与传统关系型数据库有以下几个显著的区别:
数据模型:
- 关系型数据库通常基于严格的表结构,每行具有固定的列,并且数据需要符合预定义的模式。
- Cassandra 是一个灵活的、无模式的数据库,数据可以在不同的行中具有不同的列结构,适应动态变化的数据结构需求。
扩展性: - 关系型数据库在水平扩展方面往往较为复杂,可能需要进行复杂的分库分表操作。
- Cassandra 专为大规模的水平扩展而设计,可以轻松地添加新节点来扩展存储和处理能力。
一致性模型: - 关系型数据库通常支持强一致性,确保在任何时刻读取的数据都是最新的、准确的。
- Cassandra 支持可调的一致性级别,包括强一致性和最终一致性,可以根据应用的需求在性能和一致性之间进行权衡。
查询语言: - 关系型数据库使用结构化查询语言(SQL)进行复杂的查询操作。
- Cassandra 使用类似于 SQL 的 CQL 语言,但查询功能相对较简单,更侧重于基于键的快速检索和范围查询。
存储方式: - 关系型数据库通常将数据存储在固定大小的页或块中,可能导致空间浪费。
- Cassandra 以更灵活的方式存储数据,能更有效地利用存储空间。
容错性: - 关系型数据库在处理节点故障时可能需要复杂的恢复过程。
- Cassandra 具有去中心化的架构,不存在单点故障,能自动处理节点故障并保持系统的可用性。
适用场景: - 关系型数据库适用于具有复杂关系、事务处理要求严格、数据一致性要求高的业务场景,如金融交易系统、企业资源规划(ERP)等。
- Cassandra 更适合处理大规模数据、高并发读写、对一致性要求不那么严格的场景,如物联网数据存储、实时分析等。
例如,在一个电商网站中,如果需要管理订单和库存等关键业务数据,关系型数据库可能更合适,因为数据的一致性和事务完整性至关重要。但如果是处理大量的用户行为日志数据,Cassandra 则能更好地应对高并发写入和大规模存储的需求。
三、应用场景
- 大规模物联网数据存储
- 例如,在一个智能城市项目中,需要收集和存储来自大量传感器(如交通流量传感器、环境监测传感器)的数据。Cassandra 能够处理每秒产生的海量数据,并确保数据的可靠存储和快速检索。
- 实时数据分析
- 像电商平台的实时流量分析,能够快速处理和分析大量的用户访问数据,帮助企业及时调整营销策略。
- 社交媒体应用
- 对于社交平台,需要存储和处理大量用户的动态、评论、点赞等数据,Cassandra 可以支持高并发的读写操作,保证用户体验的流畅性。
- 金融交易日志
- 虽然金融交易对数据一致性要求较高,但对于交易日志的存储和分析,Cassandra 可以快速记录大量的交易流水信息,以便后续的审计和分析。
- 在线游戏
- 存储玩家的游戏状态、得分、道具等数据,能够应对游戏中的高并发访问和频繁的数据更新。
- 内容分发网络(CDN)
- 管理缓存服务器的状态和内容分发信息,以提高内容的分发效率和用户的访问速度。
- 移动应用后端
- 例如打车应用,处理大量的车辆位置和用户请求数据,确保在高并发情况下的快速响应。
- 日志管理
- 企业的系统日志、服务器日志等大量日志数据的存储和查询,便于快速定位和排查问题。
总之,Cassandra 适用于需要处理大量数据、高可用性和可扩展性的场景,例如物联网、个性化推荐、消息系统等。但它也有一定的学习成本,需要开发者熟悉其数据模型和操作方式。
- 企业的系统日志、服务器日志等大量日志数据的存储和查询,便于快速定位和排查问题。