482 lines
9.1 KiB
Markdown
482 lines
9.1 KiB
Markdown
|
|
# SRDB Examples
|
|||
|
|
|
|||
|
|
本目录包含 SRDB 数据库的示例程序和工具。
|
|||
|
|
|
|||
|
|
## 目录结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
examples/
|
|||
|
|
└── webui/ # Web UI 和命令行工具集
|
|||
|
|
├── main.go # 主入口点
|
|||
|
|
├── commands/ # 命令实现
|
|||
|
|
│ ├── webui.go # Web UI 服务器
|
|||
|
|
│ ├── check_data.go # 数据检查工具
|
|||
|
|
│ ├── check_seq.go # 序列号检查工具
|
|||
|
|
│ ├── dump_manifest.go # Manifest 导出工具
|
|||
|
|
│ ├── inspect_all_sst.go # SST 文件批量检查
|
|||
|
|
│ ├── inspect_sst.go # SST 文件检查工具
|
|||
|
|
│ ├── test_fix.go # 修复测试工具
|
|||
|
|
│ └── test_keys.go # 键存在性测试工具
|
|||
|
|
└── README.md # WebUI 详细文档
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## WebUI - 数据库管理工具
|
|||
|
|
|
|||
|
|
一个集成了 Web 界面和命令行工具的 SRDB 数据库管理工具。
|
|||
|
|
|
|||
|
|
### 功能特性
|
|||
|
|
|
|||
|
|
#### 🌐 Web UI
|
|||
|
|
- **表列表展示** - 可视化查看所有表及其 Schema
|
|||
|
|
- **数据分页浏览** - 表格形式展示数据,支持分页和列选择
|
|||
|
|
- **Manifest 查看** - 查看 LSM-Tree 结构和 Compaction 状态
|
|||
|
|
- **响应式设计** - 基于 HTMX 的现代化界面
|
|||
|
|
- **大数据优化** - 自动截断显示,点击查看完整内容
|
|||
|
|
|
|||
|
|
#### 🛠️ 命令行工具
|
|||
|
|
- **数据检查** - 检查表和数据完整性
|
|||
|
|
- **序列号验证** - 验证特定序列号的数据
|
|||
|
|
- **Manifest 导出** - 导出 LSM-Tree 层级信息
|
|||
|
|
- **SST 文件检查** - 检查和诊断 SST 文件问题
|
|||
|
|
|
|||
|
|
### 快速开始
|
|||
|
|
|
|||
|
|
#### 1. 启动 Web UI
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd examples/webui
|
|||
|
|
|
|||
|
|
# 使用默认配置(数据库:./data,端口:8080)
|
|||
|
|
go run main.go serve
|
|||
|
|
|
|||
|
|
# 或指定自定义配置
|
|||
|
|
go run main.go serve -db ./mydb -addr :3000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
然后打开浏览器访问 `http://localhost:8080`
|
|||
|
|
|
|||
|
|
#### 2. 查看帮助
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
go run main.go help
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
```
|
|||
|
|
SRDB WebUI - Database management tool
|
|||
|
|
|
|||
|
|
Usage:
|
|||
|
|
webui <command> [flags]
|
|||
|
|
|
|||
|
|
Commands:
|
|||
|
|
webui, serve Start WebUI server (default: :8080)
|
|||
|
|
check-data Check database tables and row counts
|
|||
|
|
check-seq Check specific sequence numbers
|
|||
|
|
dump-manifest Dump manifest information
|
|||
|
|
inspect-all-sst Inspect all SST files
|
|||
|
|
inspect-sst Inspect a specific SST file
|
|||
|
|
test-fix Test fix for data retrieval
|
|||
|
|
test-keys Test key existence
|
|||
|
|
help Show this help message
|
|||
|
|
|
|||
|
|
Examples:
|
|||
|
|
webui serve -db ./mydb -addr :3000
|
|||
|
|
webui check-data -db ./mydb
|
|||
|
|
webui inspect-sst -file ./data/logs/sst/000046.sst
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 命令详解
|
|||
|
|
|
|||
|
|
### serve / webui - 启动 Web 服务器
|
|||
|
|
|
|||
|
|
启动 Web UI 服务器,提供数据可视化界面。
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 基本用法
|
|||
|
|
go run main.go serve
|
|||
|
|
|
|||
|
|
# 指定数据库路径和端口
|
|||
|
|
go run main.go webui -db ./mydb -addr :3000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**参数**:
|
|||
|
|
- `-db` - 数据库目录路径(默认:`./data`)
|
|||
|
|
- `-addr` - 服务器地址(默认:`:8080`)
|
|||
|
|
|
|||
|
|
**功能**:
|
|||
|
|
- 自动创建示例表(users, products, logs)
|
|||
|
|
- 后台自动插入测试数据(每秒一条)
|
|||
|
|
- 提供 Web UI 和 HTTP API
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### check-data - 检查数据
|
|||
|
|
|
|||
|
|
检查数据库中所有表的记录数。
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
go run main.go check-data -db ./data
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
```
|
|||
|
|
Found 3 tables: [users products logs]
|
|||
|
|
Table 'users': 5 rows
|
|||
|
|
Table 'products': 6 rows
|
|||
|
|
Table 'logs': 1234 rows
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### check-seq - 检查序列号
|
|||
|
|
|
|||
|
|
验证特定序列号的数据是否存在。
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
go run main.go check-seq -db ./data
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**功能**:
|
|||
|
|
- 检查 seq=1, 100, 729 等特定序列号
|
|||
|
|
- 显示总记录数
|
|||
|
|
- 验证数据完整性
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### dump-manifest - 导出 Manifest
|
|||
|
|
|
|||
|
|
导出数据库的 Manifest 信息,检查文件重复。
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
go run main.go dump-manifest -db ./data
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
```
|
|||
|
|
Level 0: 5 files
|
|||
|
|
Level 1: 3 files
|
|||
|
|
Level 2: 1 files
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### inspect-all-sst - 批量检查 SST 文件
|
|||
|
|
|
|||
|
|
检查所有 SST 文件的完整性。
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
go run main.go inspect-all-sst -dir ./data/logs/sst
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
```
|
|||
|
|
Found 10 SST files
|
|||
|
|
|
|||
|
|
File #1 (000001.sst):
|
|||
|
|
Header: MinKey=1 MaxKey=100 RowCount=100
|
|||
|
|
Actual: 100 keys [1 ... 100]
|
|||
|
|
|
|||
|
|
File #2 (000002.sst):
|
|||
|
|
Header: MinKey=101 MaxKey=200 RowCount=100
|
|||
|
|
Actual: 100 keys [101 ... 200]
|
|||
|
|
*** MISMATCH: Header says 101-200 but file has 105-200 ***
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### inspect-sst - 检查单个 SST 文件
|
|||
|
|
|
|||
|
|
详细检查特定 SST 文件。
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
go run main.go inspect-sst -file ./data/logs/sst/000046.sst
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出示例**:
|
|||
|
|
```
|
|||
|
|
File: ./data/logs/sst/000046.sst
|
|||
|
|
Size: 524288 bytes
|
|||
|
|
|
|||
|
|
Header:
|
|||
|
|
RowCount: 100
|
|||
|
|
MinKey: 332
|
|||
|
|
MaxKey: 354
|
|||
|
|
DataSize: 512000 bytes
|
|||
|
|
|
|||
|
|
Actual keys in file: 100 keys
|
|||
|
|
First key: 332
|
|||
|
|
Last key: 354
|
|||
|
|
All keys: [332 333 334 ... 354]
|
|||
|
|
|
|||
|
|
Trying to get key 332:
|
|||
|
|
FOUND: seq=332, time=1234567890
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### test-fix - 测试修复
|
|||
|
|
|
|||
|
|
测试数据检索的修复功能。
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
go run main.go test-fix -db ./data
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**功能**:
|
|||
|
|
- 测试首部、中部、尾部记录
|
|||
|
|
- 验证 Get() 操作的正确性
|
|||
|
|
- 显示修复状态
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### test-keys - 测试键存在性
|
|||
|
|
|
|||
|
|
测试特定键是否存在。
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
go run main.go test-keys -db ./data
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**功能**:
|
|||
|
|
- 测试预定义的键列表
|
|||
|
|
- 统计找到的键数量
|
|||
|
|
- 显示首尾记录
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 编译安装
|
|||
|
|
|
|||
|
|
### 编译二进制
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd examples/webui
|
|||
|
|
go build -o webui main.go
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 全局安装
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
go install ./examples/webui@latest
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
然后可以在任何地方使用:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
webui serve -db ./mydb
|
|||
|
|
webui check-data -db ./mydb
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Web UI 使用
|
|||
|
|
|
|||
|
|
### 界面布局
|
|||
|
|
|
|||
|
|
访问 `http://localhost:8080` 后,你会看到:
|
|||
|
|
|
|||
|
|
**左侧边栏**:
|
|||
|
|
- 表列表,显示每个表的字段数
|
|||
|
|
- 点击展开查看 Schema 详情
|
|||
|
|
- 点击表名切换到该表
|
|||
|
|
|
|||
|
|
**右侧主区域**:
|
|||
|
|
- **Data 视图**:数据表格,支持分页和列选择
|
|||
|
|
- **Manifest 视图**:LSM-Tree 结构和 Compaction 状态
|
|||
|
|
|
|||
|
|
### HTTP API 端点
|
|||
|
|
|
|||
|
|
#### 获取表列表
|
|||
|
|
```
|
|||
|
|
GET /api/tables-html
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 获取表数据
|
|||
|
|
```
|
|||
|
|
GET /api/tables-view/{table_name}?page=1&pageSize=20
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 获取 Manifest
|
|||
|
|
```
|
|||
|
|
GET /api/tables-view/{table_name}/manifest
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 获取 Schema
|
|||
|
|
```
|
|||
|
|
GET /api/tables/{table_name}/schema
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 获取单条数据
|
|||
|
|
```
|
|||
|
|
GET /api/tables/{table_name}/data/{seq}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
详细 API 文档请参考:[webui/README.md](webui/README.md)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 在你的应用中集成
|
|||
|
|
|
|||
|
|
### 方式 1:使用 WebUI 包
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
package main
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"net/http"
|
|||
|
|
"code.tczkiot.com/srdb"
|
|||
|
|
"code.tczkiot.com/srdb/webui"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
func main() {
|
|||
|
|
db, _ := srdb.Open("./mydb")
|
|||
|
|
defer db.Close()
|
|||
|
|
|
|||
|
|
// 创建 WebUI handler
|
|||
|
|
handler := webui.NewWebUI(db)
|
|||
|
|
|
|||
|
|
// 启动服务器
|
|||
|
|
http.ListenAndServe(":8080", handler)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方式 2:挂载到现有应用
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
mux := http.NewServeMux()
|
|||
|
|
|
|||
|
|
// 你的其他路由
|
|||
|
|
mux.HandleFunc("/api/myapp", myHandler)
|
|||
|
|
|
|||
|
|
// 挂载 SRDB Web UI 到 /admin/db 路径
|
|||
|
|
mux.Handle("/admin/db/", http.StripPrefix("/admin/db", webui.NewWebUI(db)))
|
|||
|
|
|
|||
|
|
http.ListenAndServe(":8080", mux)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方式 3:使用命令工具
|
|||
|
|
|
|||
|
|
将 webui 工具的命令集成到你的应用:
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
import "code.tczkiot.com/srdb/examples/webui/commands"
|
|||
|
|
|
|||
|
|
// 检查数据
|
|||
|
|
commands.CheckData("./mydb")
|
|||
|
|
|
|||
|
|
// 导出 manifest
|
|||
|
|
commands.DumpManifest("./mydb")
|
|||
|
|
|
|||
|
|
// 启动服务器
|
|||
|
|
commands.StartWebUI("./mydb", ":8080")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 开发和调试
|
|||
|
|
|
|||
|
|
### 开发模式
|
|||
|
|
|
|||
|
|
在开发时,使用 `go run` 可以快速测试:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 启动服务器
|
|||
|
|
go run main.go serve
|
|||
|
|
|
|||
|
|
# 在另一个终端检查数据
|
|||
|
|
go run main.go check-data
|
|||
|
|
|
|||
|
|
# 检查 SST 文件
|
|||
|
|
go run main.go inspect-all-sst
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 清理数据
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 删除数据目录
|
|||
|
|
rm -rf ./data
|
|||
|
|
|
|||
|
|
# 重新运行
|
|||
|
|
go run main.go serve
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **数据目录**:默认在当前目录创建 `./data` 目录
|
|||
|
|
2. **端口占用**:确保端口未被占用
|
|||
|
|
3. **并发访问**:Web UI 支持多用户并发访问
|
|||
|
|
4. **只读模式**:Web UI 仅用于查看,不提供数据修改功能
|
|||
|
|
5. **生产环境**:建议添加身份验证和访问控制
|
|||
|
|
6. **性能考虑**:大表分页查询性能取决于数据分布
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 技术栈
|
|||
|
|
|
|||
|
|
- **后端**:Go 标准库(net/http)
|
|||
|
|
- **前端**:HTMX + 原生 JavaScript + CSS
|
|||
|
|
- **渲染**:服务端 HTML 渲染(Go)
|
|||
|
|
- **数据库**:SRDB (LSM-Tree)
|
|||
|
|
- **部署**:所有静态资源通过 embed 嵌入,无需单独部署
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 故障排除
|
|||
|
|
|
|||
|
|
### 常见问题
|
|||
|
|
|
|||
|
|
**1. 启动失败 - 端口被占用**
|
|||
|
|
```bash
|
|||
|
|
Error: listen tcp :8080: bind: address already in use
|
|||
|
|
```
|
|||
|
|
解决:使用 `-addr` 指定其他端口
|
|||
|
|
```bash
|
|||
|
|
go run main.go serve -addr :3000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**2. 数据库打开失败**
|
|||
|
|
```bash
|
|||
|
|
Error: failed to open database: invalid header
|
|||
|
|
```
|
|||
|
|
解决:删除损坏的数据目录
|
|||
|
|
```bash
|
|||
|
|
rm -rf ./data
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**3. SST 文件损坏**
|
|||
|
|
使用 `inspect-sst` 或 `inspect-all-sst` 命令诊断:
|
|||
|
|
```bash
|
|||
|
|
go run main.go inspect-all-sst -dir ./data/logs/sst
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 更多信息
|
|||
|
|
|
|||
|
|
- **WebUI 详细文档**:[webui/README.md](webui/README.md)
|
|||
|
|
- **SRDB 主文档**:[../README.md](../README.md)
|
|||
|
|
- **Compaction 说明**:[../COMPACTION.md](../COMPACTION.md)
|
|||
|
|
- **压力测试报告**:[../STRESS_TEST_RESULTS.md](../STRESS_TEST_RESULTS.md)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 贡献
|
|||
|
|
|
|||
|
|
欢迎贡献新的示例和工具!请遵循以下规范:
|
|||
|
|
|
|||
|
|
1. 在 `examples/` 下创建新的子目录
|
|||
|
|
2. 提供清晰的 README 文档
|
|||
|
|
3. 添加示例代码和使用说明
|
|||
|
|
4. 更新本文件
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 许可证
|
|||
|
|
|
|||
|
|
与 SRDB 项目相同的许可证。
|