ZFS系列补充(二)把你的U盘用起来


背景

本文来自于“为什么我之前没有想到?!”系列。我家里和办公室有一堆usb2.0 U盘:有6个16GB的和8个8GB的,总共14个。我在一个GlusterFS存储集群中有两个hypervisor,我刚好有两个USB 集线器,每个USB 集线器支持7个USB口。完美!所以,为什么不好好利用它们,把它们作为L2ARC设备添加到我的资源池中呢?

免责声明

USB2.0每个控制器限速在40MBps以内。一个标准的7200RPM硬盘可以做到100MBps。因此,将USB 2.0驱动器添加到您的池中作为缓存不会增加读带宽。至少对于大的顺序读取不是这样。然而,NAND闪存设备的寻道延迟通常在1毫秒到3毫秒之间,而普通HDD硬盘大约是12毫秒。如果您像我一样进行大量小的随机IO,那么USB驱动器实际上将提供HDD无法提供的总体性能提升。

此外,由于NAND闪存没有移动部件,需要从HDD硬盘读取的数据更少,这意味着执行器臂的移动更少,这意味着长期消耗更少的电力。所以,它们不仅对小型随机IO更好,同时也节省了您的电力!为绿色干杯!

最后,L2ARC应该是读密集的。然而,如果在ARC和L2ARC中没有足够的空间存储所有请求的数据,它也可能是写密集型的。如果是这种情况,您将不断地向L2ARC写入数据。对于USB驱动器没有磨损水平算法,你将快速消耗U盘,它可能会死在任何时间。如果是这种情况,可以只在L2ARC中存储元数据,而不是存实际的数据。你可以通过以下方式来实现:

1
# zfs set secondarycache=metadata pool

您可以设置整个池或每个数据集。在上面概述的情况下,我肯定会在池范围内执行,每个数据集都会默认继承这个范围。

实现

这是相当直接的。只需通过使用它们的唯一标识符识别驱动器是什么,然后将它们添加到池中:

1
2
3
4
5
6
7
8
# ls /dev/disk/by-id/usb-* | grep -v part
/dev/disk/by-id/usb-Kingston_DataTraveler_G3_0014780D8CEBEBC145E80163-0:0@
/dev/disk/by-id/usb-Kingston_DataTraveler_SE9_00187D0F567FEC2090007621-0:0@
/dev/disk/by-id/usb-Kingston_DataTraveler_SE9_00248121ABD5EC2070002E70-0:0@
/dev/disk/by-id/usb-Kingston_DataTraveler_SE9_00D0C9CE66A2EC2070002F04-0:0@
/dev/disk/by-id/usb-_USB_DISK_Pro_070B2605FA99D033-0:0@
/dev/disk/by-id/usb-_USB_DISK_Pro_070B2607A029C562-0:0@
/dev/disk/by-id/usb-_USB_DISK_Pro_070B2608976BFD58-0:0@

所以,这就是我在文章开头提到的七个盘。因此,要将它们添加到系统中作为L2ARC驱动器,只需运行以下命令:

1
2
3
4
5
6
7
# zpool add -f pool cache usb-Kingston_DataTraveler_G3_0014780D8CEBEBC145E80163-0:0\
usb-Kingston_DataTraveler_SE9_00187D0F567FEC2090007621-0:0\
usb-Kingston_DataTraveler_SE9_00248121ABD5EC2070002E70-0:0\
usb-Kingston_DataTraveler_SE9_00D0C9CE66A2EC2070002F04-0:0\
usb-_USB_DISK_Pro_070B2605FA99D033-0:0\
usb-_USB_DISK_Pro_070B2607A029C562-0:0\
usb-_USB_DISK_Pro_070B2608976BFD58-0:0

当然,这些是我的U盘的唯一标识符。你需要根据你的U盘的标识符来替换它们。现在它们都安装好了,看看容量是不是都满了?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# zpool iostat -v
pool alloc free read write read write
------------------------------------------------------------ ----- ----- ----- ----- ----- -----
pool 695G 1.13T 21 59 53.6K 457K
mirror 349G 579G 10 28 25.2K 220K
ata-ST1000DM003-9YN162_S1D1TM4J - - 4 21 25.8K 267K
ata-WDC_WD10EARS-00Y5B1_WD-WMAV50708780 - - 4 21 27.9K 267K
mirror 347G 581G 11 30 28.3K 237K
ata-WDC_WD10EARS-00Y5B1_WD-WMAV50713154 - - 4 22 16.7K 238K
ata-WDC_WD10EARS-00Y5B1_WD-WMAV50710024 - - 4 22 19.4K 238K
logs - - - - - -
mirror 4K 1016M 0 0 0 0
ata-OCZ-REVODRIVE_OCZ-33W9WE11E9X73Y41-part1 - - 0 0 0 0
ata-OCZ-REVODRIVE_OCZ-X5RG0EIY7MN7676K-part1 - - 0 0 0 0
cache - - - - - -
ata-OCZ-REVODRIVE_OCZ-33W9WE11E9X73Y41-part2 52.2G 16M 4 2 51.3K 291K
ata-OCZ-REVODRIVE_OCZ-X5RG0EIY7MN7676K-part2 52.2G 16M 4 2 52.6K 293K
usb-Kingston_DataTraveler_G3_0014780D8CEBEBC145E80163-0:0 465M 6.80G 0 0 319 72.8K
usb-Kingston_DataTraveler_SE9_00187D0F567FEC2090007621-0:0 1.02G 13.5G 0 0 1.58K 63.0K
usb-Kingston_DataTraveler_SE9_00248121ABD5EC2070002E70-0:0 1.17G 13.4G 0 0 844 72.3K
usb-Kingston_DataTraveler_SE9_00D0C9CE66A2EC2070002F04-0:0 990M 13.6G 0 0 1.02K 59.9K
usb-_USB_DISK_Pro_070B2605FA99D033-0:0 1.08G 6.36G 0 0 1.18K 67.0K
usb-_USB_DISK_Pro_070B2607A029C562-0:0 1.76G 5.68G 0 1 2.48K 109K
usb-_USB_DISK_Pro_070B2608976BFD58-0:0 1.20G 6.24G 0 0 530 38.8K
------------------------------------------------------------ ----- ----- ----- ----- ----- -----

这里需要理解的重要一点是,驱动器不需要都是相同的大小。根据手边有的盘,你可以混合和匹配。当然,给缓存提供的空间越大越好。

总结

虽然这种方式肯定不是为速度而设计的,但它可以用于降低随机IO延迟,并且很好地降低数据中心的功耗。此外,你还打算用这些随处可见的USB设备做什么呢?不妨好好利用它们。显然,“云”让你的所有文件都在线变得容易。

参考资料

https://pthree.org/2013/05/09/zfs-administration-appendix-b-using-usb-drives/

如果你觉得本文对你有帮助,欢迎打赏