目前使用的分布式块存储系统(ceph)存在的问题已经不能适应对性能、延迟、成本和稳定性的需求,主要体现在:
fastblock是为解决性能和延迟问题而生的,它的特点是:
fastblock的架构跟ceph非常类似,且monitor、osd、pg等众多概念都跟ceph一样以便于快速理解,架构如下图所示:
其中:
monitor服务负责维护存储节点状态和节点加入删除、存储卷的元数据、维护集群的拓扑结构、响应用户创建pool等操作、根据当前的拓扑结构在osd上均匀创建raft group等。monitor作为集群管理工具,并不需要存储数据,也不需要追求极致性能,所以使用golang进行实现, monitor使用etcd进行多副本存储。
monitor集群是一致性的重要保证,因为客户端、osd看到的都是相同的视图。对于所有客户端的io操作都只能看到pg这一层,而osd和客户端都会在启动时开启一个定时器定时去向monitor获取osdmap和pgmap信息,所以所有的osd和客户端都能够看到相同的pg状态变化并作出相同的响应,针对特定pg的写入操作也不会写到错误的地方。
详情可参考monitor简介
rpc子系统是连接各模块的重要系统,出于异构网络的要求,rpc子系统的实现了两种方式,即基于socket(Control rpc)的和基于rdma(Data Rpc和Raft Rpc)的,基于socket的就是经典的linux socket应用场景,而基于rdma的rpc则是使用异步rdma(即rdma write)语义实现的。
上图是fastblock中各个模块之间的联系,由图中可以看出使用了三种类型的rpc,分别为Control Rpc、Data Rpc和Raft Rpc:
Control rpc: 用于在客户端与monitor之间,osd与monitor之间传递osdmap、pgmap和image信息等数据,这些数据量不大,频率不高,因此可以使用基于socket的实现;
Data rpc:用于在客户端与osd之间传输对象数据操作和结果,这些数据量比较大,频率会很高,因此需要基于rdma的方法;
Raft rpc: 用于在osd之间传输raft rpc协议内容,里面会保护对象数据,这些数据量比较大,频率会很高,因此需要基于rdma的方法。
Data rpc和Raft rpc使用protobuf的RPC框架,网络交互部分代码使用RDMA,rpc传输数据的序列号都使用protobuf。
raft通过选举一个领导人,然后给予他全部的管理复制日志的责任来实现一致性。领导人从客户端接收日志条目(log entries),把日志条目复制到其他服务器上,并告诉其他的服务器什么时候可以安全地将日志条目应用到他们的状态机中。 raft在已经有很多开源实现,我们参考willemt的C语言raft实现,并额外实现了multi-raft,这个模块主要包括了:
实现multi-group raft,意味着有多个raft并存,每个raft的leader需要给它的follower发送心跳包,因此就会有多个心跳包,如果raft过多就会导致心跳包过多,占用大量的带宽和cpu资源。解决方法也很简单,每个osd可能属于多个raft,因此可以对相同leader、相同flower的raft进行心跳的合并,这样就可以减少心跳包数量。如下图所示,有两个pg(raft)分别为pg1和pg2,pg1和pg2中都包含osd1、osd2和osd3,osd1是leader,osd1需要给osd2和osd3分别发送heartbeat (pg1),pg2中osd1需要给osd2和osd3分别发送heartbeat (pg2)。心跳合并后,只需要osd1给osd2和osd3分别发送heartbeat (pg1, pg2)。
kv子系统用于存储raft的元数据、存储系统本身的数据,由于数据量不大,就自己设计了一套。因为数据量不大,内存中的hash map就可以存储所有数据,提供put、remove和get接口,每隔10ms把hash map中修改的数据写到磁盘中。
本地存储基于spdk blobstrore进行存储,包含3个存储功能模块:
客户端用于创建、修改和删除image,把用户对image的数据操作转换为对object(osd处理的基本数据单元)的操作,然后封装为Data Rpc消息发送给pg的 leader osd,并接收处理 leader osd返回的响应,结果返回给用户。 客户端有多种模式:使用spdk vhost提供给虚拟机使用;使用NBD提供给裸金属使用;使用CSI提供给虚拟机使用。这三种模式最终都会调用libfastblock库进行image到object的转换,并和osd通信。 下面主要介绍使用spdk vhost提供给虚拟机使用的模式:
调用spdk库创建一个vhost app,spdk资源初始化后,需要开启一个定时器去向monitor获取osdmap、pgmap和image信息。
使用spdk的rpc.py脚本向vhost app发送创建bdev(bdev_fastblock_create)的请求,vhost app收到请求后创建image,把image信息发送给monitor,创建bdev设备,然后注册此设备的操作接口(此接口会调用libfastblock库)。
使用spdk的rpc.py脚本向vhost app发送创建bdev的vhost-blk controller(vhost_create_blk_controller)的请求,vhost app收到请求后打开bdev设备,注册一个vhost驱动去处理vhost消息(创建一个可供客户端(如qemu)连接的socket,并遵循vhost协议实现连接服务,这是DPDK中已实现的功能)。
libfastblock把用户对image的数据操作转换为对object(osd处理的基本数据单元)的操作,然后封装为Data Rpc消息发送给pg的 leader osd,并接收处理 leader osd返回的响应。
fastblock代码主要位于src、monitor和msg目录中:
./install-deps.sh
首次编译时,需要获取spdk和abseil-cpp等依赖,可通过运行以下命令分别编译Release版本的montior和osd:
./build.sh -t Release -c monitor
./build.sh -t Release -c osd
编译完成后,fastblock-mon
和fastblock-client
二进制位于mon/
目录下,而fastblock-osd
和fastblock-vhost
二进制位于build/src/osd/
目录和build/src/bdev
目录下。
后续osd、vhost有代码改动,则可仅在build/
目录下编译,而monitor有改动则可仅在mon/
目录下make
即可。
最简测试开发环境搭建可参考测试开发环境搭建
参考部署及测试报告, 在我们的测试环境中,在每个osd仅适用一个核的情况下,获得了4k随机写单线程100us以下的延迟以及并发41万iops的性能。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型