
最近,我正在为一个涉及高并发日志写入和离线分析的项目部署香港服务器。数据量大、写入密集,对存储的性能与稳定性要求极高。起初我尝试过传统的RAID加ext4方案,但在写入压力和意外重启恢复方面频频踩坑。最终,我决定采用 ZFS 和 LVM 的组合方案,构建出一个兼顾弹性管理、高性能缓存和强一致性的企业级存储层。
这篇文章,我会详细拆解我在香港服务器上部署 ZFS on LVM 的全过程,包括分区设计、池配置、性能调优与异常恢复,并分享为何这套架构在实战中跑得比RAID快、比Ceph轻、比裸盘稳定。
一、部署架构概览
目标是在一台 配置为双路Intel Xeon + 512GB ECC内存 + 12块NVMe SSD 的香港裸金属服务器上构建一个高IO、可快照、易扩展的数据卷方案,满足如下需求:
- 持久数据具备事务一致性(ZFS)
- 支持在线扩容和逻辑分卷(LVM)
- 具备 ARC/L2ARC 缓存优化(ZFS)
- 写放大与压缩效率高(ZFS native)
- 快速部署,避免复杂集群配置(对比Ceph)
我的方案采用:
- 底层使用 ZFS 管理实际物理盘(RAID-Z2 或镜像组)
- 在 ZFS 池上创建 zvol 块设备
- 使用 LVM PV 绑定 zvol,VG + LV 管理数据逻辑卷
- 上层挂载为 ext4 或 xfs 文件系统
架构图如下:
NVMe SSDs → ZFS Pool (RAID-Z2) → zvol → LVM PV → VG → LV → ext4/xfs
二、硬盘准备与ZFS池创建
1. 物理盘准备
假设我们有 8 块 NVMe 盘 /dev/nvme0n1 到 /dev/nvme7n1:
lsblk -d -e7 -o NAME,SIZE,MODEL
清除原始分区表:
for dev in /dev/nvme{0..7}n1; do
wipefs -a $dev
done
2. 安装 ZFS 工具集
apt install -y zfsutils-linux
# 或 CentOS: yum install -y zfs
3. 创建 ZFS 存储池(使用 RAID-Z2)
zpool create -f \
zpool_data \
raidz2 /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1 \
/dev/nvme4n1 /dev/nvme5n1 /dev/nvme6n1 /dev/nvme7n1 \
-o ashift=12 \
-O compression=lz4 \
-O atime=off \
-O mountpoint=none
参数解释:
- ashift=12: 针对4K块优化
- compression=lz4: 高效压缩,节省空间与I/O
- atime=off: 禁止访问时间记录,提升读性能
三、创建 ZVOL 并绑定到 LVM
1. 创建 zvol 块设备
zfs create -V 2T zpool_data/zvol_lvm
此时系统中将出现 /dev/zvol/zpool_data/zvol_lvm 块设备。
2. 初始化为 LVM 物理卷
pvcreate /dev/zvol/zpool_data/zvol_lvm
vgcreate vg_data /dev/zvol/zpool_data/zvol_lvm
lvcreate -L 500G -n lv_logs vg_data
3. 格式化与挂载
mkfs.xfs /dev/vg_data/lv_logs
mkdir /mnt/logs
mount /dev/vg_data/lv_logs /mnt/logs
四、性能优化与故障恢复策略
1. 打开 ZFS 缓存功能
zfs set primarycache=all zpool_data
zfs set secondarycache=all zpool_data
若有额外 SSD,可用于配置 L2ARC 缓存或 SLOG 设备。
2. 设置同步策略
zfs set sync=standard zpool_data
如对性能要求极高且能接受少量数据风险,可设为 disabled,但建议仍保持 standard 以保证事务一致性。
3. LVM 快照机制
配合定时任务:
lvcreate -L 10G -s -n snap_lv_logs_`date +%F` /dev/vg_data/lv_logs
并清理过期快照:
lvremove /dev/vg_data/snap_lv_logs_2025-06-10
五、可用性策略与自动挂载
编辑 /etc/fstab 配置 LVM 设备挂载:
/dev/vg_data/lv_logs /mnt/logs xfs defaults 0 2
ZFS 本身具备 CRC 校验、自动修复、热插拔重建、延迟写优化等高可用特性,搭配 LVM 的快照与卷管理,形成了较完整的可恢复性方案。
六、部署后性能实测
我通过 fio 对比测试如下(4K随机写,QD=32):
| 配置 | IOPS | 延迟(ms) | 吞吐量(MB/s) |
|---|---|---|---|
| RAID10+ext4 | ~130K | 1.2 | 520 |
| ZFS+LVM+xfs | ~210K | 0.7 | 840 |
ZFS 在压缩与缓存命中后性能反而更优,关键在于 NVMe 与 ARC 配合后能持续压榨内存与PCIe带宽性能。
七、ZFS + LVM 为香港高性能存储赋能
结合 ZFS 与 LVM 的混合模式,既解决了我对高吞吐写入、快速快照、灵活分卷的需求,又避免了传统 RAID 方案的维护复杂性。ZFS 的校验机制也让我在一次突发断电中成功恢复了全部数据。
在香港服务器上跑大数据或日志系统时,这样的架构方案兼具性能与安全,非常适合对 存储可靠性和管理灵活性 有双重要求的项目。如果你也在为存储IO瓶颈或数据保护发愁,不妨一试 ZFS + LVM。
八、ZFS 双节点热备方案:ZFS Send + Keepalived
场景目标:
在香港两个物理节点(A、B)之间实现主从数据同步与故障接管。节点A作为主写节点,节点B实时接收快照流同步。当节点A宕机,VIP切换到节点B,业务不中断。
架构图:
[Client]
↓
[VIP 192.168.100.10]
↓
┌─────────────┐ ┌─────────────┐
│ Node A 主节点│──ZFS send─▶│ Node B 备节点│
│ zpool_data │ │ zpool_backup│
└─────────────┘ └─────────────┘
步骤一:初始化ZFS备份池(节点B)
zfs create -o mountpoint=none zpool_backup
步骤二:主节点定时执行 ZFS 增量同步
#!/bin/bash
# 文件名:/opt/zfs_sync.sh
SRC_POOL="zpool_data"
DST_POOL="zpool_backup"
TARGET_HOST="192.168.100.21"
# 快照名
SNAP_NAME="${SRC_POOL}@sync_$(date +%s)"
# 创建快照
zfs snapshot ${SNAP_NAME}
# 增量发送(第一次用 -R,后续用 -i)
zfs send -i ${SRC_POOL}@last ${SNAP_NAME} | ssh ${TARGET_HOST} "zfs receive -F ${DST_POOL}"
# 更新last标记
zfs destroy ${SRC_POOL}@last
zfs rename ${SNAP_NAME} ${SRC_POOL}@last
加入 crontab 每5分钟执行:
*/5 * * * * /opt/zfs_sync.sh
步骤三:使用 Keepalived 配置 VIP 切换
主节点A配置 /etc/keepalived/keepalived.conf:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass zfs123
}
virtual_ipaddress {
192.168.100.10
}
}
备节点B配置为 state BACKUP 且 priority 100。当主节点故障时,VIP 会漂移到备节点并提供服务。
九、ZFS 异地备份同步脚本
如果你有香港以外的数据中心,比如东京/新加坡,也可以用类似方式进行异地容灾。
#!/bin/bash
# 异地备份脚本 zfs_offsite_backup.sh
SRC_POOL="zpool_data"
DST="backupuser@remote-ip"
DST_PATH="/backups/hk"
SNAP_NAME="backup_$(date +%F)"
zfs snapshot ${SRC_POOL}@${SNAP_NAME}
zfs send -c ${SRC_POOL}@${SNAP_NAME} | ssh ${DST} "zfs receive -Fv ${DST_PATH}"
# 可选:保留7天快照
ssh ${DST} "zfs list -t snapshot | grep ${DST_PATH} | awk '{print \$1}' | sort | head -n -7 | xargs -n1 zfs destroy"
建议配置 autossh 保持链路稳定,或者结合 zrepl、syncoid 等工具进行智能差异同步和监控。
十、ZFS 共享存储:iSCSI 和 NFS 输出方式
ZFS 生成的 zvol 可通过 iSCSI 或 NFS 向 Kubernetes、虚拟机集群或远程主机提供共享块或文件存储。
A. iSCSI(LUN 块存储)
安装与配置:
apt install -y targetcli-fb
添加 ZVOL 到 iSCSI:
zfs create -V 100G zpool_data/zvol_iscsi
targetcli
> /backstores/block create zvol1 /dev/zvol/zpool_data/zvol_iscsi
> /iscsi create iqn.2025-06.hk.example:storage1
> /iscsi/iqn.2025-06.hk.example:storage1/tpg1/luns create /backstores/block/zvol1
> /iscsi/iqn.../tpg1/acls create iqn.2025-06.client
> /iscsi/iqn.../tpg1/portals create 0.0.0.0 3260
客户端挂载:
iscsiadm -m discovery -t sendtargets -p <server-ip>
iscsiadm -m node --login
B. NFS(文件系统共享)
启用并导出路径:
zfs set sharenfs=on zpool_data/nfsshare
zfs set mountpoint=/export/nfsshare zpool_data/nfsshare
exportfs -a
客户端挂载:
mount -t nfs <server-ip>:/export/nfsshare /mnt/nfs
十一、适用场景建议
| 方案类型 | 技术组件 | 应用场景 |
|---|---|---|
| 本地高性能存储 | ZFS + LVM | 单节点服务、大数据、缓存、日志、备份系统 |
| 双节点热备 | ZFS send + keepalived | 高可用写入、读多写少的业务 |
| 异地冷备份 | ZFS send + SSH | 容灾、异地保留、金融风控等 |
| 虚拟化共享存储 | ZFS zvol + iSCSI | Proxmox、VMware、K8S 动态持久卷 |
| 文件共享服务 | ZFS + NFS | 多应用并发读写、媒体处理、文件系统挂载 |











