什么是 SonnetDB?为何选择它?
SonnetDB 是由国内团队 IoTSharp 开源的一款时序数据库引擎,基于 C# / .NET 10 构建,采用对商业应用友好的 MIT 许可证 。它专为 IoT 物联网、工业控制、运维监控和实时分析 等场景而设计,堪称 .NET 生态在时序数据领域的一大突破。
GitHub地址: https://github.com/IoTSharp/SonnetDB
选择 SonnetDB 的理由,源于它解决的核心痛点:
- 卓越的性能 :在
i9-13900HX的基准测试中,其写入速度高达 180万点/秒 ,查询延迟仅在毫秒级(10万行范围查询为6.71ms),性能在多方面优于 SQLite、InfluxDB 等。 - 零部署、低延迟 :作为一个"嵌入式优先"的数据库,它以类库形式集成在代码中,无需部署独立服务。这不仅实现了"零部署成本",也因进程内访问而带来了极低的数据读写延迟。
核心架构:它是如何工作的?
理解内部架构能帮你更好地进行配置和排错。SonnetDB 的四层存储架构如下图所示:
应用程序进程
SonnetDB 引擎
WAL
预写日志
(保证数据不丢失)
MemTable
内存表
(高并发写入缓冲)
Segment
不可变数据段
(SSTable风格)
Compaction
后台段压缩
(异步合并文件)
- WAL (预写日志):所有写入操作会先追加到WAL,以保证数据在发生崩溃时不会丢失。同时,CRC 校验机制确保了数据的完整性。
- MemTable (内存表):写入操作的缓冲区,新数据会先暂存在这里并进行排序。当它达到一定大小后,会被整体刷写到磁盘,这保证了高并发写入的性能。
- Segment (不可变数据段):刷写到磁盘后的只读数据文件。这种SSTable风格的文件结构能加速范围查询。
- Compaction (段压缩):一个后台异步任务,负责将多个小的 Segments 文件合并成更大的文件,同时清理掉被标记为删除的数据(Tombstone),以避免存储碎片。
为了高效管理数据的生命周期,SonnetDB 支持 Tombstone(逻辑删除) 和 TTL(自动过期) 两种机制来回收存储空间。
快速开始:5分钟上手
1. 安装
SonnetDB 作为一个嵌入式库,目前主要通过 NuGet 包集成。虽然它的 GitHub 仓库暂未公开,但你可以通过搜索 SonnetDB 来安装(未来官方包名可能会更新)。后续,你也可以关注 IoTSharp 项目获取最新动态。
2. 基础使用
以下示例展示了如何创建数据库实例、写入数据和查询数据。
csharp
using SonnetDB; // 引入命名空间
// 1. 创建或打开一个数据库实例(基于文件)
// 嵌入式设计,直接指定文件路径即可
var db = new SonnetDB("my_data.db");
// 2. 写入一条遥测数据
db.Write(new Telemetry
{
DeviceId = "sensor-001",
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
Value = 23.5
});
// 3. 使用 LINQ 进行原生查询
var startTime = DateTimeOffset.UtcNow.AddHours(-1).ToUnixTimeMilliseconds();
var endTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
var results = db.Query<Telemetry>()
.Where(t => t.DeviceId == "sensor-001")
.Where(t => t.Timestamp >= startTime && t.Timestamp <= endTime)
.ToList();
// 4. 使用 LINQ 进行聚合查询,获取每日平均温度
var dailyAvg = db.Query<Telemetry>()
.Where(t => t.DeviceId == "sensor-001" && t.Timestamp >= startTime && t.Timestamp <= endTime)
.GroupBy(t => t.Timestamp.Date)
.Select(g => new { Date = g.Key, Avg = g.Average(x => x.Value) })
.ToList();
关键点 :SonnetDB 类提供了核心的写入(Write)和查询(Query<T>)方法。
进阶用法:深入体验特性
1. 使用 Span<T> 实现零拷贝读取
SonnetDB 使用 100% 托管代码 ,通过 Span<T> 等现代 C# 特性实现内存安全且高效的数据访问。
csharp
// SonnetDB 内部运用 Span<T> 进行高效的二进制数据解析
public readonly struct DataPoint
{
public long Timestamp { get; }
public double Value { get; }
public DataPoint(ReadOnlySpan<byte> buffer)
{
// 安全地解析二进制数据,避免了 unsafe 代码
Timestamp = BinaryPrimitives.ReadInt64LittleEndian(buffer.Slice(0, 8));
Value = BitConverter.ToDouble(buffer.Slice(8, 8));
}
}
2. 在 IoTSharp 生态中集成
如果你是 IoTSharp 用户,SonnetDB 能无缝替代 InfluxDB 等数据库,作为平台的时序存储层。它的高性能和嵌入式特性非常适合边缘计算场景,可在工业边缘网关上本地缓存数据,实现离线数据不丢失。
csharp
// 在设备端直接嵌入 SonnetDB,实现轻量级本地存储
var db = new SonnetDB("edge_gateway.db");
// 采集传感器数据并写入
foreach(var sensorData in edgeGateway.GetSensorData())
{
db.Write(sensorData);
}
3. 数据生命周期管理
SonnetDB 提供了灵活的数据清理策略,建议结合实际业务需求进行配置。
- 逻辑删除 (Tombstone):删除操作会先添加一个标记,后台 Compaction 时会物理清除数据,保证删除的幂等性和性能。
- 设置 TTL (过期时间):可以为特定数据的保留时间进行配置,以自动清理旧数据、降低存储成本。
如何选择?SonnetDB 对比同类产品
为了帮你更客观地评估,这里将 SonnetDB 与几款主流时序数据库做了横向对比:
| 特性 | SonnetDB | InfluxDB | TDengine | TimescaleDB |
|---|---|---|---|---|
| 部署模式 | 嵌入式 | 服务型 | 服务型 | 扩展型 (基于PostgreSQL) |
| 核心写入性能 | 180万点/秒 | ~20万点/秒 | ~100万点/秒 | ~50万点/秒 |
| 是否原生支持.NET | ✅ 是 | ❌ 否 | ❌ 否 | ❌ 否 |
| 许可证 | MIT | MIT | AGPL | Apache 2.0 |
| 典型生态 | IoTSharp | 通用 | 工业物联网 | PostgreSQL 生态 |
| 适用场景 | 边缘计算、嵌入式、.NET应用 | 监控系统、通用IoT | 工业大数据、物联网 | 需要关系型与时序结合的场景 |
总结
SonnetDB 为 .NET 开发者在进行高性能时序数据处理时,提供了一个卓越的"嵌入式"选择。它的核心优势可以概括为:
- 性能王者 :写入速度高达180万点/秒,毫秒级的查询延迟,能够轻松应对高吞吐场景。
- .NET 原生 :100% C# 托管代码 实现,原生支持 LINQ 查询,API 设计完全符合 .NET 开发者习惯。
- 极致轻量:嵌入式设计无需外部服务依赖,零运维成本,且资源占用极低。