24 群集逻辑卷管理器(群集 LVM) #
管理群集上的共享存储设备时,存储子系统发生的所有更改都必须通知到每个节点。逻辑卷管理器 (LVM) 支持以透明方式来管理整个群集中的卷组。在多个主机之间共享的卷组可使用与本地存储相同的命令进行管理。
24.1 概念概述 #
系统通过不同的工具来协调群集 LVM:
- 分布式锁管理器 (DLM)
通过群集范围的锁定协调对多个主机之间共享资源的访问。
- 逻辑卷管理器 (LVM)
LVM 提供了一个虚拟的磁盘空间池,允许将一个逻辑卷灵活分布在多个磁盘上。
- 群集逻辑卷管理器(群集 LVM)
Cluster LVM
一词表示在群集环境中使用了 LVM。这需要对配置进行一些调整,以保护共享存储设备上的 LVM 元数据。自 SUSE Linux Enterprise 15 起,群集扩展使用 lvmlockd 取代了 clvmd。有关 lvmlockd 的详细信息,请参见lvmlockd
命令的手册页 (man 8 lvmlockd
)。- 卷组和逻辑卷
卷组 (VG) 和逻辑卷 (LV) 都属于 LVM 的基本概念。卷组是多个物理磁盘的存储池。逻辑卷属于卷组,可视为一种弹性卷,您可以在其上创建文件系统。在群集环境中,存在共享 VG 的概念,共享 VG 由共享存储设备组成,可被多个主机同时使用。
24.2 群集式 LVM 的配置 #
确保满足以下要求:
有共享存储设备可用,例如,该共享存储设备可通过光纤通道、FCoE、SCSI、iSCSI SAN 或 DRBD* 提供。
确保已安装以下软件包:
lvm2
和lvm2-lockd
。自 SUSE Linux Enterprise 15 起,群集扩展使用 lvmlockd 取代了 clvmd。确保 clvmd 守护程序未运行,否则 lvmlockd 将无法启动。
24.2.1 创建群集资源 #
在一个节点上执行以下基本步骤,以在群集中配置共享 VG:
启动外壳并以
root
用户身份登录。检查群集资源的当前配置:
#
crm configure show
如果已经配置 DLM 资源(及相应的基本组和基本克隆),则继续过程 24.2 “创建 lvmlockd 资源”。
否则,如过程 20.1 “配置 DLM 的基础组”中所述配置 DLM 资源和相应的基本组和基本克隆。
启动外壳并以
root
用户身份登录。运行以下命令以查看此资源的使用情况:
#
crm configure ra info lvmlockd
按如下所示配置
lvmlockd
资源:#
crm configure primitive lvmlockd lvmlockd \ op start timeout="90" \ op stop timeout="100" \ op monitor interval="30" timeout="90"
为了确保在每个节点上启动
lvmlockd
资源,请将原始资源添加到您在过程 24.1 “创建 DLM 资源”中为存储创建的基本组:#
crm configure modgroup g-storage add lvmlockd
查看所做的更改:
#
crm configure show
检查资源是否运行正常:
#
crm status full
启动外壳并以
root
用户身份登录。假设您已有两个共享磁盘,并使用它们创建共享 VG:
#
vgcreate --shared vg1 /dev/disk/by-id/DEVICE_ID1 /dev/disk/by-id/DEVICE_ID2
创建 LV,但一开始不激活它:
#
lvcreate -an -L10G -n lv1 vg1
启动外壳并以
root
用户身份登录。运行以下命令以查看此资源的使用情况:
#
crm configure ra info LVM-activate
此资源负责管理 VG 的激活。在共享 VG 中,有两种不同的 LV 激活模式:排它模式和共享模式。排它模式是默认模式,通常应在
ext4
等本地文件系统使用 LV 时使用。共享模式仅应用于 OCFS2 等群集文件系统。配置资源以管理 VG 的激活。根据您的方案,选择下列其中一个选项:
对于本地文件系统使用情形,使用排它激活模式:
#
crm configure primitive vg1 LVM-activate \ params vgname=vg1 vg_access_mode=lvmlockd \ op start timeout=90s interval=0 \ op stop timeout=90s interval=0 \ op monitor interval=30s timeout=90s
对于 OCFS2,使用共享激活模式,并将其添加到克隆的
g-storage
组:#
crm configure primitive vg1 LVM-activate \ params vgname=vg1 vg_access_mode=lvmlockd activation_mode=shared \ op start timeout=90s interval=0 \ op stop timeout=90s interval=0 \ op monitor interval=30s timeout=90s
#
crm configure modgroup g-storage add vg1
检查资源是否运行正常:
#
crm status full
24.2.2 方案:在 SAN 上将群集 LVM 与 iSCSI 搭配使用 #
以下方案使用两个 SAN 盒,将其 iSCSI 目标导出到多个客户端。大致想法如图 24.1 “使用群集 LVM 的共享磁盘设置”所示。
以下过程将损坏磁盘上的所有数据。
首先只配置一个 SAN 盒。每个 SAN Box 都需要导出自己的 iSCSI 目标。按如下所示继续:
运行 YaST,然后单击
› 启动 iSCSI 服务器模块。如果要在计算机引导时启动 iSCSI 目标,请选择
,否则请选择 。如果正在运行防火墙,请启用
。切换到
选项卡。如果需要身份验证,请启用传入及/或传出身份验证。在本例中,我们选择 。添加新的 iSCSI 目标:
切换到
选项卡。单击
。输入目标名称。名称需要采用如下所示的格式:
iqn.DATE.DOMAIN
有关格式的详细信息,请参见 https://www.ietf.org/rfc/rfc3720.txt 上的 Section 3.2.6.3.1. Type "iqn." (iSCSI Qualified Name) 。
如果需要描述性更强的名称,可以进行更改,但要确保每个目标的标识符都是唯一的。
单击
。在
中输入设备名,并使用 。单击
两次。
出现警告框时单击
进行确认。打开配置文件
/etc/iscsi/iscsid.conf
,将参数node.startup
更改为automatic
。
现在按如下方式设置 iSCSI 发起端:
运行 YaST,然后单击
› 。如果要在计算机引导时启动 iSCSI 发起端,请选择
,否则请将其设置为 。切换到
选项卡并单击 按钮。添加 iSCSI 目标的 IP 地址和端口(请参见过程 24.5 “配置 iSCSI 目标 (SAN)”)。通常,可以保留端口并使用其默认值。
如果使用身份验证,请插入传入和传出用户名和口令,否则请激活
。选择
。找到的连接随即显示在列表中。单击
继续。打开外壳,并以
root
用户身份登录。测试 iSCSI 发起端是否已成功启动:
#
iscsiadm -m discovery -t st -p 192.168.3.100
192.168.3.100:3260,1 iqn.2010-03.de.jupiter:san1建立会话:
#
iscsiadm -m node -l -p 192.168.3.100 -T iqn.2010-03.de.jupiter:san1
Logging in to [iface: default, target: iqn.2010-03.de.jupiter:san1, portal: 192.168.3.100,3260] Login to [iface: default, target: iqn.2010-03.de.jupiter:san1, portal: 192.168.3.100,3260]: successful使用
lsscsi
查看设备名:... [4:0:0:2] disk IET ... 0 /dev/sdd [5:0:0:1] disk IET ... 0 /dev/sde
查找第三列中有
IET
的项。在本例中,设备为/dev/sdd
和/dev/sde
。
打开已按过程 24.6 “配置 iSCSI 发起端”运行 iSCSI 发起端的一个节点上的
root
外壳。使用磁盘
/dev/sdd
和/dev/sde
的稳定设备名称在磁盘上创建共享卷组(例如,在/dev/disk/by-id/
中创建):#
vgcreate --shared testvg /dev/disk/by-id/DEVICE_ID /dev/disk/by-id/DEVICE_ID
根据需要创建逻辑卷:
#
lvcreate --name lv1 --size 500M testvg
使用
vgdisplay
检查卷组:--- Volume group --- VG Name testvg System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size 1016,00 MB PE Size 4,00 MB Total PE 254 Alloc PE / Size 0 / 0 Free PE / Size 254 / 1016,00 MB VG UUID UCyWw8-2jqV-enuT-KH4d-NXQI-JhH3-J24anD
使用
vgs
命令检查卷组的共享状态:#
vgs
VG #PV #LV #SN Attr VSize VFree vgshared 1 1 0 wz--ns 1016.00m 1016.00mAttr
列显示卷属性。在本例中,卷组可写入 (w
)、可调整大小 (z
),分配策略为普通 (n
),并且其为共享资源 (s
)。有关细节,请参见vgs
的手册页。
创建卷并启动资源后,/dev/testvg
下会显示新的设备名称,例如 /dev/testvg/lv1
。这表示 LV 已激活,可以使用。
24.2.3 方案:将群集 LVM 与 DRBD 搭配使用 #
如果数据中心位于城市、国家/地区或大洲的不同区域,则可使用以下方案。
创建主/主 DRBD 资源:
首先,按过程 23.1 “手动配置 DRBD”中所述将 DRBD 设备设置为主/从模式。确保两个节点上的磁盘状态均为
up-to-date
。使用drbdadm status
确认是否如此。将以下选项添加到配置文件(通常类似于
/etc/drbd.d/r0.res
):resource r0 { net { allow-two-primaries; } ... }
将更改的配置文件复制到另一个节点,例如:
#
scp /etc/drbd.d/r0.res venus:/etc/drbd.d/
在两个节点上运行以下命令:
#
drbdadm disconnect r0
#
drbdadm connect r0
#
drbdadm primary r0
检查节点的状态:
#
drbdadm status r0
将 lvmlockd 资源作为克隆包含在 Pacemaker 配置中,并使它依赖于 DLM 克隆资源。有关详细指示信息,请参见过程 24.1 “创建 DLM 资源”。继续之前,请确认这些资源已在群集上成功启动。可以使用
crm status
或 Web 界面检查正在运行的服务。使用
pvcreate
命令为 LVM 准备物理卷。例如,在设备/dev/drbd_r0
上,应使用如下命令:#
pvcreate /dev/drbd_r0
创建共享卷组:
#
vgcreate --shared testvg /dev/drbd_r0
根据需要创建逻辑卷。例如,使用以下命令创建 4 GB 的逻辑卷:
#
lvcreate --name lv1 -L 4G testvg
现在 VG 内的逻辑卷可以作为挂载的文件系统用于原始用途。确保使用逻辑卷的服务具备适当的依赖项,以便在激活 VG 后对它们进行共置和排序。
完成这些配置步骤后,即可像在任何独立工作站上一样进行 LVM 配置。
24.3 明确配置适合的 LVM 设备 #
如果看似有若干设备共享同一个物理卷签名(多路径设备或 DRBD 就有可能发生这种情况),建议明确配置 LVM 扫描 PV 的设备。
例如,如果命令 vgcreate
使用物理设备而非镜像块设备,DRBD 会产生混乱。进而导致 DRBD 出现节点分裂情况。
要停用 LVM 的单个设备,请执行以下操作:
编辑文件
/etc/lvm/lvm.conf
,搜索以filter
开头的行。其中的模式作为正则表达式来处理。前面的“a”表示接受扫描的设备模式,前面的“r”表示拒绝遵守该设备模式的设备。
要去除名为
/dev/sdb1
的设备,请在过滤规则中添加以下表达式:"r|^/dev/sdb1$|"
完整的过滤行将显示如下:
filter = [ "r|^/dev/sdb1$|", "r|/dev/.*/by-path/.*|", "r|/dev/.*/by-id/.*|", "a/.*/" ]
接受 DRBD 和 MPIO 设备但拒绝其他所有设备的过滤行如下所示:
filter = [ "a|/dev/drbd.*|", "a|/dev/.*/by-id/dm-uuid-mpath-.*|", "r/.*/" ]
编写配置文件并将它复制到所有群集节点。
24.4 从镜像 LV 联机迁移到群集 MD #
从 SUSE Linux Enterprise High Availability 15 开始,群集 LVM 中的 cmirrord
已弃用。我们强烈建议将群集中的镜像逻辑卷迁移到群集 MD。群集 MD 表示“群集多设备”,是适用于群集的基于软件的 RAID 存储解决方案。
24.4.1 迁移之前的示例设置 #
假设您采用以下示例设置:
您有一个双节点群集,它由节点
alice
和bob
组成。名为
test-lv
的镜像逻辑卷是基于名为cluster-vg2
的卷组创建的。卷组
cluster-vg2
由磁盘/dev/vdb
和/dev/vdc
组成。
#
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 40G 0 disk
├─vda1 253:1 0 4G 0 part [SWAP]
└─vda2 253:2 0 36G 0 part /
vdb 253:16 0 20G 0 disk
├─cluster--vg2-test--lv_mlog_mimage_0 254:0 0 4M 0 lvm
│ └─cluster--vg2-test--lv_mlog 254:2 0 4M 0 lvm
│ └─cluster--vg2-test--lv 254:5 0 12G 0 lvm
└─cluster--vg2-test--lv_mimage_0 254:3 0 12G 0 lvm
└─cluster--vg2-test--lv 254:5 0 12G 0 lvm
vdc 253:32 0 20G 0 disk
├─cluster--vg2-test--lv_mlog_mimage_1 254:1 0 4M 0 lvm
│ └─cluster--vg2-test--lv_mlog 254:2 0 4M 0 lvm
│ └─cluster--vg2-test--lv 254:5 0 12G 0 lvm
└─cluster--vg2-test--lv_mimage_1 254:4 0 12G 0 lvm
└─cluster--vg2-test--lv 254:5 0 12G 0 lvm
在启动迁移过程之前,请检查逻辑卷和物理卷的容量与利用率。如果逻辑卷使用了所有物理卷容量,迁移可能会失败,并且目标卷上会显示 insufficient free space
错误。如何防止这种迁移失败取决于镜像日志所用的选项:
镜像日志本身是否已镜像(
mirrored
选项),并且已在镜像分支所在的同一个设备上分配?: (例如,如果您按照 Administration Guide for those versions 中所述,为 SUSE Linux Enterprise High Availability 11 或 12 上的cmirrord
设置创建了逻辑卷,则可能符合这种情况。)默认情况下,
mdadm
会在设备开头到数组数据开头之间预留一定数量的空间。在迁移期间,您可以检查未使用的填充空间,并使用data-offset
选项减小此空间(如步骤 1.d 和下文所述)。data-offset
必须在设备上保留足够的空间,使群集 MD 能够将其元数据写入设备。但偏移量必须足够小,使设备的剩余容量可以容纳所迁移卷的所有物理卷区域。由于卷可能已跨越整个设备但不包括镜像日志,因此,偏移量必须小于镜像日志的大小。我们建议将
data-offset
设置为 128 KB。如果未指定偏移量的值,其默认值为 1 KB(1024 字节)。镜像日志是已写入不同的设备(
disk
选项)还是保留在内存中(core
选项)?: 在开始迁移之前,请增大物理卷的大小,或减小逻辑卷的大小(以便为物理卷释放更多的空间)。
24.4.2 将镜像 LV 迁移到群集 MD #
以下过程基于第 24.4.1 节 “迁移之前的示例设置”。请根据您的设置调整指令,并相应地替换 LV、VG、磁盘和群集 MD 设备的名称。
迁移过程完全不会造成停机。在迁移过程中仍可挂载文件系统。
在节点
alice
上执行以下步骤:将镜像逻辑卷
test-lv
转换为线性逻辑卷:#
lvconvert -m0 cluster-vg2/test-lv /dev/vdc
从卷组
cluster-vg2
中去除物理卷/dev/vdc
:#
vgreduce cluster-vg2 /dev/vdc
从 LVM 中去除以下物理卷:
#
pvremove /dev/vdc
如果现在就运行
lsblk
,您将会看到:NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 40G 0 disk ├─vda1 253:1 0 4G 0 part [SWAP] └─vda2 253:2 0 36G 0 part / vdb 253:16 0 20G 0 disk └─cluster--vg2-test--lv 254:5 0 12G 0 lvm vdc 253:32 0 20G 0 disk
使用磁盘
/dev/vdc
创建群集 MD 设备/dev/md0
:#
mdadm --create /dev/md0 --bitmap=clustered \ --metadata=1.2 --raid-devices=1 --force --level=mirror \ /dev/vdc --data-offset=128
有关为何要使用
data-offset
选项的细节,请参见重要:避免迁移失败。
在节点
bob
上组装以下 MD 设备:#
mdadm --assemble md0 /dev/vdc
如果您的群集由两个以上的节点组成,请在该群集中的所有剩余节点上执行此步骤。
返回到节点
alice
:将 MD 设备
/dev/md0
初始化为与 LVM 搭配使用的物理卷:#
pvcreate /dev/md0
将 MD 设备
/dev/md0
添加到卷组cluster-vg2
:#
vgextend cluster-vg2 /dev/md0
将磁盘
/dev/vdb
中的数据移到/dev/md0
设备:#
pvmove /dev/vdb /dev/md0
从卷
group cluster-vg2
中去除物理卷/dev/vdb
:#
vgreduce cluster-vg2 /dev/vdb
从设备中去除标签,使 LVM 不再将该设备识别为物理卷:
#
pvremove /dev/vdb
将
/dev/vdb
添加到 MD 设备/dev/md0
:#
mdadm --grow /dev/md0 --raid-devices=2 --add /dev/vdb
24.4.3 迁移之后的示例设置 #
如果现在就运行 lsblk
,您将会看到:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 40G 0 disk ├─vda1 253:1 0 4G 0 part [SWAP] └─vda2 253:2 0 36G 0 part / vdb 253:16 0 20G 0 disk └─md0 9:0 0 20G 0 raid1 └─cluster--vg2-test--lv 254:5 0 12G 0 lvm vdc 253:32 0 20G 0 disk └─md0 9:0 0 20G 0 raid1 └─cluster--vg2-test--lv 254:5 0 12G 0 lvm