前言
在Ozone目前数据写出的过程,是基于从对象文件的block,再从block到chunk粒度进行数据的写出的。每次Ozone写完一个chunk后,对应着会触发一次write chunk的RPC call。当我们写入的数据文件对象很大的时候,过程中将会涉及到很多次write chunk PRC的操作调用。这个RPC call的频繁调用意味着相应更多的transaction的发生。对于Ozone Datanode里使用Raft协议做数据一致性同步过程的影响而言,则意味着更多的raft log需要被apply以及对应Ratis snapshot的take操作也会变得更加频繁。在一定程度上,这会影响到Datanode节点本身的数据写出操作。最近社区提出了利用Ratis Streaming的特性来优化Ozone数据写出的流程。本文笔者来简单聊聊Ozone Streaming这种全新方式的数据写出过程,目前此功能处于有一个初步的设计方案阶段。
Ozone Streaming的实现背景:Ratis Streaming
首先我们来聊聊Ozone Streaming的一个大的背景,Ozone Streaming想法的提出源自于Ratis Streaming特性。Ratis Streaming,顾名思义,指的是能用流的方式将数据写出去而不是通过传统RPC模式,将数据一点一点写出去。
在Ratis Streaming功能中,除了其能够减少数据写过程中的RPC数,还有另外一个改进是它使用了netty作为底层流原理的实现,能够做到数据传输过程中的的zero buffer copy的功效。同时在streaming方式的数据写出过程里,写出操作是在一个流里进行的,因此不会涉及到频繁的流关闭操