创建键空间 #

一、键空间概述 #

1.1 什么是键空间 #

键空间(Keyspace)是ScyllaDB中最顶层的命名空间,类似于关系数据库中的数据库概念。

text
层级结构:
┌─────────────────────────────────────────────────────────┐
│                                                          │
│  Cluster (集群)                                          │
│  └── Keyspace (键空间)                                   │
│      └── Table (表)                                      │
│          └── Partition (分区)                            │
│              └── Row (行)                                │
│                                                          │
└─────────────────────────────────────────────────────────┘

1.2 键空间属性 #

属性 说明
名称 键空间唯一标识
复制策略 数据复制方式
复制因子 副本数量
持久化写入 是否启用提交日志

二、基本语法 #

2.1 CREATE KEYSPACE语法 #

sql
CREATE KEYSPACE [IF NOT EXISTS] keyspace_name
WITH replication = {
    'class': 'replication_strategy',
    ...
}
[AND durable_writes = true|false];

2.2 简单示例 #

sql
-- 最简单的创建方式
CREATE KEYSPACE my_keyspace
WITH replication = {
    'class': 'SimpleStrategy',
    'replication_factor': 1
};

-- 使用IF NOT EXISTS避免错误
CREATE KEYSPACE IF NOT EXISTS my_keyspace
WITH replication = {
    'class': 'SimpleStrategy',
    'replication_factor': 3
};

三、复制策略配置 #

3.1 SimpleStrategy #

适用于单数据中心开发测试环境。

sql
-- SimpleStrategy配置
CREATE KEYSPACE dev_keyspace
WITH replication = {
    'class': 'SimpleStrategy',
    'replication_factor': 3
};

-- 复制因子说明:
-- RF=1: 每条数据存储1份
-- RF=3: 每条数据存储3份(推荐)
-- RF=5: 每条数据存储5份

3.2 NetworkTopologyStrategy #

适用于生产环境,支持多数据中心。

sql
-- 单数据中心
CREATE KEYSPACE production_keyspace
WITH replication = {
    'class': 'NetworkTopologyStrategy',
    'datacenter1': 3
};

-- 多数据中心
CREATE KEYSPACE global_keyspace
WITH replication = {
    'class': 'NetworkTopologyStrategy',
    'dc1': 3,
    'dc2': 3,
    'dc3': 2
};

-- 不同数据中心不同复制因子
CREATE KEYSPACE hybrid_keyspace
WITH replication = {
    'class': 'NetworkTopologyStrategy',
    'primary_dc': 5,
    'secondary_dc': 3,
    'backup_dc': 2
};

3.3 查看数据中心名称 #

bash
# 使用nodetool查看数据中心
nodetool status

# 输出示例
Datacenter: datacenter1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address      Load       Tokens  Owns    Host ID    Rack
UN  192.168.1.1  100 GB     256     33.3%   uuid1      rack1

四、完整配置示例 #

4.1 开发环境配置 #

sql
-- 开发环境:简单配置
CREATE KEYSPACE dev_app
WITH replication = {
    'class': 'SimpleStrategy',
    'replication_factor': 1
}
AND durable_writes = true;

4.2 测试环境配置 #

sql
-- 测试环境:中等配置
CREATE KEYSPACE test_app
WITH replication = {
    'class': 'NetworkTopologyStrategy',
    'datacenter1': 2
}
AND durable_writes = true;

4.3 生产环境配置 #

sql
-- 生产环境:完整配置
CREATE KEYSPACE production_app
WITH replication = {
    'class': 'NetworkTopologyStrategy',
    'dc1': 3,
    'dc2': 3
}
AND durable_writes = true;

4.4 高可用配置 #

sql
-- 高可用:跨数据中心
CREATE KEYSPACE ha_app
WITH replication = {
    'class': 'NetworkTopologyStrategy',
    'us-east': 3,
    'us-west': 3,
    'eu-west': 3
}
AND durable_writes = true;

五、持久化写入 #

5.1 durable_writes说明 #

sql
-- 启用持久化写入(默认)
CREATE KEYSPACE durable_ks
WITH replication = {
    'class': 'SimpleStrategy',
    'replication_factor': 3
}
AND durable_writes = true;

-- 禁用持久化写入(不推荐)
CREATE KEYSPACE non_durable_ks
WITH replication = {
    'class': 'SimpleStrategy',
    'replication_factor': 3
}
AND durable_writes = false;

