Dragonboat 是一个高性能 Go 实现的多组 Raft 共识算法库,同时提供 C++11 支持。Dragonboat 是目前 github.com 上速度最快的 Raft 开源实现。

Go Module 支持

Go 发布的上一个版本中,对 Go module 的初步支持是默认关闭的,这暗示了它尚遗留着很多实现的问题。事实上,当时 replace 的支持连 module、package、import path 这三个最基本概念都是含混的。

而在 Go 1.12 中,这些问题都得到了解决,Go module 的正式发布又关闭了一条无脑喷 Go 的路径,真正的 Go 用户可以更安心方便地使用 Go。

以 Dragonboat 为例,对于普通用户,如下所示的两行 go.mod 就完整定义了 Dragonboat 库的依赖情况。

modulegithub.com/lni/dragonboat

requiregithub.com/golang/protobuf v1.2.0

Dragopnboat 所用的 Monkey Test 需要 Drummer 包,它的额外依赖中含有 golang.org 下的数个包。我们需要用位于 github.com 上的官方镜像来代替它们。

Go module 的 replace 支持可以通过在 go.mod 文件中增加下列替换条目,将受影响的 import path 进行替换。示例如下:

replace(

golang.org/x/build=> github.com/golang/buildv0.0.0-20190215225244-0261b66eb045

golang.org/x/text=> github.com/golang/textv0.3.0

)

更低的 STW 延迟

Go 1.12 的 STW 停顿较 1.11 版本又有明显的缩短。

下图是 Dragonboat 在每秒处理超过800万次16字节的 proposals 时由 runtime.ReadMemStats 报告的120个连续 GC 周期的 STW 停顿值,1.12 与 1.11 对比,STW 明显下降,由350微秒降至250微秒左右。

对 Minimum Mutator Utilization 图的支持

Mutator Utilization 衡量的是 GC 耗费的资源外,应用究竟获得了多少 CPU 资源。Minimum Mutator Utilization 图则是在不同的时间窗口上呈现应用至少可以获得多少 CPU 资源。

Go 1.12 的 trace 工具加入了 Minimum Mutator Utilization 图的支持,它可以极其方便地发现 GC 性能受限的情况。

下图是 Dragonboat 在处理16字节的 proposals 时的 Minimum Mutator Utilization 图。从图上可见,在时间窗口小于250微秒的时候,应用最坏情况下得不到任何 CPU,这是因为 STW 的长度基本就是250微秒。而当时间窗口不断放大,Minimum Mutator Utilization 快速上升并趋向于 100%,最后基本稳定于 98% 左右。

这表示从整个 trace 的执行周期看(最大时间窗口),最坏情况下应用可以保证得到 98% 的 CPU 时间。可见,本例没有任何针对 GC 进行优化的价值了。

Dragonboat 在处理1024字节的 proposals 时的 Minimum Mutator Utilization 图则展现了另外一个局面。

在1.3毫秒内,应用最坏情况可以获得的 CPU 资源都是 0,暗示此时 STW 比16字节时高一个数量级。而随着时间窗口的扩大,Minimum Mutator Utilization 逐渐逼近并稳定于 90% 左右,从整个 trace 的执行周期看,最坏情况下应用可以保证得到 90% 的 CPU 时间。

更高的 STW、更多的 GC 所占用的 CPU 资源都清楚显示,在此场景下继续做内存使用的优化是一定预期收益的,而且 Minimum Mutator Utilization 相当直观方便。

初步的 TLS 1.3 支持

Go 1.12 较为及时地提供了初步的 TLS 1.3 支持。

TLS 1.3 淘汰了 DES、MD5、RC4、SHA1 之类的博物馆级别的老旧且有明确安全隐患的算法,支持通过一个 RTT 完成所需准备并建立安全链接。

根据 Go 1.12 内建的 TLS 1.3 性能跑分来看,TLS 1.3 的跑分性能和 1.2 差别不大,未来也还有一定优化空间。有兴趣的可以在自己的目标服务器上测试跑分性能:

go test-v crypto/tls -run=$^ -bench BenchmarkThroughput

TLS 1.3 的 0-RTT 特性尚未提供支持,关于该功能本身的安全隐患的讨论,与 Go 这种通用语言的标准库实现并无太大关系,这里不展开。

其它各项改进

与 Dragonboat 这种高性能、分布式系统库相关的一些改进还有:

  • Timer 与 Deadline 的性能得到了优化,在 connection 上设置 deadline 的代价降低
  • 默认启用 TCP KeepAlive
  • OS 包开始提供 UserHomeDir 函数,不再需要使用第三方库进行跨平台支持
  • 在 macOS 上调用 File.Sync 并不能确保实际落盘的问题已解决

具体的改进和变更请查看 Go 1.12 文档↓↓↓https://golang.org/doc/go1.12

Go 1.12 下载地址 https://golang.org/dl/

最后,感谢阅读!

作者介绍

lni,GitHub 主页 https://github.com/lni。

欢迎关注由 lni 开源的高性能分布式共识库 Dragonboat。

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

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

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

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

Dragonboat GitHub 地址:https://github.com/lni/dragonboat

也可以通过码云极速下载 https://gitee.com/mirrors/Dragonboat 获取返回搜狐,查看更多