牧羊犬


Sheepdog是可扩展的系统,可为虚拟机提供分布式块设备。 它的开发于2009年由日本公司Nippon Telegraph and Telephone Corporation的开发人员开始。 Sheepdog是GPL2许可下的开源应用程序。 2015年11月发布的最新版本0.9.3将成为1.0版本的遗留物,适用于商业用途1 (已经变成-大约。)


为了引起人们的兴趣,开发人员于2010年8月发布了第一个版本(0.1.0)-同时,主要QEMU开发分支中立即包含了对dogdog的支持。
我在2011年11月对牧羊犬进行的首次测试2 并且结果对于I / O操作是好的。 但是,然后, 牧羊犬系统在恢复跌落节点方面仍然存在问题。 这个问题可能很快就解决了,因为应用程序开发非常活跃,但是那时我使用了另一个解决方案。

可能性


牧羊犬的工作原理在已发表的演讲中得到了很好的描述,因此,我将仅作简要概述。


可扩展
群集大小可以在节点级别任意增加,可以在操作期间增加数据的容量和空间,也可以通过增加节点数量来增加。 节点越多,VDI I / O的性能就越高。


他很简单
与CEPH等其他系统不同, Sheepdog不能直接与文件系统一起使用,而是以固定大小的块进行操作,因此,它不需要单独的守护程序来提供元数据。 所有控制都是使用与直接通讯的单个工具执行的
(ceph还使用对象-大约每个。)


计算下降的节点
每个VDI包含这些块(对象),这些块同时复制到几个节点,因此,如果其中一个掉落,则数据仍然可用,并且掉落的节点中的对象开始复制到另一个节点。


支持块设备快照
牧羊犬快照的工作原理与Btrfs相同。 附加的VDI块将保存,并将新数据写入新块。


在某些情况下,以下功能可能会出现问题:


牧羊犬不支持SPOF
如果VDI通过QEMU用作块设备,则在多个位置同时连接VDI时可能会出现问题。 SPOF 3可以防止这种情况。 牧羊犬没有。 但是,在新版本的Sheepdog中,可以阻止VDI,以便不允许多个连接。


数据对象的生命周期
仅当删除所有与它们关联的克隆和快照时,才能删除VDI对象。 这与Btrfs完全相同。 因此,删除未使用的快照可能不足以腾出存储空间。


通讯守护程序


与Ceph或GlusterFS相比,牧羊犬小得可笑。 这是因为他没有亲自解决所有问题,而是最大限度地利用了已经发挥作用的东西。


反过来,它提供了可以用作物理磁盘以及软件团队等的块设备。


它仅关心数据对象在其上运行的节点之间的分布。


但是,他需要通信守护程序提供的信息- 缺少Dogdog的关键组件。


通信守护程序 -不提供在节点之间交换数据的功能。 这就是绵羊恶魔在做什么。 绵羊只能通过它找出当前处于活动状态的节点。


同步


首先, Sheepdog假定节点将通过corosync相互通信。 它最多支持64个节点,尽管从理论上讲它应该能够提供更多服务,但它最适合于最多16个节点的小型集群。


通常, corosync也使用Pacemaker,因此无需安装其他任何东西。


在Debian上安装corosync


Corosync位于分发存储库中,其安装非常简单:


$ apt-get install corosync libcorosync-common4 

Corosync设置


动物园管理员


牧羊犬开发人员建议将Zookeeper用于较大的群集。 根据开发人员的说法,已构建并测试了具有1000个节点的Sheepdog测试存储4


在Debian上安装Zookeeper


 $ apt-get install zookeeper zookeeperd 

启动守护程序..


 $ /usr/share/zookeeper/bin/zkServer.sh start 

Zookeeper运行的默认端口为2181


在动物园管理员的支持下运行牧羊犬:


 $ sheep -c zookeeper:IP1:PORT1,IP2:PORT2,IP3:PORT3 ...other...option... 

