dgraph-io/badger
GitHub: dgraph-io/badger
BadgerDB 是一个纯 Go 编写的高性能可嵌入键值数据库,旨在替代 RocksDB 等非 Go 方案,为大规模数据集提供快速、持久的本地存储。
Stars: 15729 | Forks: 1308
# BadgerDB
[](https://pkg.go.dev/github.com/dgraph-io/badger/v4)
[](https://goreportcard.com/report/github.com/dgraph-io/badger/v4)
[](https://sourcegraph.com/github.com/dgraph-io/badger?badge)
[](https://github.com/dgraph-io/badger/actions/workflows/ci-badger-tests.yml)
[](https://github.com/dgraph-io/badger/actions/workflows/ci-badger-bank-tests.yml)
[](https://github.com/dgraph-io/badger/actions/workflows/ci-badger-bank-tests-nightly.yml)

BadgerDB 是一个用纯 Go 编写的可嵌入、持久且快速的键值 (KV) 数据库。它是
[Dgraph](https://github.com/dgraph-io/dgraph)(一个快速的分布式图数据库)的底层
数据库。它旨在成为基于非 Go 的键值存储(如 RocksDB)的高性能替代方案。
## 项目状态
Badger 很稳定,正被用于提供高达数百 TB 的数据集服务。Badger 支持具有可序列化快照隔离 (SSI) 保证的并发 ACID 事务。一个 Jepsen 风格的
银行测试每晚运行 8 小时,并带有 `--race` 标志,以确保事务
保证的维护。Badger 还经过了测试,可以应对文件系统级别的异常,以确保
持久性和一致性。许多项目都在使用 Badger,包括 Dgraph、
Jaeger Tracing、UsenetExpress 等等。
使用 Badger 的项目列表可以在[这里](#projects-using-badger)找到。
请查阅 [Changelog] 以获取有关发布的更详细信息。
注意:Badger 是使用 go 1.23 构建的,我们尽量避免提升此版本,以最大程度地减少对那些在使用旧版本 Go 构建的应用程序中使用 Badger 的下游
影响。
## 目录
- [BadgerDB](#badgerdb)
- [项目状态](#project-status)
- [目录](#table-of-contents)
- [入门指南](#getting-started)
- [安装说明](#installing)
- [安装 Badger 命令行工具](#installing-badger-command-line-tool)
- [选择版本](#choosing-a-version)
- [Badger 文档](#badger-documentation)
- [资源](#resources)
- [博客文章](#blog-posts)
- [设计](#design)
- [对比](#comparisons)
- [基准测试](#benchmarks)
- [使用 Badger 的项目](#projects-using-badger)
- [贡献](#contributing)
- [联系](#contact)
## 入门指南
### 安装说明
要开始使用 Badger,请安装 Go 1.23 或更高版本。Badger v3 及更高版本需要 go modules。从您的
项目中,运行以下命令
```
go get github.com/dgraph-io/badger/v4
```
这将获取该库。
#### 安装 Badger 命令行工具
Badger 提供了一个 CLI 工具,可以执行某些操作,例如离线备份/恢复。要
安装 Badger CLI,请获取存储库并检出所需的版本。然后运行
```
cd badger
go install .
```
这会将 badger 命令行实用程序安装到您的 $GOBIN 路径中。
## Badger 文档
Badger 文档可在 [https://badger.dgraph.io](https://badger.dgraph.io) 获取
## 资源
### 博客文章
1. [介绍 Badger:一个用 Go 原生编写的快速键值存储](https://hypermode.com/blog/badger/)
2. [使用 ALICE 使 Badger 具备崩溃弹性](https://hypermode.com/blog/alice/)
3. [Badger vs LMDB vs BoltDB:Go 中的键值数据库基准测试](https://hypermode.com/blog/badger-lmdb-boltdb/)
4. [Badger 中的并发 ACID 事务](https://hypermode.com/blog/badger-txn/)
## 设计
编写 Badger 时考虑了以下设计目标:
- 用纯 Go 编写键值数据库。
- 使用最新研究为跨越 TB 级的数据集构建最快的 KV 数据库。
- 针对 SSD 进行优化。
Badger 的设计基于一篇题为 _[WiscKey: Separating Keys from Values in SSD-conscious
Storage][wisckey]_ 的论文。
### 对比
| 特性 | Badger | RocksDB | BoltDB |
| ----------------------------- | ------------------------------------------ | ----------------------------- | --------- |
| 设计 | 带有 value log 的 LSM tree | 仅 LSM tree | B+ tree |
| 高读取吞吐量 | 是 | 否 | 是 |
| 高写入吞吐量 | 是 | 是 | 否 |
| 专为 SSD 设计 | 是 (包含最新研究 1) | 非特定 2 | 否 |
| 可嵌入 | 是 | 是 | 是 |
| 排序的 KV 访问 | 是 | 是 | 是 |
| 纯 Go (无 Cgo) | 是 | 否 | 是 |
| 事务 | 是,ACID,具有 SSI 的并发3 | 是 (但非 ACID) | 是,ACID |
| 快照 | 是 | 是 | 是 |
| TTL 支持 | 是 | 是 | 否 |
| 3D 访问 (键-值-版本) | 是4 | 否 | 否 |
1 [WISCKEY 论文][wisckey](Badger 的基础)在将值与
键分离方面获得了巨大的收益,与典型的 LSM tree 相比,显著降低了写放大。
2 RocksDB 是 LevelDB 的 SSD 优化版本,而 LevelDB 是专门为
旋转磁盘设计的。因此,RocksDB 的设计并不是针对 SSD 的。
3 SSI:可序列化快照隔离。有关更多详细信息,请参阅博客文章
[Badger 中的并发 ACID 事务](https://hypermode.com/blog/badger-txn/)
4 Badger 通过其 Iterator API 提供对值版本的直接访问。用户还可以
通过 Options 指定每个键要保留多少个版本。
### 基准测试
我们针对 RocksDB、Bolt 和 LMDB 进行了全面的基准测试。基准测试代码和
基准测试的详细日志可以在 [badger-bench] 存储库中找到。更多解释,
包括图表,可以在博客文章中找到(链接在上面)。
## 使用 Badger 的项目
以下是已知使用 Badger 的项目列表:
- [Dgraph](https://github.com/dgraph-io/dgraph) - 分布式图数据库。
- [Jaeger](https://github.com/jaegertracing/jaeger) - 分布式追踪平台。
- [go-ipfs](https://github.com/ipfs/go-ipfs) - 星际文件系统 (IPFS) 的 Go 客户端,
一种新的超媒体分发协议。
- [Riot](https://github.com/go-ego/riot) - 一个开源的分布式搜索引擎。
- [emitter](https://github.com/emitter-io/emitter) - 可扩展、低延迟、带有消息存储的分布式 pub/sub
broker,使用 MQTT、gossip 和 badger。
- [OctoSQL](https://github.com/cube2222/octosql) - 一种查询工具,允许您使用 SQL 连接、分析和
转换来自多个数据库的数据。
- [Dkron](https://dkron.io/) - 分布式、容错的作业调度系统。
- [smallstep/certificates](https://github.com/smallstep/certificates) - Step-ca 是一个用于安全、自动化
证书管理的在线证书颁发机构。
- [Sandglass](https://github.com/celrenheit/sandglass) - 分布式、水平可扩展、
持久、按时间排序的消息队列。
- [TalariaDB](https://github.com/grab/talaria) - Grab 的分布式、低延迟时间序列
数据库。
- [Sloop](https://github.com/salesforce/sloop) - Salesforce 的 Kubernetes 历史可视化
项目。
- [Usenet Express](https://usenetexpress.com/) - 使用 Badger 提供超过 300TB 的数据服务。
- [gorush](https://github.com/appleboy/gorush) - 一个用 Go 编写的推送通知服务器。
- [0-stor](https://github.com/zero-os/0-stor) - 单设备对象存储。
- [Dispatch Protocol](https://github.com/dispatchlabs/disgo) - 用于分布式
应用程序数据分析的区块链协议。
- [GarageMQ](https://github.com/valinurovam/garagemq) - 用 Go 编写的 AMQP 服务器。
- [RedixDB](https://alash3al.github.io/redix/) - 具有相同 redis 协议的
实时持久键值存储。
- [BBVA](https://github.com/BBVA/raft-badger) - 使用 BadgerDB 为
Hashicorp raft 实现 Raft 后端。
- [Fantom](https://github.com/Fantom-foundation/go-lachesis) - 用于分布式
应用程序的 aBFT 共识平台。
- [decred](https://github.com/decred/dcrdata) - 一种开放、进步且自我资助的
加密货币,其基于社区的管理系统已集成到其区块链中。
- [OpenNetSys](https://github.com/opennetsys/c3-go) - 使用任何软件语言创建有用的 dApp。
- [HoneyTrap](https://github.com/honeytrap/honeytrap) - 一个可扩展且开源的系统,用于
运行、监控和管理蜜罐。
- [Insolar](https://github.com/insolar/insolar) - 企业级区块链平台。
- [IoTeX](https://github.com/iotexproject/iotex-core) - 由以可扩展性和隐私为中心的区块链驱动的下一代物联网
去中心化网络。
- [go-sessions](https://github.com/kataras/go-sessions) - 适用于 Go net/http 和
fasthttp 的会话管理器。
- [Babble](https://github.com/mosaicnetworks/babble) - 用于分布式
应用程序的 BFT 共识平台。
- [Tormenta](https://github.com/jpincas/tormenta) - 用于 Go 项目的嵌入式对象持久层 / 简单的 JSON
数据库。
- [BadgerHold](https://github.com/timshannon/badgerhold) - 一个用于查询基于
Badger 构建的 Go 类型的可嵌入式 NoSQL 存储
- [Goblero](https://github.com/didil/goblero) - 由
BadgerDB 支持的纯 Go 嵌入式持久作业队列
- [Surfline](https://www.surfline.com) - 使用 Badger 提供全球海浪和天气预报数据服务。
- [Cete](https://github.com/mosuka/cete) - 基于 Badger 构建的简单且高可用的分布式键值存储
。它通过 hashicorp/raft 的 Raft 共识算法
让建立 Badger 集群变得容易。
- [Volument](https://volument.com/) - 由 Badger 支持的一种新型网站分析工具。
- [KVdb](https://kvdb.io/) - 基于 Badger 构建的托管键值存储和无服务器平台。
- [Terminotes](https://gitlab.com/asad-awadia/terminotes) - 自托管的笔记存储和搜索
服务器 - 存储由 BadgerDB 驱动
- [Pyroscope](https://github.com/pyroscope-io/pyroscope) - 使用
BadgerDB 构建的开源持续性能分析平台
- [Veri](https://github.com/bgokden/veri) - 为搜索和
推荐任务优化的分布式特征存储。
- [bIter](https://github.com/MikkelHJuul/bIter) - 一个用于处理
`badger.Iterator` 的库和 Iterator 接口,简化了 from-to 和前缀机制。
- [ld](https://github.com/MikkelHJuul/ld) - (Lean Database) 一个非常简单的仅限 gRPC 的键值
数据库,通过键范围扫描语义公开 BadgerDB。
- [Souin](https://github.com/darkweak/Souin) - 一个兼容 RFC 的 HTTP 缓存,具有许多基于
Badger 进行存储的其他功能。兼容所有现有的反向代理。
- [Xuperchain](https://github.com/xuperchain/xupercore) - 一种高度灵活的区块链架构
,具有出色的交易性能。
- [m2](https://github.com/qichengzx/m2) - 一个基于 raft 协议的简单 http 键/值存储。
- [chaindb](https://github.com/ChainSafe/chaindb) - [Polkadot 网络](https://polkadot.network/) 的 Go 客户端 [Gossamer](https://chainsafe.github.io/gossamer/) 使用的
区块链存储层。
- [vxdb](https://github.com/vitalvas/vxdb) - 具有最简单 API 接口的
简单无 schema 键值 NoSQL 数据库。
- [Opacity](https://github.com/opacity/storage-node) - Opacity
存储项目的后端实现
- [Vephar](https://github.com/vaccovecrana/vephar) - 使用 hashicorp-raft 进行集群协调
并使用 Badger 进行数据存储的最小键/值存储。
- [gowarcserver](https://github.com/nlnwa/gowarcserver) - warc 文件的开源服务器。可以
与 pywb 结合使用
- [flow-go](https://github.com/onflow/flow-go) - 一个快速、安全且对开发者友好的区块链
,旨在支持下一代游戏、应用程序以及为其提供支持的数字资产。
- [Wrgl](
标签:EVTX分析, Go, LSM树, Ruby工具, 分布式存储, 嵌入式数据库, 数据库, 日志审计, 键值数据库