2. 搭建多节点Cassandra,创建多副本因子keyspace,并体验不同一致性等级,记录local_one一致性读写以及强一致性读写结果这作业怎么做,给出详细的步骤
时间: 2025-09-02 11:24:08 AIGC 浏览: 15
### ✅ 作业目标
本实验的目标是:
1. 搭建多节点的 **Apache Cassandra** 集群。
2. 创建一个具有多个副本因子(replication factor)的 keyspace。
3. 使用不同的一致性等级进行读写操作,观察并记录结果。
4. 特别关注 `LOCAL_ONE` 和强一致性等级(如 `QUORUM`、`ALL`)之间的区别。
---
### ✅ 实验环境准备
#### 硬件要求(可模拟)
- 至少 **3 台虚拟机或 Docker 容器**
- 每台机器安装 **Ubuntu 20.04+ 或 CentOS 7+**
- 确保所有节点之间可以互相通信(开放端口:7000, 9042, 7199 等)
- 所有节点时间同步(推荐使用 NTP)
#### 软件要求
- **Java 8+**
- **Cassandra 4.x**(最新稳定版)
- **cqlsh**(Cassandra 命令行工具)
---
### ✅ 第一步:搭建多节点 Cassandra 集群
#### 1. 安装 Java
```bash
sudo apt update
sudo apt install openjdk-8-jdk -y
```
#### 2. 下载并安装 Cassandra
```bash
wget https://downloads.apache.org/cassandra/4.1.2/apache-cassandra-4.1.2-bin.tar.gz
tar -xzf apache-cassandra-4.1.2-bin.tar.gz
cd apache-cassandra-4.1.2
```
#### 3. 修改配置文件(每个节点)
在每台机器上编辑 `conf/cassandra.yaml` 文件:
```yaml
cluster_name: 'MyCassandraCluster'
num_tokens: 256
initial_token: ''
listen_address: <本机IP>
rpc_address: <本机IP>
seeds: "<Seed节点IP>,<其他节点IP>"
endpoint_snitch: GossipingPropertyFileSnitch
data_file_directories:
- /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches
hints_directory: /var/lib/cassandra/hints
```
> 注意:`seeds` 列表中第一个节点为种子节点,其他节点可以作为普通节点加入。
#### 4. 启动 Cassandra 服务
```bash
./bin/cassandra -f
```
> `-f` 表示前台运行,便于调试。
#### 5. 检查集群状态
连接任意节点执行:
```bash
./bin/nodetool status
```
输出应显示所有节点在线,并且状态为 `UN`(Up Normal)。
---
### ✅ 第二步:创建 Keyspace 并设置副本因子
#### 1. 连接到 CQL Shell
```bash
./bin/cqlsh <任一节点IP>
```
#### 2. 创建 Keyspace
```sql
CREATE KEYSPACE my_keyspace WITH replication = {
'class': 'NetworkTopologyStrategy',
'datacenter1': 3
} AND durable_writes = true;
```
- `NetworkTopologyStrategy` 是推荐策略,适用于多数据中心部署。
- `datacenter1` 是当前数据中心名称(默认),`3` 是副本因子(假设你有 3 个节点在同一数据中心)。
#### 3. 使用 Keyspace
```sql
USE my_keyspace;
```
---
### ✅ 第三步:创建表并插入数据
#### 1. 创建测试表
```sql
CREATE TABLE test_table (
id UUID PRIMARY KEY,
name TEXT,
age INT
);
```
#### 2. 插入数据
```sql
INSERT INTO test_table (id, name, age) VALUES (uuid(), 'Alice', 30);
```
---
### ✅ 第四步:使用不同一致性等级进行读写
#### 1. 设置 Consistency Level
Cassandra 支持以下常见一致性等级:
| Consistency Level | 说明 |
|------------------|------|
| `ONE` | 写操作只要一个副本确认成功;读操作从最近的副本获取数据。 |
| `QUORUM` | 强一致性等级,写操作需要大多数副本确认成功。 |
| `ALL` | 所有副本都必须确认成功,最严格但性能最差。 |
| `LOCAL_ONE` | 本地数据中心的一个副本确认成功,适合高吞吐场景。 |
#### 2. 测试 LOCAL_ONE 一致性等级
##### 写操作
```sql
CONSISTENCY LOCAL_ONE;
INSERT INTO test_table (id, name, age) VALUES (uuid(), 'Bob', 25);
```
##### 读操作
```sql
CONSISTENCY LOCAL_ONE;
SELECT * FROM test_table WHERE id = <bob_id>;
```
> 记录读取结果是否立即可见,以及响应时间。
#### 3. 测试 QUORUM 一致性等级
##### 写操作
```sql
CONSISTENCY QUORUM;
INSERT INTO test_table (id, name, age) VALUES (uuid(), 'Charlie', 40);
```
##### 读操作
```sql
CONSISTENCY QUORUM;
SELECT * FROM test_table WHERE id = <charlie_id>;
```
> 记录读取结果是否一致,以及延迟情况。
#### 4. 测试 ALL 一致性等级
##### 写操作
```sql
CONSISTENCY ALL;
INSERT INTO test_table (id, name, age) VALUES (uuid(), 'David', 35);
```
##### 读操作
```sql
CONSISTENCY ALL;
SELECT * FROM test_table WHERE id = <david_id>;
```
> 如果某节点宕机,此操作会失败。
---
### ✅ 第五步:对比结果并总结
#### 1. 对比 LOCAL_ONE 与强一致性等级
| 项目 | LOCAL_ONE | QUORUM/ALL |
|------------------|-------------------------------|-----------------------------|
| 数据一致性 | 最弱,可能读到旧数据 | 强一致性,读写可靠 |
| 写性能 | 最高 | 中等 |
| 适用场景 | 高吞吐、允许短暂不一致 | 关键业务、数据一致性要求高 |
| 故障容忍能力 | 高 | 低(ALL 更低) |
#### 2. 总结表格
| 操作类型 | Consistency Level | 是否成功 | 响应时间 | 数据一致性 |
|----------|--------------------|-----------|------------|--------------|
| 写 | LOCAL_ONE | ✅ | 快 | 弱 |
| 读 | LOCAL_ONE | ✅ | 快 | 弱 |
| 写 | QUORUM | ✅ | 中等 | 强 |
| 读 | QUORUM | ✅ | 中等 | 强 |
| 写 | ALL | ❌(若节点宕机)| 慢 | 极强 |
| 读 | ALL | ❌(若节点宕机)| 慢 | 极强 |
---
### ✅ 第六步:扩展任务(可选)
1. **关闭一个节点后测试读写行为**,观察 LOCAL_ONE 和 QUORUM 的表现差异。
2. **修改副本因子为 2**,再测试 QUORUM 是否仍然能成功。
3. **使用 ccm 工具**(Cassandra Cluster Manager)快速搭建多节点集群,简化操作。
---
### ✅ 附录:常用命令
- 查看节点状态:
```bash
./bin/nodetool status
```
- 查看表结构:
```sql
DESCRIBE TABLE test_table;
```
- 查看 Keyspace 信息:
```sql
DESCRIBE KEYSPACE my_keyspace;
```
---
阅读全文
相关推荐


