zookeeper的好处是,在这种情况下, Sheepdog的节点配置更加清晰明了,但是存在一个问题,即Debian安装软件包不包含其支持。


因此,要获得具有Zookeeper支持的Sheepdog,您必须从源代码进行编译。 尽管我不能排除目前情况可能有所不同。
(zookeeper支持仍需要从源进行编译-大约每个。)


设置绵羊守护程序


当对象管理器Sheep守护程序启动时,该节点将成为Sheepdog的一部分。 它始终以两个副本工作:


  1. 该过程的第一个实例从网关开始,该网关从客户端(例如,从QEMU块设备的驱动程序)接收I / O请求,计算目标节点并在它们之间发送进一步处理的请求。 即,它建立许多网络连接。


  2. 另一个充当本地对象管理器( Object Manager

Sheep守护程序配置参数可以在运行时作为命令行参数传递。 如果没有,将使用默认值,请谨慎使用:


端口号
除非另有指定,否则绵羊守护程序将在端口7000上运行


保管箱路径
除非另有说明,否则shep目录使用/ var / lib / Sheepdog目录,并且VDI对象存储在其obj子目录中。


从理论上讲,没有什么能阻止多个实例在一个节点上工作-主要条件是每个人都使用自己的端口号和自己的存储。 节点的IP地址问题已基本解决。 在不同端口上运行的守护程序的每个运行实例将自动连接到现有集群!

重要信息是端口号是VDI容器配置的一部分。 您需要知道是否要将绵羊守护程序重新配置为在现有集群的另一个端口上运行。

因此,如果运行具有不同端口号但具有相同对象存储路径的守护程序实例,则可能会丢失现有VDI容器中的信息。

恶魔羊作为门户


在没有VDI对象存储空间的计算机上,可以通过-G标志以网关模式独占运行守护程序。


在这种情况下,分发VDI对象时,根本不会使用本地存储,并且数据将直接分发到其他节点。


绵羊恶魔作为对象管理者


第二个正在运行的实例充当本地对象管理器,从作为网关启动的实例接收I / O请求,并在本地对象存储( 对象存储 )中执行r / w操作


对象存储


默认情况下, Sheepdog中 VDI对象的存储为目录/var/lib/sheepdog/obj守护程序也将其用作其内部目录结构的一部分-这是默认的存储路径。


如果希望将VDI对象存储在其他位置,则可以在启动时将安装另一个块设备的路径作为参数传递。


 sheep ... /cesta_do_přípojného_bodu 

还有更多的传达方式。 新版本的Sheepdog支持所谓的多设备技术,该技术使您可以在必要时动态增加内存容量,而不必重新启动Sheepdog 。 增加存储容量的工作原理类似于Btrfs。


 sheep ... /cesta_do_A,/cesta_do_B,/cesta_do_C 

(指定的第一个目录仅用于元数据-大约每个)


也可以通过狗节点md添加(或删除)附加存储


...


当存储文件系统不“通过设计”支持此功能时(与Btrfs或ZFS不同),多设备提供的功能特别有用。 通常,选择用于存储对象,其属性,参数和设置的文件系统会严重影响虚拟机IO文件系统的性能。


多设备技术需要文件方面的高级属性,这对于btrfs 5这样的现代文件系统来说不是问题 或ext4。 但是一些较旧的文件系统,例如reiserfs或ext2 6 不支持他们。

如果要使用不支持扩展属性来存储对象的文件系统,则需要编译不具有多设备支持的Sheepdog

存储类型-普通还是树


格式化群集时,除其他选项外,您可以指定存储类型(后端存储)。 您可以将类型设置为plaintree 。 对于普通类型,目录结构将如下所示:


 | |- obj | |- <id > | | |-< > | | |-< > | | |-< > | | |- ... | |- <id  > | | ... |- config [] |- epoch | |- < > | |- < > | |- ... |- journal \- sheep.log [] 

obj目录中的所有VDI对象将被发送到一个子目录,该子目录的名称基于当前的时代标识符。 也就是说,对于每个时代,相应的VDI对象将被分开存储。 但是,在一个时代中,目录中可能会出现大量VDI对象,这随后会减慢对文件的访问。 因此,您可以选择第二个选项,即tree


 |- obj | |- aa | | |-< > | | |-< > | | |-< > | | |- ... | |- ab | | ... | |- meta | | |- < > | | |- ... | |- 0a | | ... |- config [] |- epoch | |- < > | |- < > | |- ... \- sheep.log [] 

在这种类型的存储中, Sheep守护程序在obj目录中创建一组256个子目录,名称为0a, ..., 99 ,然后根据VDI id的后两个字符分散对象,这不仅对于每个VDI容器都是唯一的,而且对于其快照或克隆。


VDI对象名称


Sheepdog将数据保存在VDI容器中时,文件将开始出现在obj数据存储中,每个文件都有其自己的名称,该名称由几个元素组成:


 ../obj/8f/00e8b18f00000005 ^^ 

前两个字符指示对象的类型。 数据对象以00...开头,元数据(可以存储在另一个目录中) 80...


 ../obj/8f/00e8b18f00000005 ^^^^^^ 

然后是VDI。 它不仅对于每个容器都是唯一的,而且对于其快照或克隆也是唯一的。


 ../obj/8f/00e8b18f00000005 ^^ ^^ 

存储类型的情况下,VDI标识符的最后两位数字指示对象所属的子目录所在的位置。


 ../obj/8f/00e8b18f00000005 ^^^^^^^^ 

VDI容器的标识符(以十六进制表示)后跟VDI容器中对象的序列号


时代


epoch子目录包含属于该时代的对象的二进制列表。 每当每个群集更改时(添加或删除节点时),时期数都会增加。 每个此类更改都会启动恢复过程,在此过程中,将在节点上检查本地对象的当前状态,然后增加了时代。


如何选择最佳的VDI对象存储


可用存储容量是根据节点上的可用空间计算的。 绵羊选择的空间始终取决于存储VDI对象的块设备中的可用空间。


VDI容器的大小只是一个虚拟形状,与VDI对象所占用的空间无关。 知道Sheepdog如何处理集群中的数据很重要:


牧羊犬总是试图在那个时代的所有机器之间平均存储数据。

这意味着,如果其中一个节点掉落,时代改变并且Sheepdog立即开始恢复过程,它将在其余节点上创建丢失的VDI对象以补偿损失。


添加新节点时也会出现类似情况。 牧羊犬将开始将VDI对象从新节点均匀地移动到其存储库中,以便使节点上数据空间的填充百分比尽可能地平衡。 使用以下命令可以总体了解当前节点上已使用了多少空间:


 nod1 ~ # collie node md info -A Id Size Used Avail Use% Path Node 0: 0 1.1 TB 391 GB 720 GB 35% /local/sheepdog-data/obj Node 1: 0 702 GB 394 GB 307 GB 56% /local/sheepdog-data/obj Node 2: 0 794 GB 430 GB 364 GB 54% /local/sheepdog-data/obj Node 3: 0 1.6 TB 376 GB 1.2 TB 22% /local/sheepdog-data/obj Node 4: 0 1.2 TB 401 GB 838 GB 32% /local/sheepdog-data/obj Node 5: 0 1.5 TB 370 GB 1.1 TB 24% /local/sheepdog-data/obj Node 6: 0 1.6 TB 388 GB 1.2 TB 23% /local/sheepdog-data/obj 

I / O性能


在这里必须要说的是, 牧羊犬的工作方式与Ceph不同,并且具有不同的优先级。


对于Ceph而言,放置数据对象,块设备的性能,主机连接性和响应速度时,OSD设备的“重量”至关重要。 (实际上不是-大约)


我不知道牧羊犬会做这样的事情吗? 可能吧 首先给他的数据。 在I / O操作方面的性能是次要的。 当然,有了更强大的节点,它的I / O性能可以提高,但是它始终取决于特定的结构。 (然而, 测试显示出比ceph更好的牧羊犬性能-大约per)


我向Sheepdog添加了一个新节点,数据存储在旋转的2TB SATA II磁盘上。 该光盘的最大写入速度约为80M / s。 实际上,它变化很大,因为SATA驱动器无法同时读写。

最初,此磁盘上VDI的平均写入速度约为20〜30M / s,因为除了恢复VDI中的数据外,还复制了392G容器数据。 这持续了6.5个小时。 写入速度在40〜55M / s之间。

显然,在这种情况下,写入速度受到本地块设备的I / O性能的限制。

对于Sheepdog,适用以下规则:“具有快速连接的节点上存在的VDI对象越多,I / O操作的性能就越好。”


由于在后台移动VDI对象意味着“节点的快速死亡”将减慢那些占用最大空间的数据对象的复制,因此这将表现为VDI容器的I / O操作性能下降。


占用空间


放置数据对象时,可用空间的数量对于守护程序至关重要。 该机制看起来很简单。 绵羊守护程序通过该绵羊守护程序不时地与VDI容器进行数据通信,从而确定节点上的可用空间和已占用空间的利用率,并对其进行排序。 然后将数据分配到利用率最低的节点之间。


如果主要存在快速写入路径,则对VDI容器的写入操作也将很快。 由于执行VDI容器的I / O操作的速度越快, Sheep守护程序可以越早进行下一个操作。


重要的是,对于Sheepdog,当其中一个节点完全充满时,将不会出现任何情况。 如果节点上的利用率变得更差,那么Sheep守护程序将开始将其数据对象移动到另一个位置。


牧羊犬的工作原理与Btrfs一样-仅使用真正占用的空间。 因此,您可以创建一个虚拟VDI容器,其容量为1 TB,实际上将占用存储在其中的数据所占用的空间。 从这个角度来看,希望在VDI容器中使用这样的格式的虚拟磁盘和文件系统,它们可以相互清理。


集群启动


虽然可以同时停止所有节点,但不能一次启动节点! 节点应逐渐连接。 从节点列表中首先指定的节点开始。
(这是一个非常奇怪的说法-大约每人)

Vdi


这是Sheepdog中虚拟磁盘的通用缩写,而不是其特定格式7。 。 通常,这是一个具有固定大小的隔离专区的虚拟盒子, Sheepdog随后将客户端传输的数据放入其中。


创建VDI


在创建或导入第一个VDI之前,我们需要格式化集群。 格式化群集时,将设置参数,然后在创建每个后续VDI时默认使用这些参数。


演示创建名为Disk1且大小为1 GB的新VDI的示例


 root@nod1 :~# collie vdi create disk1 1G root@nod1 :~# collie vdi list Name Id Size Used Shared Creation time VDI id Copies Tag Block Size Shift disk1 0 1.0 GB 0.0 MB 0.0 MB 2015-12-04 14:07 e8b18f 2 22 

编号
VDI标识符


尺码
VDI的大小不必立即进行预分配。
如果此VDI是使用qemu-img convert创建的增量格式(qcow2等),它将与虚拟磁盘的大小不匹配,但会不断增长。


二手的
有关VDI数据对象占用多少空间的信息。
VDI不需要在创建过程中分配数据对象,因为它尚未创建数据对象,因此它根本不会占据任何空间。


共享的
其他VDI共享的数据对象的数量


创作时间
VDI创建时间


块大小
VDI对象的大小。 注意! 它不是以MB为单位指定,而是以两个字节的幂为单位。 在旧版本中,仅使用4 MB固定大小的对象。 当前,VDI可能具有更大的对象。 常规虚拟机的VDI对象的最佳大小约为64MB(26)。 默认大小22(4 MB)也很小。 少不能安装。 对象的尺寸越小, Sheepdog在使用VDI时必须处理的文件数量越多,从IO的角度来看,使用文件并不是一个便宜的问题。 大量文件,尤其是使用慢速SATA控制器的文件,可能会导致读写速度急剧下降。 可以使用的最大对象大小为31(2 GB)。 如果VDI始终存储大量静态数据(例如备份),这将是有益的。


Vdi ID
VDI标识符。


VDI包含什么?


VDI内容是数据。 这是一个分布式块设备,因此Sheepdog不会解决此数据或垃圾。 从这个角度来看,VDI看起来像是LVM逻辑卷。 预先填充的VDI对应于具有专用范围的经典LV分区,而VDI类似于在池中创建的精简LV分区(请参阅LVM(thin_provisioning)),但区别在于数据范围(对象)不在本地存储块设备,并分散在节点之间。


VDI格式与此类似地用作文件系统。 一些顺序地占用保留的扩展区(对象),其他的将它们映射为它们的inode,然后直接向它们发送数据。 节点存储文件系统,VDI格式和内部文件系统的不正确组合会导致I / O性能显着下降。

如何获取有关VDI的信息


要了解有关VDI格式的更多信息,可以使用qemu-img info


 root@nod1 :~# qemu-img info sheepdog:localhost:8000:disk1 image: sheepdog:localhost:8000:test2 file format: qcow2 virtual size: 12G (12884901888 bytes) disk size: 4.0G cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false refcount bits: 16 corrupt: false 

从命令的输出中,您可以发现disk1的标称大小为12G。 目前仅需4G。 由于它是qcow2格式,因此很明显它是作为增量创建的。


 root@nod1 :~# collie vdi list Name Id Size Used Shared Creation time VDI id Copies Tag Block Size Shift disk2 0 4.0 GB 4.0 GB 0.0 MB 2015-12-04 16:07 825dc1 2 31 root@nod1 :~# qemu-img info sheepdog:localhost:8000:disk2 image: sheepdog:localhost:8000:disk2 file format: raw virtual size: 4.0G (4294967296 bytes) disk size: 4.0G root@nod1 :~# find /datastore/obj/ | grep 825dc1 /datastore/obj/meta/80825dc100000000 /datastore/obj/c1/00825dc100000000 /datastore/obj/c1/00825dc100000001 

在这种情况下,Disk2是作为原始分配的4 GB VDI以原始格式创建的,块大小为2 GB,实际上仅占用两个2 GB


将VDI导出到文件


VDI内容可以通过多种方式从Sheepdog导出。 也许最快的是使用狗读 。 该命令有点混乱,但仅表示:“加载VDI的内容并将其发送到STDOUT ..”,可以将其重定向到文件:


 root@nod1 :~# collie vdi read disk1 > /backups/soubor.raw 

如果VDI具有10G,但仅使用2G,它将创建一个具有10 GB完整容量的文件。


在此命令中,VDI的内容未更改 ,因此,如果可以直接使用VDI的内容(例如,压缩qcow2格式的虚拟磁盘)


 .. -drive file=file:/disk1_exportovany_z_vdi,..,format=qcow2 .. 

将VDI内容存储到文件中的另一种方法是使用qemu-img convert 。 它不是很快,但是它允许您使用相应虚拟磁盘格式的不同选项将VDI转换为另一种格式。


 root@nod1 :~# qemu-img convert -f qcow2 -O file -o preallocation=full,nocow=on sheepdog:localhost:8000:disk1 /disk1_exportovany_z_vdi 

增量备份


创建增量备份


第一个快照和第二个快照之间的增量。


 root@nod1 :~# collie vdi backup test -F snap1 -s snap2 /backups/soubor_diff 

从增量备份还原VDI


 root@nod1 :~# collie vdi restore test -s snap1 /tmp/backup restoring /tmp/backup... done 

导入增量备份时,VDI当然应该具有从中进行备份的快照。


通过阅读图像测试的原始内容进行验证...


  root@nod1 :~# collie vdi read test 0 512 -s 3 

从文件导入VDI


可以类似于导出来执行将现有虚拟磁盘导入为本地FS文件的操作。 但是,区别在于使用狗写操作 (“从STDIN读取数据并写入VDI文件..”)


 root@nod1 :~# collie vdi write disk1 < /backups/soubor.raw 


  • 内容只能导入到现有的VDI中。
  • 导入的VDI总是比原始文件占用更多空间,因为从中还原VDI的数据块包含标记区域上的数据。

如果VDI还不存在,并且我们不知道虚拟磁盘需要多少空间,则可以使用qemu-img convert


 root@nod1 :~# qemu-img convert -f file -O qcow2 -o redundancy=2:1 ./disk_ukladany_do_vdi sheepdog:localhost:8000:disk 

尽管VDI格式(例如qcow2,qed和其他格式)可以在VDI中使用。 为了提高I / O效率,最好预先分配数据块。
, Sheepdog VDI.

http://www.sheepdog-project.org/doc/vdi_read_and_write.html


VDI


VDI , .


 root@nod1 :~# collie vdi check disk1 

VDI, . Sheepdog , . , .

: 'dog node kill' , ethernet , sheep . (, Ethernet), sheep . .


IO VDI


VDI . . , IO VDI.


Sheepdog SYNC, . -, VFS, , , .


VDI Sheepdog , . . Sheepdog VDI-.


VFS-


IO VDI sheep -n . SYNC , , VFS . , VFS , , !


. , — , , .


  sheep -n ... 

Sheepdog . -D


- . sheep - IO — SSD . , VDI, SYNC . .


, VDI , VDI . , , , VDI.


 sheep -w size=20000,directio,dir=/dir ... 

size


directio
sheep , . SSD.


dir


      ,     . 

( ) dog .


VDI dog vd cashe flush , VDI!


— . VDI, VFS , (/store_dir/journal/[epoch]/[vdi_object_id]), , .


IO , (cik, cak), (sequence).


, Sheepdog VDI , , SSD-. , VDI , , VDI.


sheep


 $ sheep -j size=256M ... 

, VDI , . -, — — -:


 $ sheep -j dir=/dir,size=256M ... 

dir = , . , SW RAID SSD.


: sheep , . , skip, .


 $ sheep -j dir=/dir,size=256M,skip ... 



  1. . 2015 . http://events.linuxfoundation.jp/sites/events/files/slides/COJ2015_Sheepdog_20150604.pdf
  2. http://www.abclinuxu.cz/blog/kenyho_stesky/2011/11/sheepdog-hrajeme-si-v-hampejzu
  3. SPOF ( S ingle p oint o f f ailure) , . SPOF VDI iSCSI tgtd
  4. 1个
  5. Btrfs — COW, , . , -, . , , . , , . , :


    autodefrag — , .



    nocow — (), — GlusterFS


    Btrfs , , FS, Sheepdog .


    • , , ,
    • multipath, .

    , , , Sheepdog.


  6. Ext2 . - FS Btrfs, ext2, inode. ext3 ext4 . inode , Sheepdog . , -, . , Sheepdog , dog vdi check . , ext2 , — - dog vdi md , VDI .


  7. , , vdi QEMU_Block_Disk

参考文献


https://github.com/collie/sheepdog/wiki — ,
http://www.osrg.net/sheepdog/ — Nippon Telegraph and Telephone Corporation
http://www.sheepdog-project.org/doc/index.html — Sheepdog 0.8.0; — Valerio Pachera
http://www.admin-magazine.com/Archive/2014/23/Distributed-storage-with-Sheepdog — Udo Seidela Sheepdog , 23- Admin 2014

Source: https://habr.com/ru/post/zh-CN412739/


All Articles