当前位置:首页 > 娱乐

dragonboat 开源一个千万级多组Raft库-Dragonboat

介绍一下DraGonboat,开源go实现的多组Raft库。该项目已在Apache2协议下开放。欢迎大家尝试一下,请点明星鼓励:https://github.com/lni/dragonboat

一般来说,这是一个分布式共识协议库,应用程序可以使用它在多台机器上存储数据。只要有一半以上的机器在线,数据和服务都可以在线。这避免了由于单个机器崩溃或网络故障导致的数据和服务不可用,并提高了系统可用性。它提供了一个强大的一致性特性叫做线性化:多个副本的数据从外部看起来更像一个单一的副本,在只提供最终一致性的系统中读取旧版本数据并不存在常见的困难问题。

基于Raft协议的共识库已经被应用到许多互联网后台系统中。在联系了许多用户之后,通用反馈的当前应用障碍是缺乏可靠的、高性能的现成通用实现,该实现对共识协议本身几乎完全透明。

优势

龙船很好地解决了上述所有应用障碍:

测试最完备的开源Raft库之一,所有的实现代码、测试工具、测试结果均已开源。吞吐性能最好的开源Raft库,千万级每秒实现,平均单核即达每秒40万次以上写吞吐。功能最完备的开源Raft库,不做特殊应用假设限制,安全可靠前提下最大程度确保通用性。

同时,龙船的Go实现也经过了大量具体的性能优化打磨。在行业对高性能Go系统需求持续飙升的背景下,为准备入坑的同学们踩坑带路提供参考。

功能和用途

龙船实现了Raft论文中提到的几乎所有功能,是目前Raft协议最完整的Go实现:

选主与复制快照基于ReadIndex协议的高性能强一致读主节点转移无投票权节点节点静默Quorum自查对应用透明的幂等更新支持全异步的执行与快照操作

龙船用起来很方便。与etcd Raft库不同,Dragonboat不要求用户参与任何与Raft协议状态相关的操作,从而将Raft的使用成本和人为错误概率降到最低。用户首先实现一个IStateMachine接口来描述更新和查询请求的执行方法。在这个接口中只需要实现四种方法,用于更新和查询状态机,以及创建和恢复状态机的快照。实际的项目经验发现,内存中一个简单的键值数据库可以通过它的状态机在几分钟内原型化。

有了上面提到的IStateMachine实例,可以根据应用需求,使用Dragonboat的应用API接口进行各种请求。系统将严格按照Raft协议规定的要求处理每个用户的请求,最后提交给用户的IStateMachine实例,完成状态更新和查询执行。

Dragonboat自带的详细中文例程,可以让用户在十分钟内了解整个使用过程,近距离观察共识协议给系统带来的容错容错容错特性,体验发起提案、强一致读取、Raft组成员变更、节点重启等系统功能。

设计和实施概述

龙船的核心组件是分布在网络每台服务器上的节点主机。通常,每台服务器都有一个NodeHost实例,用于分配和使用计算、存储和通信资源,并管理服务器上运行的不同Raft组的成员节点。

同时,NodeHost提供了一个facade接口,提供所有支持的服务,用户可以使用其API完成所有支持的功能,如发起读写或成员变更请求、启动或停止一个成员节点、请求主节点转移或查询当前组成员等。请使用上一段提供的例程链接来了解更多关于NodeHost的使用。

每个Raft成员节点包含以下实例:

Raft协议状态Raft组成员应用IStateMachine用于支持幂等更新的Session状态

应用程序IStateMachine由用户提供和实现,其余由系统实现,对用户完全透明。

为了原生支持大量的Raft组,各种批处理和流水线优化方法在每一个细节上都被精心实现,比如驱动每个Raft组更新和执行的执行引擎就是最好的例子。以propose为例,如下图所示,每个Raft组被分配给不同的执行分片以提供并行性,每个分片是一个多级流水线。不同属性的处理(IO密集型、内存访问密集型等。)是在流水线的不同阶段之间并发完成的,充分利用了并发的优势,使得消息传输、更新执行等所有操作都是异步的。

Dragonboat的Log存储组件叫做LogDB,默认使用RocksDB,但是可以很容易地被其他键值存储方案替代。默认RocksDB仅适应350行Go代码。节点主机之间的消息传输由一个叫做Raft RPC的组件完成。该系统提供了两种默认的实现方式,TCP和gRPC,它们都支持相互TLS,并且可以很容易地适应其他传输方案。

测试和正确性检查

龙船经过了严格的测试。比起用宣传口号来夸软件的可靠性,以下具体数字和事实相信更有说服力:

每晚千万次规模,历时一年多共百亿次规模的随机行为组合下的节点重启与网络partition恢复测试,发现并纠正了诸多包括etcd亦存在的Raft实现错误数万行全手写高覆盖测试代码,Raft协议核心3000行代码便有高达万行测试代码护航移植并通过了所有etcd raft相关测试代码,覆盖etcd累积的各类可能的小概率意外情况系统的测试方法:单元与集成测试,Jepsen测试,fuzz随机输入测试,随机组合行为测试,I/O错误注入测试,文件系统掉电测试全面的检查:linearizability检查,应用状态机状态一致、Raft组成员一致、Raft组可用、磁盘上Raft Log Entry一致

