作者:田逸(vx:formyz)​

需求产生


在某地运营商机房租了几台服务器,为了节省成本,租的都是低配且年级比较大的服务器。选择其中三台做成Proxmox
VE超融合集群,平台上的虚拟机配置成高可用,存储为分布式去中心化Ceph。这三个节点的配置为内存64G(16根4G单条)、6块7200转容量为2TB的低速机械盘,性能相当的差。将一些边缘业务、不太重要的应用放在这样一个性能不高的平台上,虽然运行时资源紧张(内存总使用率90%),但也平稳运行了好几年。上周机房切换电源,Proxmox VE集群所用的交换机掉电,三个节点全部重启,哦豁!有一个节点启动失败,经多次尝试,依然如故。

Proxmox VE 集群使用节点本地ZFS_宿主系统

机房给找了一台服务器,部署上Proxmox VE,运行正常。考虑到资源紧张的问题,打算弃用Ceph作为存储,而使用单节点本地ZFS,只做集群不做高可用。这样的折中的好处是:节省资源(一个OSD占用5G内存)、集群直接相互影响小。用集群仅仅是为了通过统一接口管理所有Proxmox VE节点。


实施步骤


第一步:创建Proxmox VE三节点集群,具体步骤参加以前的相关文档,这里不再赘述。


第二步:在第一个节点上,创建存储ZFS,选取未使用之所有空闲磁盘,如果磁盘存在分区或者数据,将不会出现在ZFS备选磁盘列表。需要在Proxmox VE宿主系统Debian下,用命令行“wipefs –a /dev/sdd”这样的方式把数据清理后,才可以作为备选磁盘使用。在我的环境中,一共有5块磁盘,我把它全部整合到ZFS中。

Proxmox VE 集群使用节点本地ZFS_宿主系统_02

Proxmox VE 集群Web管理后台,选中目标节点,再选目标节点下的右侧菜单项“磁盘”之子菜单“ZFS”,继续点上部按钮“创建:ZFS”。

Proxmox VE 集群使用节点本地ZFS_服务器_03

给ZFS Pool取一个在Proxmox VE集群内唯一的名称,选取所有可用的磁盘,下拉列表选定“RAID 级别”,确认无误后,点击右下角按钮“创建”。

Proxmox VE 集群使用节点本地ZFS_数据_04

注意:磁盘数量较少时,需要选能够支持的RAID 级别,否则无法创建。


第三步:验证ZFS是否只对本地节点有效。登录Proxmox VE集群Web管理后台,查看各节点存储的分布情况,看是否与预想的相符。

Proxmox VE 集群使用节点本地ZFS_服务器_05

更直接的方式,是登录Proxmox VE集群任一节点宿主系统Debian,查看文件“/etc/pve/storage.cfg”,与ZFS相关的部分文本块如下所示:


zfspool: zfs_data

        pool zfs_data

        content images,rootdir

        mountpoint /zfs_data

        nodes pve169


zfspool: zfs_165_data

        pool zfs_165_data

        content images,rootdir

        mountpoint /zfs_165_data

        nodes pve165


zfspool: zfs_164_data

        pool zfs_164_data

        content rootdir,images

        mountpoint /zfs_164_data

        nodes pve164


注意每一个文本块的最后一行,它的作用是限定ZFS Pool为哪些节点所使用。如果没有这个限定,其它节点也将能“看见”此ZFS Pool,这不是我们所希望的。


故障排查及处理


有时候,创建第二个本地节点ZFS Pool后,在Proxmox
VE Web管理后台不能发现刚创建的ZFS Pool。处理的方式就是登录Proxmox VE集群宿主系统Debian,编辑文件“/etc/pve/storage.cfg”,按创建本节点ZFS时设定的名称,把文本块追加到文件末尾。如果编辑正确,可以立即在Web管理界面正确显示。