环境要求
安装 KDSS 前,请确保您的环境满足以下要求。
最低硬件要求
| 资源 | 最低要求 | 说明 |
|---|---|---|
| CPU | 8 核 | Storage 节点最低要求;建议 16 核 |
| 内存 | 32 GB | 混合节点(Master+Storage)需 64-128 GB |
| 系统盘 | 200 GB SSD | 混合节点需 1 TB NVMe(MongoDB + BadgerDB) |
| 数据盘 | 1+ 块裸盘 | 每节点最多 36 × 16 TB HDD |
| 网络 | 10 Gbps | 建议 20 Gbps 绑定双口 |
推荐硬件配置
| 资源 | 推荐配置 | 说明 |
|---|---|---|
| CPU | 16 核 | 更多核心可加速 EC 编码 |
| 内存 | 128 GB | 混合节点:MongoDB 64 GB + 服务 32 GB |
| 系统盘 | 2 TB NVMe | NVMe 用于操作系统、元数据和索引 |
| 数据盘 | 36 × 16 TB | 大容量机械硬盘,用于存储节点 |
| 网络 | 20 Gbps | 绑定双口网卡实现高可用 |
软件要求
- Ubuntu 24.04 LTS(推荐),Linux 内核 4.15+
- MongoDB 8.0+(副本集部署以实现元数据高可用)
- Go 1.24+(仅编译时需要)
- FUSE 3.x(仅在使用 FUSE 挂载客户端时需要)
容量规划
根据存储需求和 EC 配置规划集群规模。
可用容量公式
可用存储容量由 EC 配置决定:
formula
Usable Capacity = Raw Capacity x (data_shards / (data_shards + parity_shards))
计算示例
下表展示了 100 TB 裸盘空间在不同 EC 配置下的可用容量:
| EC 配置 | 数据片 | 校验片 | 利用率 | 可用容量 (100 TB 裸) | 容错能力 |
|---|---|---|---|---|---|
EC 5+2 |
5 | 2 | 71.4% | 71.4 TB | 容忍 2 块磁盘故障 |
EC 9+2 |
9 | 2 | 81.8% | 81.8 TB | 容忍 2 块磁盘故障 |
EC 18+3 |
18 | 3 | 85.7% | 85.7 TB | 容忍 3 块磁盘故障 |
EC 29+3 |
29 | 3 | 90.6% | 90.6 TB | 容忍 3 块磁盘故障 |
EC 31+2 |
31 | 2 | 93.9% | 93.9 TB | 容忍 2 块磁盘故障 |
提示:对于大多数生产工作负载,EC 9+2 在空间利用率(81.8%)和容错能力(容忍 2 块同时故障)之间提供了良好平衡。如果您的环境有更高的关联磁盘故障风险,建议使用 EC 18+3 或 EC 29+3 以获得更高的校验保护。
警告:EC 31+2 极致密度模式仅适用于全新的存储服务器和全新企业级硬盘,且必须部署在 Tier 3+ 标准的 IDC 机房,配备 24 小时人员值守随时处理硬件故障。仅 2 个校验分片,容错余量极小——磁盘更换的任何延迟都会增加数据丢失风险。
S3 接口
KDSS 提供完全兼容 S3 的 API 网关,支持标准 S3 工具和 SDK。默认端点为 http://
AWS CLI
使用标准 AWS CLI 与 KDSS 交互,配置自定义端点指向 KDSS S3 网关。
bash
# Configure credentials (use KDSS access key / secret key)
aws configure
# AWS Access Key ID: your-access-key
# AWS Secret Access Key: your-secret-key
# Default region name: us-east-1
# Default output format: json
# Set alias for convenience
alias s3='aws --endpoint-url http://master-host:9000 s3'
alias s3api='aws --endpoint-url http://master-host:9000 s3api'
# Bucket operations
s3 mb s3://my-bucket # Create bucket
s3 ls # List buckets
s3 ls s3://my-bucket/ # List objects
s3 rb s3://my-bucket --force # Delete bucket
# Upload / Download
s3 cp local-file.dat s3://my-bucket/ # Upload file
s3 cp s3://my-bucket/file.dat ./ # Download file
s3 cp ./data/ s3://my-bucket/data/ --recursive # Upload directory
s3 sync ./backup/ s3://my-bucket/backup/ # Sync directory
# Delete
s3 rm s3://my-bucket/file.dat # Delete object
s3 rm s3://my-bucket/ --recursive # Delete all objects
s3cmd
s3cmd 是一个轻量级的 S3 兼容存储命令行工具。
~/.s3cfg
[default]
access_key = your-access-key
secret_key = your-secret-key
host_base = master-host:9000
host_bucket = master-host:9000/%(bucket)
use_https = False
signature_v2 = False
bash
# Bucket operations
s3cmd mb s3://my-bucket
s3cmd ls
# Upload / Download
s3cmd put file.dat s3://my-bucket/
s3cmd get s3://my-bucket/file.dat ./
s3cmd sync ./data/ s3://my-bucket/data/
# File info
s3cmd info s3://my-bucket/file.dat
Python (boto3)
使用 boto3 SDK 通过 Python 编程方式访问 KDSS。
python
import boto3
# Create S3 client pointing to KDSS
s3 = boto3.client(
"s3",
endpoint_url="http://master-host:9000",
aws_access_key_id="your-access-key",
aws_secret_access_key="your-secret-key",
region_name="us-east-1",
)
# Create bucket
s3.create_bucket(Bucket="my-bucket")
# Upload file
s3.upload_file("local-file.dat", "my-bucket", "path/to/file.dat")
# Download file
s3.download_file("my-bucket", "path/to/file.dat", "downloaded.dat")
# List objects
resp = s3.list_objects_v2(Bucket="my-bucket", Prefix="path/")
for obj in resp.get("Contents", []):
print(obj["Key"], obj["Size"])
# Generate presigned URL (valid for 1 hour)
url = s3.generate_presigned_url(
"get_object",
Params={"Bucket": "my-bucket", "Key": "path/to/file.dat"},
ExpiresIn=3600,
)
print(url)
# Delete object
s3.delete_object(Bucket="my-bucket", Key="path/to/file.dat")
Go
使用 AWS SDK for Go (v2) 与 KDSS 交互。
go
package main
import (
"context"
"fmt"
"os"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
// Create S3 client pointing to KDSS
cfg, _ := config.LoadDefaultConfig(context.TODO(),
config.WithRegion("us-east-1"),
config.WithCredentialsProvider(
credentials.NewStaticCredentialsProvider("your-access-key", "your-secret-key", ""),
),
)
client := s3.NewFromConfig(cfg, func(o *s3.Options) {
o.BaseEndpoint = aws.String("http://master-host:9000")
o.UsePathStyle = true
})
// Upload file
file, _ := os.Open("local-file.dat")
defer file.Close()
client.PutObject(context.TODO(), &s3.PutObjectInput{
Bucket: aws.String("my-bucket"),
Key: aws.String("path/to/file.dat"),
Body: file,
})
// List objects
resp, _ := client.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
Bucket: aws.String("my-bucket"),
})
for _, obj := range resp.Contents {
fmt.Printf("%s %d bytes\n", *obj.Key, *obj.Size)
}
}
支持的 S3 操作
KDSS S3 网关支持以下 S3 API 操作:
| 分类 | 操作 |
|---|---|
| 存储桶 | CreateBucket DeleteBucket ListBuckets HeadBucket |
| 对象 | PutObject GetObject DeleteObject HeadObject CopyObject |
| 列举 | ListObjectsV2 ListObjectVersions |
| 分片上传 | CreateMultipartUpload UploadPart CompleteMultipartUpload AbortMultipartUpload |
| 预签名 URL | GET PUT |
配置参考
所有配置文件的完整参考。
master.toml 参考
KDSS 主节点配置(TOML 格式)。
| 配置项 | 默认值 | 描述 |
|---|---|---|
listen | :6700 | gRPC 监听地址 |
web_listen | :8081 | Web 控制台监听地址 |
s3_listen | :9000 | S3 网关监听地址 |
mongo_uri | (必填) | MongoDB 连接 URI |
mongo_db | kdss | MongoDB 数据库名称 |
ec.data_shards | (必填) | 每条条带的数据分片数 |
ec.parity_shards | (必填) | 每条条带的校验分片数 |
leader.lock_ttl_sec | 10 | Leader 锁超时(秒) |
leader.renew_interval_sec | 3 | Leader 锁续约间隔(秒) |
gc.interval_sec | 3600 | GC 巡检扫描间隔(秒) |
gc.auto_gc_pending_hours | 48 | gc_pending 超时自动删除(小时) |
capacity.alert_pct | 95 | 集群容量告警阈值(%) |
capacity.reject_pct | 99 | 集群容量拒写阈值(%) |
repair.concurrency | 4 | 每台 Master 并发修复任务数 |
log.level | info | 日志级别 (debug, info, warn, error) |
log.file | /var/log/kdss/master.log | 日志文件路径 |
storage.toml 参考
KDSS 存储节点配置(TOML 格式)。
| 配置项 | 默认值 | 描述 |
|---|---|---|
node_id | (必填) | 节点唯一标识 |
listen | :6800 | gRPC 监听地址 |
master_addrs | (必填) | Master 节点地址列表 |
index_dir | /opt/kdss/index | BadgerDB 索引目录(建议 SSD) |
[[disks]].disk_id | (必填) | 磁盘标识 |
[[disks]].device | (必填) | 磁盘设备路径(建议 /dev/disk/by-id/) |
heartbeat.interval_sec | 60 | 心跳间隔(秒) |
heartbeat.timeout_sec | 180 | 心跳超时(秒) |
checker.enabled | true | 启用 CRC32 完整性巡检 |
checker.rate_mb_per_sec | 50 | 巡检速率限制(MB/s/盘) |
compactor.enabled | true | 启用后台压缩 |
compactor.threshold | 0.2 | 软压缩阈值(20%) |
compactor.force_threshold | 0.5 | 强制压缩阈值(50%) |
sync.mode | immediate | fsync 策略:immediate / batch / deferred |
log.level | info | 日志级别 |
log.file | /var/log/kdss/storage.log | 日志文件路径 |
mount.toml 参考
KDSS FUSE 挂载客户端配置(TOML 格式)。
| 配置项 | 默认值 | 描述 |
|---|---|---|
cluster.masters | (必填) | Master 节点地址列表 |
auth.access_key | (必填) | S3 访问密钥 |
auth.secret_key | (必填) | S3 密钥 |
auth.bucket | (必填) | 目标 Bucket 名称 |
mount.mountpoint | (必填) | 本地挂载点路径 |
mount.entry_timeout_s | 3600 | 内核 dentry 缓存 TTL(秒) |
mount.attr_timeout_s | 3600 | 内核属性缓存 TTL(秒) |
performance.chunk_size_mb | 256 | chunk 大小(MB),1 chunk = 1 stripe |
performance.read_rate_limit_mb | 0 | 读取速率限制(MB/s,0=不限) |
performance.write_rate_limit_mb | 0 | 写入速率限制(MB/s,0=不限) |
timeout.master_timeout_ms | 5000 | Master RPC 超时(毫秒) |
timeout.storage_timeout_ms | 10000 | Storage RPC 超时(毫秒) |
log.level | info | 日志级别 |
log.file | (stdout) | 日志文件路径 |