在随机行为组合测试中,保存了一些Raft组的I/O历史数据,可以通过Jepsen的敲门工具检查系统的可线性化性,这些数据也是开源的。

技术性能分析

在22核、2.8GHz的三组服务器中,对于16字节的负载,当使用48个Raft组时,Dragonboat可以继续每秒写入900万次,或者可以在9:1的高读写比场景下继续每秒执行1100万次混合读写操作。在跨区域高延迟场景中,仍然保持高吞吐量。

增加活动组的数量会因为批处理的难度而直接降低吞吐量,但吞吐量始终在百万量级。大量空空闲组不会显著影响吞吐量。

下表显示了龙船的写延迟数据。在每秒800万次16字节写入的情况下,P99写入延迟仍然小于5毫秒。由于ReadIndex协议不需要写入磁盘的特点,读取延迟通常明显小于写入延迟。

Go的GC具有所有主流语言中最低的STW暂停,这对于延迟和延迟分散敏感的场景非常重要。在每秒数千万次请求的压力下,STW暂停了400微秒。在Go 1.12中,这种延迟将继续减半。下图显示了120个连续气相色谱循环中所有STW的暂停持续时间,在此测试场景中平均每秒3个气相色谱循环。

Dragonboat针对多个Raft组进行了优化,但单个Raft组的性能没有优化。在当前版本中,在单个Raft组的情况下,16字节的写入每秒可以持续125万次,平均延迟为1.3毫秒,P99延迟为2.6毫秒。三组服务器占用九个2.8GHz CPU内核,每台服务器平均占用三个2.8GHz CPU内核。

{!-PGC _列- }

版权属于作者

原文:https://my.oschina.net/u/4062427/blog/3001821

1.《dragonboat 开源一个千万级多组Raft库-Dragonboat》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《dragonboat 开源一个千万级多组Raft库-Dragonboat》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/yule/687390.html

上一篇

杨淮进个人资料简介 杨淮进人物简历

下一篇

杨淮震个人资料简介 杨淮震人物简历

双膝过肩 手腕线过裆、双膝过肩……美腿测试你达标几个?

  • 双膝过肩 手腕线过裆、双膝过肩……美腿测试你达标几个?
  • 双膝过肩 手腕线过裆、双膝过肩……美腿测试你达标几个?
  • 双膝过肩 手腕线过裆、双膝过肩……美腿测试你达标几个?

阳光型抑郁症测试 你知道什么是阳光型抑郁症吗?赶紧来测试一下

  • 阳光型抑郁症测试 你知道什么是阳光型抑郁症吗?赶紧来测试一下
  • 阳光型抑郁症测试 你知道什么是阳光型抑郁症吗?赶紧来测试一下
  • 阳光型抑郁症测试 你知道什么是阳光型抑郁症吗?赶紧来测试一下

阳光型抑郁症 你知道什么是阳光型抑郁症吗?赶紧来测试一下

  • 阳光型抑郁症 你知道什么是阳光型抑郁症吗?赶紧来测试一下
  • 阳光型抑郁症 你知道什么是阳光型抑郁症吗?赶紧来测试一下
  • 阳光型抑郁症 你知道什么是阳光型抑郁症吗?赶紧来测试一下

疲劳试验 疲劳试验可靠性测试

疲劳试验是一种可靠性试验,它利用橡胶、塑料样品或模拟零件在各种环境下测试其疲劳性能准则,研究其断裂过程的试验。 耐力 测试应力(应变)和寿命(循环次数):高循环疲劳和低循环疲劳 室温疲劳、低...

反应力测试 测试 | 测测你的大脑反应能力

戴尔xps 再次定义“最强”,戴尔XPS13 9380测试与体验

  • 戴尔xps 再次定义“最强”,戴尔XPS13 9380测试与体验
  • 戴尔xps 再次定义“最强”,戴尔XPS13 9380测试与体验
  • 戴尔xps 再次定义“最强”,戴尔XPS13 9380测试与体验
中国资本已别无出路 中欧协议到特斯拉屠刀 中国资本已别无出路

中国资本已别无出路 中欧协议到特斯拉屠刀 中国资本已别无出路

从5个角度谈中欧投资协议,这次不谈国际形势,从我们身边说起。辛苦多年,为啥培养了地主家的傻儿子2020年的最后两天,中欧投资协议谈判确定;2021年的头两天,特斯拉挥舞价格屠刀,狂降16万,将产品性价比彻底释放,官网几乎被挤崩。这两件事情放一起很有意思,不知道为什么我想起一个有趣的词:借师助剿。当然,我这里说的借师助剿是打个比方,是带有正面和积极意义的。因为有时候,愚蠢和贪婪的资本,对他们各种保护...

青少年人工智能技术水平测试 青少年人工智能技术水平测试一级等级考试介绍

  • 青少年人工智能技术水平测试 青少年人工智能技术水平测试一级等级考试介绍
  • 青少年人工智能技术水平测试 青少年人工智能技术水平测试一级等级考试介绍
  • 青少年人工智能技术水平测试 青少年人工智能技术水平测试一级等级考试介绍