5.2 持久化写入影响 #

设置 说明 适用场景
true 写入提交日志,数据安全 生产环境
false 不写入提交日志,性能高 临时数据

六、使用键空间 #

6.1 切换键空间 #

sql
-- 切换到指定键空间
USE my_keyspace;

-- 后续操作默认在该键空间下
CREATE TABLE users (
    user_id UUID PRIMARY KEY,
    name TEXT
);

6.2 完全限定名 #

sql
-- 使用完全限定名访问表
SELECT * FROM my_keyspace.users;

-- 插入数据
INSERT INTO my_keyspace.users (user_id, name)
VALUES (uuid(), '张三');

七、查看键空间信息 #

7.1 查看所有键空间 #

sql
-- 列出所有键空间
DESCRIBE KEYSPACES;

-- 或使用系统表
SELECT keyspace_name 
FROM system_schema.keyspaces;

7.2 查看键空间详情 #

sql
-- 查看特定键空间
DESCRIBE KEYSPACE my_keyspace;

-- 查看键空间配置
SELECT * FROM system_schema.keyspaces
WHERE keyspace_name = 'my_keyspace';

7.3 查看键空间中的表 #

sql
-- 列出键空间中的所有表
DESCRIBE TABLES IN my_keyspace;

-- 使用系统表查询
SELECT table_name 
FROM system_schema.tables
WHERE keyspace_name = 'my_keyspace';

八、键空间命名规范 #

8.1 命名规则 #

text
命名规则:
├── 只包含字母、数字、下划线
├── 以字母开头
├── 不区分大小写
├── 最大长度48字符
└── 不能使用保留字

8.2 命名示例 #

sql
-- 好的命名
CREATE KEYSPACE user_data ...
CREATE KEYSPACE order_service ...
CREATE KEYSPACE analytics_db ...

-- 不好的命名
CREATE KEYSPACE 123data ...      -- 数字开头
CREATE KEYSPACE my-data ...      -- 包含连字符
CREATE KEYSPACE "MyKeyspace" ... -- 使用引号(区分大小写)

九、常见错误处理 #

9.1 键空间已存在 #

sql
-- 错误:键空间已存在
CREATE KEYSPACE my_keyspace ...;
-- Error: Keyspace 'my_keyspace' already exists

-- 解决:使用IF NOT EXISTS
CREATE KEYSPACE IF NOT EXISTS my_keyspace ...;

9.2 无效的复制策略 #

sql
-- 错误:无效的复制策略
CREATE KEYSPACE bad_ks
WITH replication = {
    'class': 'InvalidStrategy'
};
-- Error: Unknown replication strategy

-- 解决:使用有效策略
CREATE KEYSPACE good_ks
WITH replication = {
    'class': 'SimpleStrategy',
    'replication_factor': 3
};

9.3 数据中心名称错误 #

sql
-- 错误:数据中心名称不存在
CREATE KEYSPACE bad_dc
WITH replication = {
    'class': 'NetworkTopologyStrategy',
    'nonexistent_dc': 3
};

-- 解决:使用正确的数据中心名称
-- 先查看数据中心名称
-- nodetool status
CREATE KEYSPACE good_dc
WITH replication = {
    'class': 'NetworkTopologyStrategy',
    'datacenter1': 3
};

十、最佳实践 #

10.1 配置建议 #

环境 复制策略 RF durable_writes
开发 SimpleStrategy 1 true
测试 NetworkTopologyStrategy 2 true
生产 NetworkTopologyStrategy 3 true

10.2 命名建议 #

text
命名建议:
├── 使用有意义的名称
├── 体现业务领域
├── 保持一致性
└── 避免使用系统保留字

示例:
├── user_service
├── order_management
├── analytics_platform
└── log_storage

十一、总结 #

创建键空间要点:

要点 说明
复制策略 生产使用NetworkTopologyStrategy
复制因子 推荐3
持久化 生产环境必须启用
命名 有意义、规范

最佳实践:

  1. 生产环境使用NetworkTopologyStrategy
  2. 合理设置复制因子
  3. 启用持久化写入
  4. 使用有意义的命名
  5. 使用IF NOT EXISTS避免错误

下一步,让我们学习修改键空间!

最后更新:2026-03-27