Skip to content

Latest commit

 

History

History
134 lines (101 loc) · 8.18 KB

README.CHS.md

File metadata and controls

134 lines (101 loc) · 8.18 KB

dragonboat

Dragonboat - Go多组Raft库

license Build status travis-ci Go Report Card codecov Godoc Join the chat at https://gitter.im/lni/dragonboat

项目新闻

  • 2019-07-04 Dragonboat v3.1 已发布,请在升级前仔细阅读CHANGELOG
  • 2019-06-21 Dragonboat v3.0 已发布,新增基于磁盘的状态机和Go module支持,详见(CHANGELOG)。
  • 2019-02-20 Dragonboat v2.1 已发布。

关于

Dragonboat是一个高性能Go实现的多组Raft 共识算法库,它同时提供C++11支持。

Raft这样的共识算法使得只要系统中的多数成员在线便可使得系统持续运行。比如,一个拥有5台服务器的Raft集群中即使有两台服务器故障依旧可以工作。它同时向客户端展现一个单机节点,始终提供强一致保证的数据访存。同时,所有在线的成员节点都可用来提供读操作,从而提供更高的读吞吐总和。

所有Raft相关的技术难点都会由Dragonboat来承担,用户从而可以只关注他们各自的应用领域。Dragonboats使用十分简便,详细的例程可使新用户在半小时内完全掌握它。

功能

  • 便于使用的可构建单组与多组Raft应用的Go和C++ API
  • 功能完备的多组Raft协议的实现,同机支持数千Raft组
  • 完备的测试确保正确性,这包括Jepsen所带的Knossos强一致性检查,部分测试日志在此
  • 全流水线设计、TLS支持,适合被部署于跨地域的高网络延时公网环境
  • 在中档硬件上即可获得约300万/秒的写或1000万/秒的强一致读的性能
  • 支持定制的Raft log存储与Raft RPC模块,可方便整合最新IO类技术产品
  • 基于Prometheus的健康度metrics支持
  • 内建的用于修复已永久丢失多数派节点的Raft组的工具
  • 多Raft组由自带的Drummer服务器组件管理以获得良好的高可用

Diego Ongaro的Raft博士学位论文中提及的绝大多数功能都已实现:

  • 选主、log复制、状态机快照与log清理
  • Raft组成员变更
  • 基于ReadIndex协议的只读查询
  • 主节点转移
  • 无投票权成员
  • Witness成员
  • 应用透明的幂等更新支持
  • 成组处理优化与流水化处理
  • 基于磁盘的状态机

性能

Dragonboat是目前Github网站上最快的开源多组Raft实现。

在三节点系统上,使用中端硬件(具体信息在此)与基于内存的状态机,在16字节的荷载下,Dragonboat可持续每秒900万次写或在9:1的高读写比场景下提供每秒1100万次的混合读写操作。高吞吐在跨地域分布环境依旧被保持,在使用更多的clients的情况下,在RTT为30ms时依旧能实现200万次每秒的IO操作。 throughput

每个服务器上可轻易承载数千Raft组。并发的活跃Raft组数量对吞吐有直接影响,而大量的闲置Raft组对系统性能并无巨大影响。 nodes

下表是毫秒为单位的写延迟数据。Dragonboat可以在处理每秒800万次写(16字节荷载)的时候做到P99的写延迟小于5ms。读延迟低于写延迟,因为用于linearizable读的ReadIndex协议无需对每个读请求做落盘写。

每秒请求数 荷载大小 99.9% percentile 99% percentile 平均
100万 16 2.24 1.19 0.79
100万 128 11.11 1.37 0.92
100万 1024 71.61 25.91 3.75
500万 16 4.64 1.95 1.16
500万 128 36.61 6.55 1.96
800万 16 12.01 4.65 2.13

当测试单组性能时,Dragonboat可以在16字节负载下持续每秒完成125万次写,此时平均写延迟是1.3毫秒,P99写延迟为2.6毫秒。上述性能是在平均单机占用三个2.8Ghz的核心的情况下实现的。

即使在很高的系统负载下,Go 1.11的GC所带来的Stop-the-World停顿也显著低于1毫秒。在Go 1.12版中,GC的Stop-the-World停顿时间又进一步大幅减低。Golang的runtime.ReadMemStats显示即使在很高的系统负载下,GC也仅占用了少于1%的可利用CPU时间。 stw

系统需求

  • x86_64 Linux或MacOS, Go 1.13或1.12,支持C++11的近期版本GCC或Clang
  • RocksDB 5.13.4或更新的版本

开始使用

Master是用于开发的非稳定branch。生产环境请使用已发布版本。

首先请确保Go 1.12或者更新的版本已被安装以获得Go module支持。

请首先选择使用RocksDB还是LevelDB来存储Raft日志数据,建议使用RocksDB。

安装RocksDB

如果RocksDB 5.13.4或者更新版本尚未安装,可按下列步骤安装。首先下载Dragonboat库至$HOME/src并将RocksDB安装到/usr/local/lib和/usr/local/include位置:

$ cd $HOME/src
$ git clone https://github.com/lni/dragonboat
$ cd $HOME/src/dragonboat
$ make install-rocksdb-ull

运行下列命令检查安装是否正确:

$ cd $HOME/src/dragonboat
$ GO111MODULE=on make dragonboat-test

请注意,如果RocksDB事先已经安装,上述步骤可直接跳过。如果您仅希望使用dragonboat库,至此可以安全的删除$HOME/src/dragonboat目录了。

使用Dragonboat

在您的应用中使用dragonboat库,请确保在Go程序代码中import __github.com/lni/dragonboat/v3__这个包,同时把"github.com/lni/dragonboat/v3 v3.1.3"添加到您的Go应用的go.mod文件的__require__部分。

编译您的应用的时候,如有需要,可将RocksDB安装位置告知Go:

CGO_CFLAGS="-I/path/to/rocksdb/include" CGO_LDFLAGS="-L/path/to/rocksdb/lib -lrocksdb" go build -v pkgname

具体使用可可参考示例

LevelDB

使用LevelDB无额外安装步骤。在应用中使用基于LevelDB的Raft log storage,需将您的config.NodeHostConfig的LogDBFactory项设为leveldb.NewLogDB这一在github.com/lni/dragonboat/plugin/leveldb包中提供的factory函数。

编译应用时可用如下方法避免对RocksDB库的依赖:

go build -v -tags="dragonboat_no_rocksdb" pkgname

文档与资料

首先建议您阅读项目的综述文档运维注意事项

欢迎阅读godoc文档中文例程常见问题CHANGELOG和在线讨论组

C++ binding的信息可参考这里

中文例程

中文例程在这里

项目状态

Dragonboat适用于生产环境。

参与

报告bugs, 请提交一个issue。参与贡献改进及新功能, 请提交pull request并创建一个issue以便讨论与进度追踪。

开源许可协议

本项目以Apache License Version 2.0授权开源,请参考LICENSE文件。

本项目所使用的第三方代码与它们的开源许可证信息的列表在此