目录
目录README.md

KKKV 分布式键值存储系统

项目概述

KKKV 是一个高性能的分布式键值存储系统,支持本地存储和分布式存储两种模式。系统具有以下特点:

  • 支持本地文件系统存储
  • 支持分布式存储,采用纠删码技术保证数据可靠性
  • 支持热冷数据管理,优化数据访问性能
  • 提供简单易用的客户端API
  • 可选的Raft一致性协议支持

环境要求

  • Go 1.23.6 或更高版本

安装

# 克隆仓库
git clone <repository-url>
cd kv-kkkv

# 安装依赖
go mod download

# 构建项目
go build -o kkkv

启动流程

1. 本地存储模式

本地存储模式适用于单机环境,数据存储在本地文件系统中。

// 创建本地存储引擎
localStore, err := store.NewLocalStore(store.LocalStoreConfig{
    BasePath: "/path/to/storage", // 指定存储目录
})
if err != nil {
    log.Fatalf("Failed to create local store: %v", err)
}
defer localStore.Close()

// 使用存储引擎
localStore.Put("key", []byte("value"))
value, err := localStore.Get("key")
localStore.Delete("key")

2. 分布式存储模式

分布式存储模式适用于多节点环境,数据通过纠删码分片存储在多个节点上,提供更高的可靠性和可用性。

// 创建节点管理器
nodeManager := node.NewInMemoryNodeManager()

// 注册节点
for i := 0; i < 5; i++ {
    node := &node.Node{
        ID:       fmt.Sprintf("node-%d", i),
        Address:  fmt.Sprintf("192.168.1.%d:8000", 10+i),
        Capacity: 1024 * 1024 * 1024, // 1GB
        Used:     0,
    }
    nodeManager.RegisterNode(node)
}

// 创建分布式存储引擎
distStore, err := store.NewDistributedStore(store.DistributedStoreConfig{
    DataShards:   3,           // 数据分片数
    ParityShards: 2,           // 校验分片数
    NodeManager:  nodeManager, // 节点管理器
    NodeStrategy: node.CapacityStrategy, // 节点选择策略
    
    // 可选:热冷数据管理配置
    HotThreshold:   10,           // 热数据阈值
    CooldownPeriod: 24 * time.Hour, // 数据降温周期
    WarmupThreshold: 5,            // 数据升温阈值
    EnableHotCold:  true,          // 启用热冷数据管理
    
    // 可选:Raft配置
    UseRaft:        true,          // 使用Raft协议
    LocalNodeID:    "node-0",      // 本地节点ID
    LocalAddress:   "192.168.1.10:8000", // 本地节点地址
    RaftPeers:      map[string]string{   // Raft对等节点
        "node-1": "192.168.1.11:8000",
        "node-2": "192.168.1.12:8000",
    },
    RaftStoragePath: "/path/to/raft", // Raft存储路径
})
if err != nil {
    log.Fatalf("Failed to create distributed store: %v", err)
}
defer distStore.Close()

// 使用存储引擎
distStore.Put("dist_key", []byte("dist_value"))
value, err := distStore.Get("dist_key")
distStore.Delete("dist_key")

// 客户端API使用示例
client, err := client.NewClient(client.ClientConfig{
    Mode:           client.DistributedMode,
    DataShards:     3,
    ParityShards:   2,
    NodeAddrs:      []string{"node0:8000", "node1:8000", "node2:8000"},
})
if err != nil {
    log.Fatal(err)
}

// 批量操作示例
err = client.BatchPut(map[string][]byte{
    "key1": []byte("value1"),
    "key2": []byte("value2"),
})

// 处理不存在key的案例
_, err = client.Get("non_existent_key")
if errors.Is(err, store.ErrKeyNotFound) {
    log.Println("Key not found")
}

3. 使用客户端API

客户端API提供了统一的接口,可以根据配置使用本地存储或分布式存储。

本地模式客户端

// 创建本地模式客户端
localClient, err := client.NewClient(client.ClientConfig{
    Mode:           client.LocalMode,
    LocalStorePath: "/path/to/storage",
})
if err != nil {
    log.Fatalf("Failed to create local client: %v", err)
}

// 初始化客户端
if err := localClient.Init(); err != nil {
    log.Fatalf("Failed to initialize local client: %v", err)
}
defer localClient.Close()

// 使用客户端API
localClient.Put("key", []byte("value"))
value, err := localClient.Get("key")
localClient.Delete("key")

分布式模式客户端

// 创建分布式模式客户端
distClient, err := client.NewClient(client.ClientConfig{
    Mode:         client.DistributedMode,
    DataShards:   3,
    ParityShards: 2,
    NodeAddrs:    []string{
        "192.168.1.10:8000",
        "192.168.1.11:8000",
        "192.168.1.12:8000",
        "192.168.1.13:8000",
        "192.168.1.14:8000",
    },
})
if err != nil {
    log.Fatalf("Failed to create distributed client: %v", err)
}

// 初始化客户端
if err := distClient.Init(); err != nil {
    log.Fatalf("Failed to initialize distributed client: %v", err)
}
defer distClient.Close()

// 使用客户端API
distClient.Put("key", []byte("value"))
value, err := distClient.Get("key")
distClient.Delete("key")

热冷数据管理

KKKV 支持热冷数据管理,可以根据数据访问频率自动调整数据存储策略:

  • 热数据:访问频率高的数据,存储在性能更好的节点上
  • 冷数据:访问频率低的数据,可能会被迁移到存储成本更低的节点上

热冷数据管理可以通过以下参数配置:

  • HotThreshold:热数据阈值,默认为10次访问
  • CooldownPeriod:数据降温周期,默认为24小时
  • WarmupThreshold:数据升温阈值,默认为5次访问
  • EnableHotCold:是否启用热冷数据管理,默认为true

示例

完整的示例代码可以参考 main.go 文件,其中包含了本地存储、分布式存储和客户端API的使用示例。

许可证

MIT License

关于
87.0 KB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

©Copyright 2023 CCF 开源发展委员会
Powered by Trustie& IntelliDE 京ICP备13000930号