存储系统以及文件系统的部署规划远比调优重要,因为一旦存储了数据,可以调整的余地已
经非常小了。以下是关于ZFS文件系统规划的一些建议:
● 使用最新的Solaris版本或OpenSolaris版本。
ZFS技术更新非常快,其中包含了很多性能改进和bug的修复。这些更新反映在最新的
OpenSolaris版本里。Solaris里关于ZFS的更新会滞后一些。如果要求不是很严格的话,可以
考虑使用OpenSolaris。(每一个OpenSolaris的版本,SUN可以提供18个月的付费支持。每
一个Solaris的版本,SUN可以提供至少7年的付费支持。)
● 对于server应用应使用64位的Solaris操作系统
ZFS以及ARC使用kernel memory。如果使用32位的操作系统,由于kernel的地址空间和应
用的地址空间共享4GB,ZFS会受到很大限制。另外对于x86/x64硬件,64位系统通常会得到
更高的性能。
● 使用整个磁盘而不是某个分区或slice来作为ZFS的存储设备
使用整个磁盘作为ZFS的存储设备可以使ZFS打开磁盘的写cache,并且方便将来存储池
import和export的操作(比如磁盘迁移到另外的机器上)。一个磁盘上如果有多个分区并安装
了不同的文件系统将会带来磁盘管理上的麻烦。
● 让ZFS直接管理磁盘
实践证明,让ZFS直接管理磁盘而不是hardware RAID往往可以得到更好地性能。因为ZFS
有自己的I/O 调度的算法,让ZFS直接管理磁盘可以让ZFS更好地做出I/O调度以及文件系统
块的分配策略。如果要使用外部存储系统,建议每个ZFS看到的设备包含较少的磁盘。总之,
ZFS更喜欢廉价的硬件。
● 存储池的设备分散到多个控制器上
这主要是从性能和可用性上的考虑。例如,对于Sun x4500,一个可选的Pool的规划为:
root@x4500 # zpool create -f zfspool \
raidz c5t7d0 c4t7d0 c7t7d0 c6t7d0 c1t7d0 c0t7d0 \
raidz c5t6d0 c4t6d0 c7t6d0 c6t6d0 c1t6d0 c0t6d0 \
raidz c5t5d0 c4t5d0 c7t5d0 c6t5d0 c1t5d0 c0t5d0 \
raidz c4t4d0 c7t4d0 c6t4d0 c1t4d0 c0t4d0 \
raidz c5t3d0 c4t3d0 c7t3d0 c6t3d0 c1t3d0 \
raidz c5t2d0 c4t2d0 c7t2d0 c6t2d0 c0t2d0 \
raidz c5t1d0 c4t1d0 c7t1d0 c1t1d0 c0t1d0 \
raidz c4t0d0 c7t0d0 c6t0d0 c1t0d0 c0t0d0 \
spare c0t3d0 c1t2d0 c6t1d0
● 把root pool 和data pool分开
Opensolaris现在支持ZFS作为根文件系统,这带来了很多好处,比如快照,克隆,系统升级
方便等。从维护的角度来讲,应该把root pool 和data pool分开,因为root pool有一些限制比
如不能做RAIDZ等。另外如果root pool 和data pool不分开的话,重装系统或迁移数据时都会
有麻烦。
● 不要让ZFS Pool太满
当文件系统太满时,对于写操作需要寻找空闲块的时间会明显变长,影响性能。
● 对于大量小文件的应用不建议使用RAIDZ
前面对ZFS文件系统的介绍中提到,RAIDZ会影响读操作的性能。因为一个文件系统块被均
匀分摊到RAIDZ group的所有磁盘上,读一个块需要读RAIDZ group中所有的磁盘。这对于
小文件来讲性能影响会尤其明显。另外大量小文件意味着大量的metadata,如果建了一个大的
基于RAIDZ的存储池,当RAIDZ做数据恢复时磁盘重建的时间可能会很长。