sheepdog 与QEMU:
Raw格式,不仅可以实现存储(性能更高),也可以实现快照、克隆、精简配置这些功能;
QCOW格式提供更多的功能,比如加密和压缩,sheep本身不支持这些功能,代价是相比raw性能低一些;
协议层实现的另一个优势,可以通过'-cdrom sheepdog:volume' 这个命令,来直接存储ISO在sheepdog中,并使用它。
format | snapshot/clone | thin-provsion | DISCARD | encryption | compression |
raw over file | N | Y | N | N | N |
raw over sheepdog | Y | Y | Y | N | N |
qcow2 over sheepdog | Y | Y | Y | Y | Y |
对象缓存:
Sheepdog默认情况下是没有开启对象缓存的。在本地节点可以使用“-w”来开启对象缓存。“-w”的例子如下:
sheep -w size=200G # 开启空间大小为200G的对象缓存
sheep -w size=50G,directio # 开启空间为50G且使用O_DIRECT方式的对象缓存
用户希望使用更快的磁盘和对象缓存来加速IO性能,您还可以指定对象缓存目录所在地,如下:
sheep -w size=200G,dir=/path/to/cache # 开启200G的空间,并且存储到/path/to/cache目录中
工作原理:
1. 以本地文件作为QEMU块设备的后端
QEMU 《----》 VM ^ | writeback/readahead pages V | POSIX file 《 --- 》 page cache 《 --- 》 disk | kernel does page wb/ra and reclaim
2. 以sheepdog的对象存储为后端
QEMU 《-----》VM ^ | push/pull objects V | Sheepdog device 《----》 object cache 《---》 Sheepdog replicated object storage. | Sheep daemon does object push/pull and reclaim
对象是在硬盘上以固定的大小文件的形式实现的,所以对对象缓存,这些对象都是在运行着sheep守护进程的节点上固定大小的文件,sheep在他们身上直接读写。在这个意义上, 除了节点上那些对象的元数据 (inode和dentry)以外,我们不消耗内存。
DISCARD支持
Discard命令允许操作系统通知底层的存储器,哪些数据块不在被视为"使用中"状态,并可以擦除;这是精简配置机制的一种方式,并且用于SSD和VM;
VM中启用discard:
环境要求: QEMU>=1.5 , vanilla kernel >= 3.4 or RHEL-based kernel >= 6.3, Sheepdog latest from git repo.
对QEMU设备来说,各种IDE和scsi支持discard支持,virtio-blk 不支持。默认Discard是关闭的。需要通过下面方式来支持
1 # for virtio-scsi device backed by sheepdog volume named 'data' 2 3 $ qemu-system-x86_64 -drive if=none,id=disk,file=sheepdog:data,cache=writeback,discard=on -device scsi-hd,drive=disk
日志
该机制旨在帮助磁盘数据崩溃后仍能保证一致性,并提高写入性能。Sheepdog日志仅是顺序方式记录所有的IO操作,该日志是在向vdi写入数据前发生的,记录在node上的
如果我们用一个专门设备来托管日志,性能会获得更大提升,因为我们按照顺序记录写入,此时我们将随机写入转变成顺序写入,在HDD盘上会更快。
因为提前记入写入操作,我们以后端写入的方式安全的放弃O_DSYNC(可以SAS磁盘上提高80倍性能)
size是必要的参数:
1 $ sheep -j dir=/path/to/dir,size=256M, # enable external journaling with the size 256M 2 $ sheep -j dir=/path/to/dir,size=256M,skip # like above, but skip recovery at startup 3 $ sheep -j size=512M # enable internal journaling with the size 512M
MD管理
MD能自动处理很多场景,支持不同尺寸的磁盘,当磁盘故障(新添加磁盘)时也能满足VM 的IO请求,即使多个磁盘同时故障,新磁盘插入故障. MD处理对VM是透明的,当所有磁盘损坏后,sheep仅充当网关作用: