apache-cassandra

2024-12-21

java

生活的情况越艰难,我越感到自己更坚强,甚而也更聪明。——高尔基

Github: https://github.com/apache/cassandra/

官方文档: https://cassandra.apache.org/

最近开始接触Apache Cassandra,这是一款开源的分布式NoSQL数据库,特别适合处理大量结构化数据,具有高可用性和无单点故障的特点。听说它采用了Dynamo和Bigtable的架构设计,存储模型是基于列的,非常适合需要快速写入和查询的场景,比如时间序列数据、物联网应用等等。

先简单说说安装,直接从官网下载二进制文件,解压后进入bin目录,运行cassandra即可启动。第一次运行时需要初始化数据目录,默认情况下配置文件在conf目录下,建议先熟悉一下里面的参数,特别是cassandra.yaml,很多关键配置都在这里。如果是用Docker,也可以直接拉取官方镜像,运行一条简单的命令就可以启动一个容器,非常方便。

使用Docker运行也很简单,拉取官方镜像:

1
docker pull cassandra

启动一个Cassandra实例:

1
docker run --name cassandra-container -d cassandra

通过环境变量可以自定义配置,比如设置集群名称或种子节点:

1
docker run --name cassandra-container -d -e CASSANDRA_CLUSTER_NAME="MyCluster" cassandra

启动后可以通过容器的端口9042连接到Cassandra,使用cqlsh测试功能。对于多节点集群,可以启动多个容器并设置相同的集群名称和不同的种子节点。

启动后,连接Cassandra可以使用自带的CQL Shell工具,叫cqlsh,直接在终端输入cqlsh就可以连接到本地实例。试了一下创建一个Keyspace和表,感觉CQL的语法很像SQL,但是多了一些针对分布式特性的设计,比如需要定义分区键和集群键。用下面的命令创建了一个简单的表:

1
2
3
CREATE KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
USE test;
CREATE TABLE users (id UUID PRIMARY KEY, name text, age int);

插入了一些数据,用INSERT INTO语句,然后用SELECT查询,响应速度很快,这也是它的特点之一。在分布式环境下,它会自动分片存储数据,通过一致性哈希算法实现负载均衡。Cassandra的写入路径也非常有意思,是基于Memtable和SSTable的设计,写入时是顺序操作,延迟非常低。

了解了一下它的多节点设置,需要先修改配置文件里的cluster_nameseeds参数,把节点之间的通信地址配置好,然后启动多个实例即可。默认是用Gossip协议来实现节点发现和状态同步。也看了一下nodetool工具,可以用它来查看集群状态、修复数据或者清理旧的SSTable。

Cassandra支持多种一致性级别,比如ONEQUORUMALL,可以根据业务需求调整读取和写入的一致性保障。这种灵活性让它在很多场景下都很适用,比如需要高写入性能的日志系统,也可以用来做强一致性要求的任务。

还研究了一下如何在Spring Boot项目中集成Cassandra。首先需要添加依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra</artifactId>
</dependency>

然后在application.properties文件中配置Cassandra的连接信息:

1
2
3
4
spring.data.cassandra.contact-points=127.0.0.1
spring.data.cassandra.port=9042
spring.data.cassandra.keyspace-name=test
spring.data.cassandra.schema-action=create-if-not-exists

定义一个实体类并用Cassandra的注解进行标注:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import org.springframework.data.annotation.Id;
import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;

@Table
public class User {

@PrimaryKey
private String id;
private String name;
private int age;

// Getters and setters
}

创建一个Repository接口来访问数据:

1
2
3
4
5
6
import org.springframework.data.cassandra.repository.CassandraRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends CassandraRepository<User, String> {
}

然后在Service或者Controller中使用这个Repository即可进行数据的CRUD操作。

目前还在学习阶段,但整体体验下来感觉Cassandra确实是一款非常强大的分布式数据库,特别适合那些需要可扩展性和高可用性的系统。