核心思想:文件系统应该能够保证数据完整性。
zfs为磁盘上每一条数据计算一个校验和(checksum),据此识别存储介质合适发生错误并损坏数据。
当底层硬件出现问题或故障时,zfs会意识到它检索到的数据与其记录不匹配,并可以采取行动。
zfs甚至可以自动纠正发现的错误。
zfs拒绝提供已知损坏的数据。
传统文件系统的理念是:目前足够好(good enough for now)。许多文件系统都受到大小限制的困扰。
许多新的文件系统在内部使用64位标识符和索引,ZFS内部则使用128位索引。
ZFS不仅仅是一个文件系统,它是文件系统和卷管理器的组合。
CDDL——Common Development and Distribution License,通用开发和分发许可证。
CDDL限制了一个人提起专利诉讼的能力,对ZFS的捐款自动归入CDDL。
storage provider:存储提供者。
provider 向geom提供服务。如果要镜像两块硬盘,硬盘的geom将提供给镜像。 provider通常有一个设备节点,例如/dev/ada0p4。
consumer 使用provider提供的服务。
slicer 通常负责管理分区。
Oracle在自己的产品中闭源了ZFS。
FreeBSD的ZFS可以在任何GEOM提供者上允许,但在raw磁盘上运行有一定的好处。
RAID容器会消除ZFS的一些功能,应避免使用RAID控制器。
某些虚拟化环境,比如linux KVM虚拟化系统会阻塞ZFS文件系统。
主机间的迁移和从基于映像的备份/还原等功能可能会出问题。
ZFS至少需要几GB的RAM,树莓派等嵌入式系统更适合UFS2等传统文件系统。
某些硬件上的某些高强度负载在UFS2上比ZFS上表现更好,特别是512-byte块设备。
对于数据库,需要测试对比ZFS和UFS2性能
高端硬件确实好,但并不是必需的。
ECC内存虽然更好,并非必须。
ZFS校验和可以识别因内存错误造成的故障。
对于关键业务,为提供高可用性服务,推荐ECC内存。
永远不要使用硬件RAID控制器。
在硬件RAID设备上运行ZFS会创建一种具有RAID和ZFS所有缺点的配置。 ZFS设计用于直接访问硬件,将关键元数据存储在多个设备上,监视磁盘是否有错误,并根据这些错误做出决定。而硬RAID设备却对操作系统隐藏了所有可能会令人担忧的细节,消除了ZFS的自我修复能力。 ZFS将冗余与文件系统集成在一起,重建ZFS阵列比重建RAID阵列快得多。
应使用non-RAID的HBA(host bus adapter)卡作为磁盘控制器
所有RAID都是软件实现的。 所谓硬件RAID控制器实际上是运行在定制操作系统上以实现RAID任务的,只是此过程中将硬件与操作系统隔离开而已。 当初消费级操作系统无法被信任来管理存储。
环境改变了,硬件足够强大,操作系统能做到更好。
很多RAID控制器不允许在没有某种RAID的情况下使用磁盘。即使将控制器配置为”just a bunch of disks"(JBOD)模式,这些控制器实际上也会将每个驱动器格式化为单个RAID-0磁盘。这会屏蔽掉块大小、磁盘错误等信息。 更重要的是,更换RAID控制器可能会造成RAID失效。不同品牌/型号的RAID控制器生成的RAID极有可能互相不兼容,从而消除了ZFS的所有池可移植性。
如果一定要使用硬RAID卡,如果RAID控制器只能将每个磁盘格式化为RAID-0,应禁用控制器上的“回写”(wirte back)模式,否则控制器的写缓存可能会损坏文件系统。
增加复杂性、降低性能和增加风险。
HBA卡比RAID便宜得多,在金钱上和时间上,都更值得考虑。
相同负载下,SAS寿命比SATA长得多。
SSD比任何磁介质快得多。
ZFS可以使用以上任意一种存储介质,应根据实际需求来选择。
ZFS可以利用超快存储作为写缓存。在基于SAS或SATA的存储阵列中添加几个固态磁盘,将大大提高ZFS性能。
电源浪涌、密集的阵列重建都有可能造成多存储阵列丢失多个磁盘。
每个阵列中包含多个制造商制造的驱动器,可以规避批次性质量问题。
FreeBSD支持多路径存储。例如两个外部磁盘阵列可以作为一个镜像,从而提高可用性和可靠性。
安装前检查硬件,考虑一下它可能如何失效,以及如何正确安排套件以防止停机。
胶水永远不可靠。物理标签永远会掉。
提前规划可以大大减少停电带来的创伤。
FreeBSD支持GUID(Globally Unique ID)分区表(GPT)标签。 可以在硬盘分区上设置逻辑标记,便于管理多磁盘。
为存储阵列制订一个命名和编号方案,比如“顶部机架为0,左侧磁盘为0”、“f表示前面,b表示后面”。或其他适用的前缀。
在阵列中安装驱动器时,应记下每个设备的序列号。 在安装每个驱动器托盘时,应根据物理位置和序列号对其进行物理标记。
在FreeBSD安装过程中,或使用live-cd启动时,可以使用以下命令列出所有存储设备:
# camcontrol devlist
<INTEL SSDSC2BX480G4 G2010150> at scbus0 target 0 lun 0 (pass0,ada0)
<TOSHIBA MG08ADA800E 4302> at scbus1 target 0 lun 0 (pass1,ada1)
<HGST HUS728T8TALE6L4 V8GNW9G0> at scbus2 target 0 lun 0 (pass2,ada2)
<WDC WD6003VRYZ-02JCFB0 01.01H01> at scbus3 target 0 lun 0 (pass3,ada3)
<KIOXIA-EXCERIA SATA SSD SBFA1a.1> at scbus4 target 0 lun 0 (pass4,ada4)
然后在每个存储设备节点上运行diskinfo -v命令以获取其序列号:
xxxxxxxxxx
# diskinfo -v /dev/ada0
/dev/ada0
512 # sectorsize
480103981056 # mediasize in bytes (447G)
937703088 # mediasize in sectors
4096 # stripesize
0 # stripeoffset
930261 # Cylinders according to firmware.
16 # Heads according to firmware.
63 # Sectors according to firmware.
INTEL SSDSC2BX480G4 # Disk descr.
BTHC703208JM480MGN # Disk ident.
ahcich0 # Attachment
Yes # TRIM/UNMAP support
0 # Rotation rate in RPM
Not_Zoned # Zone Mode
使用gpt label为磁盘进行编号,GPT label最多15个字符,多数情况下,序列号的最后几位不相同。
比如,机架2的磁盘9,序列号为WD-WCAW36477223,可以标记为/dev/gpt/s2d9-AW36477223。
如果希望系统仅使用这些标签,应禁用系统上的GPTID和磁盘标识标签,以免混淆。