Go to file
kingecg 63d80b88b4 fix ut 2025-06-12 21:31:47 +08:00
.vscode refactory engine 2025-06-12 19:01:40 +08:00
cmd/server docs(README): 更新项目文档并重构 README 结构 2025-06-12 15:43:18 +08:00
docs refactory engine 2025-06-12 19:01:40 +08:00
pkg fix ut 2025-06-12 21:31:47 +08:00
.gitignore first gen 2025-06-10 21:38:06 +08:00
Makefile fix code 2025-06-11 00:07:20 +08:00
README.md docs(README): 更新项目文档并重构 README 结构 2025-06-12 15:43:18 +08:00
go.mod docs(README): 更新项目文档并重构 README 结构 2025-06-12 15:43:18 +08:00
go.sum docs(README): 更新项目文档并重构 README 结构 2025-06-12 15:43:18 +08:00

README.md

GoTiDB - 轻量级时序数据库

GoTiDB 是一个用 Go 语言编写的轻量级时序数据库,专为高效存储和查询时间序列数据而设计。它提供了简单而强大的 API支持高吞吐量的数据写入和灵活的查询功能。

功能特点

  • 高效存储: 使用基于文件的存储引擎,针对时间序列数据进行了优化
  • 灵活查询: 支持原始数据查询、最新值查询和聚合查询
  • 标签索引: 使用多维标签索引,支持按标签快速过滤数据
  • 时间窗口: 高效的时间窗口索引,加速时间范围查询
  • 数据压缩: 支持自动压缩旧数据,节省存储空间
  • 数据保留: 自动清理过期数据,支持配置保留策略
  • 并发安全: 支持多个并发读写操作
  • 可扩展: 模块化设计,易于扩展和定制

安装

go get git.pyer.club/kingecg/gotidb

快速开始

以下是一个简单的示例,展示如何使用 GoTiDB

package main

import (
	"context"
	"fmt"
	"time"

	"git.pyer.club/kingecg/gotidb/pkg/engine"
	_ "git.pyer.club/kingecg/gotidb/pkg/engine/file" // 导入文件引擎
)

func main() {
	// 创建引擎配置
	config := &engine.FileEngineConfig{
		DataDir:         "/path/to/data",
		SegmentSize:     1024 * 1024, // 1MB
		MaxSegments:     10,
		WriteBufferSize: 1000,
	}

	// 创建引擎
	e, err := engine.NewEngine(engine.EngineConfig{
		Type:       "file",
		FileConfig: config,
	})
	if err != nil {
		fmt.Printf("Failed to create engine: %v\n", err)
		return
	}

	// 打开引擎
	if err := e.Open(); err != nil {
		fmt.Printf("Failed to open engine: %v\n", err)
		return
	}
	defer e.Close()

	// 写入数据
	points := []engine.DataPoint{
		{
			Timestamp: time.Now().UnixNano(),
			Value:     42.0,
			Labels: map[string]string{
				"host":   "server1",
				"region": "us-west",
			},
		},
	}

	ctx := context.Background()
	if err := e.Write(ctx, points); err != nil {
		fmt.Printf("Failed to write points: %v\n", err)
		return
	}

	// 查询数据
	query := engine.Query{
		Type:      engine.QueryTypeRaw,
		StartTime: time.Now().Add(-time.Hour).UnixNano(),
		EndTime:   time.Now().UnixNano(),
		Tags: map[string]string{
			"host": "server1",
		},
	}

	result, err := e.Query(ctx, query)
	if err != nil {
		fmt.Printf("Failed to query: %v\n", err)
		return
	}

	// 处理查询结果
	for _, series := range result {
		fmt.Printf("Series ID: %s\n", series.SeriesID)
		for _, point := range series.Points {
			fmt.Printf("  Timestamp: %s, Value: %f\n",
				time.Unix(0, point.Timestamp).Format(time.RFC3339),
				point.Value)
		}
	}
}

更多示例请参考 examples 目录。

配置选项

文件引擎配置

选项 描述 默认值
DataDir 数据存储目录 必填
SegmentSize 段文件大小限制(字节) 64MB
MaxSegments 最大段文件数量 100
WriteBufferSize 写入缓冲区大小(数据点数) 1000
IndexCacheSize 索引缓存大小(字节) 32MB
UseCompression 是否启用压缩 false
CompressionLevel 压缩级别0-9 6
CompactThreshold 触发压缩的阈值(段文件数量比例) 0.7
MaxOpenFiles 最大打开文件数 100
SyncWrites 是否同步写入(更安全但更慢) false
RetentionPeriod 数据保留时间 30d

性能考虑

  • 写入性能: 使用写入缓冲区和异步刷新可以提高写入性能
  • 查询性能: 使用标签索引和时间窗口索引加速查询
  • 存储效率: 启用压缩可以减少存储空间占用,但会增加 CPU 使用率
  • 内存使用: 调整索引缓存大小可以平衡内存使用和查询性能
  • 文件描述符: 调整最大打开文件数以适应系统限制

架构

GoTiDB 的核心架构包括:

  1. 引擎接口: 定义了存储引擎的通用接口
  2. 文件引擎: 基于文件系统的存储引擎实现
  3. 索引管理: 标签索引和时间窗口索引
  4. 查询处理: 原始查询、最新值查询和聚合查询
  5. 后台任务: 数据压缩和过期数据清理

贡献

欢迎贡献代码、报告问题或提出改进建议!请遵循以下步骤:

  1. Fork 项目
  2. 创建功能分支 (git checkout -b feature/amazing-feature)
  3. 提交更改 (git commit -m 'Add some amazing feature')
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 创建 Pull Request

许可证

本项目采用 MIT 许可证 - 详见 LICENSE 文件。