Ozone如何利用Multi-Raft优化写入吞吐量+ 查看更多
Ozone如何利用Multi-Raft优化写入吞吐量
+ 查看更多
Ozone的数据写入模式

关于吞吐量的优化探索


在前台持续并发写入的过程中,在全部12块磁盘中,只有5块数据盘有负载,并且集中于其中的3块磁盘。通过日志挖掘和数据统计也观察到,有IO阻塞的现象,数据节点上RaftLog写入磁盘的时候很有可能有排队的现象。于是我们将思路放在了提高数据节点磁盘使用率和缓解Ratis持久化RaftLog排队现象上。
在社区版本的HDFS上也有DataNode IO吞吐量不高的现象,之前有一些落地的方案会改动Linux操作文件系统的方式,增加一些类似Cache的手段帮助增大DataNode通过操作系统写入磁盘的吞吐量。而Ozone这部分优化的思路放在了通过数据Pipeline的节点复用来加大每个节点上Pipeline的使用量,从而通过增加使用者的方式变相增大磁盘使用率。
Multi-Raft的设计思路
如果每一个DataNode,受到了Single-Raft的制约,只能参加一个数据Pipeline的写入,那么上面的磁盘使用率观察可以看到Ratis实现的RaftLog并不能将写入IO均匀的分配到每一个磁盘路径上。
在于Ratis社区讨论后,我们提出了了Multi-Raft的方案,即允许数据节点参与多个数据Pipeline的工作,同时,Multi-Raft也需要通过新的Pipeline分配算法保证数据隔离,考虑数据locality和节点的rack awareness。

SCM能在集群不变大的情况下分配出更多的数据Pipeline。假设配置每个节点最多可以承接M个数据Pipeline的写入,在有N个数据节点的情况下,Single-Raft下SCM最多可以分配N/3个Pipeline,而Multi-Raft下就可以配置M(M*N)/3个Pipeline。 由于三副本备份的原因,数据Pipeline必须有刚好3个数据节点加入才能创建成功,Multi-Raft可以合理利用每一个数据节点的能力参与Pipeline。如图示,在有4个数据节点的时候,Single-Raft的集群只能创建出1个数据Pipeline,而剩下的1个数据节点(4-3*1)只能作为StandBy备用,在开启Multi-Raft功能后,4个节点都可以参加数据Pipeline的分配,大大提高了集群配置的灵活度。 从Single-Raft的磁盘使用率能看到,一个数据Pipeline使用的RaftLog并不能充分将数据写入很好的load balance,在与Ratis社区协作之后,Multi-Raft的方案可以有效利用节点上服务多个数据Pipeline的磁盘,从原来的一个RaftLog使用12个磁盘,变为多个RaftLog使用12个磁盘。对于Ratis的Batch写入和排队机制来说,一次写入可能会Hold某个磁盘一段时间,于是后面排队的写入由于RaftLog个数的限制,会造成一定程度的排队,这也是我们在Single-Raft的集群看到有超过27%的写入需要花费2-3秒,多个RaftLog的存在会很好减少排队的拥挤程度,因为“队伍”变多了。
Multi-Raft 优化后的写性能表现

对比Single-Raft的集群:



总结
分享到: