Client捕获用户写IO
时间:2022-04-30 15:36:01 | 来源:行业动态
时间:2022-04-30 15:36:01 来源:行业动态
方舟备份存储集群独立于UDisk存储集群,是我们重要的设计前提,这保证了即使出现了UDisk集群遭遇故障而导致数据丢失的极端事件,用户仍能从备份存储集群中恢复数据。对此,我们实现了一个ark plug-in,集成到了UDisk的client中,这个plug-in会异步的捕获UDisk的写IO,并将其推送到方舟备份存储集群。
如何高效的捕获UDisk IO是个重要的问题,我们希望对UDisk的IO路径影响到最低。对于SSD UDisk client和RSSD UDisk client,IO的捕获模式是完全不同的。
对于SSD UDisk,Bdev线程在接受一个IO后,先提交到UDisk的IO线程中,如果是写IO还需要推送至方舟备份存储集群。对此Bdev线程会构建一个ArkIORequest,拷贝一份包含data的智能指针对象,加入到无锁队列中。ArkHandle线程从无锁队列中获取IO,转发给ArkIO线程进行推送。UDisk IO完成后,无需等待方舟IO完成即可返回成功。UDisk IO和方舟IO均完成后,data才会被释放。
对于RSSD UDisk,由于采用SPDK Vhost方案,Vhost和guest VM共享内存,UDisk IO完成后,data内存空间会立即被guest VM使用。为此我们加入了一个copy线程,由copy线程从无锁队列中获取bdev_io,进行数据copy,数据copy完毕后再构建一个ArkIORequest转发给ArkIO线程进行推送,方舟IO完成后data由方舟plug-in中的ArkHandle进行释放。
我们模拟了各种类型的IO场景,研究方舟plug-in对UDisk性能的影响。发现在低io_depth的场景下,方舟功能对于UDisk性能的影响最大不会超过5%,在高io_depth的场景下,方舟功能对于UDisk性能的影响接近0%。可见方舟plug-in实现了高效的数据捕获与转发,不会影响用户的线上业务。
块层IO可以理解为一个三元组(sector, sector_num, data),代表读写位置、读写大小和实际数据。对于CDP系统,IO的三元组信息是不够的,需要标记额外信息,才能够恢复到任何一个时间点。在数据捕获时,所有的写IO都会标记好序列号(seq_num),序列号保证严格连续递增,这是我们保证块级数据一致性的基础。并且所有的写IO也会打上时间戳,方舟plug-in会保证即使在出现时钟跳变的情况下,时间戳也不会出现回退。这样数据变化及其时间戳都被保存下来,后端可以根据这些信息通过某种方式回放,恢复到过去的任意时刻,这就是CDP技术的基本原理。在推送到方舟备份存储集群前,方舟plug-in会对IO进行合并,这可以显着减少方舟接入层的IOPS。