- 论坛徽章:
- 0
|
root@s201 ~]#
从上面的命令输出中可看到,原来VG Size 为10.00 GiB,而扩展后的VG Size 为29.99 GiB,另外在命令输出的结尾还看到被添加物理卷的名字及相关信息。
下面再次来执行“lvcreate --name bar --size 10G vg_drbd”命令:
[root@s201 ~]# lvcreate --name bar --size 10G vg_drbd
Logical volume "bar" created
[root@s201 ~]#
没有问题了,逻辑卷被成功的创建了,这只是使用LVM管理的好处之一。
下面查看一下逻辑卷的详细信息:
[root@s201 ~]# lvdisplay /dev/vg_drbd/bar
--- Logical volume ---
LV Path /dev/vg_drbd/bar
LV Name bar
VG Name vg_drbd
LV UUID yPIrVf-QqmG-ckAG-2X13-mB2m-1BV2-XM5tRS
LV Write Access read/write
LV Creation host, time s201, 2012-12-26 13:31:48 +0800
LV Status available
# open 0
LV Size 10.00 GiB
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:5
[root@s201 ~]#
当我们在两个节点上都执行了逻辑卷的创建之后,就可以创建DRBD的资源了,接下来在DRBD集群节点上设置资源r0,使用刚才创建的逻辑卷bar作为底层设备。在创建完成之后,那么在两节点上就会有命名为/dev/foo/bar的块设备。
接下来添加资源配置:
resource r0 {
...
on alice {
device /dev/drbd0;
disk /dev/vg_drbd/bar;
...
}
on bob {
device /dev/drbd0;
disk /dev/vg_drbd/bar;
...
}
作为一个对LVM管理的讲述,下面再讲述一下对逻辑卷的扩充,就是说在逻辑卷使用中发现存储空间不够时进行的空间扩展:
[root@s201 ~]# lvextend -L +2G /dev/vg_drbd/bar
Extending logical volume bar to 12.00 GiB
Logical volume bar successfully resized
[root@s201 ~]#
命令执行之后,提示说明了逻辑卷已经被成功的执行了扩展,当前的大小为12.00 GiB。
注意这里的“+”号,表示扩展,如果是“—”号则表示是缩减。
10.3. 在DRBD的同步中自动使用LVM快照
在DRBD同步的过程中,同步目标的状态始终处于Inconsistent状态,直到同步完成。如果在这个过程中,同步源却又出现突然损坏,并且可能不能恢复。在这种情况下,管理员将会处于非常无助的状态:可用数据的节点是损坏了,而幸存节点数据又不能用。
如果提供DRBD服务的底层设备建立在LVM逻辑卷上,那么就可以缓解这个问题,可以通过在同步开始的时候自动创建快照,在同步完成之后将会自动移除这个快照。
在重新同步的过程中,为了启用自动快照在资源配置文件中添加以下配置:
resource r0 {
handlers {
before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh";
after-resync-target "/usr/lib/drbd/unsnapshot-resync-target-lvm.sh";
}
}
以下是snapshot-resync-target-lvm.sh脚本文件的内容:
#!/bin/bash
#
# snapshot-resync-target-lvm.sh
# This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
#
# The caller (drbdadm) sets for us:
# DRBD_RESOURCE, DRBD_VOLUME, DRBD_MINOR, DRBD_LL_DISK etc.
#
###########
#
# There will be no resync if this script terminates with an
# exit code != 0. So be carefull with the exit code!
#
if [ -z "$DRBD_RESOURCE" || -z "$DRBD_LL_DISK" ]; then
echo "DRBD_RESOURCE/DRBD_LL_DISK is not set. This script is supposed to"
echo "get called by drbdadm as a handler script"
exit 0
fi
PROG=$(basename $0)
exec > >(exec 2>&- ; logger -t "$PROG[$$]" -p local5.info) 2>&1
echo "invoked for $DRBD_RESOURCE/$DRBD_VOLUME (drbd$DRBD_MINOR)"
TEMP=$(getopt -o p:a:nv --long percent:,additional:,disconnect-on-error,verbose -- "$@")
if [ $? != 0 ]; then
echo "getopt failed"
exit 0
fi
lvdisplay "$DRBD_LL_DISK" > /dev/null || exit 0 # not a LV
SNAP_PERC=10
SNAP_ADDITIONAL=10240
DISCONNECT_ON_ERROR=0
LVC_OPTIONS=""
BE_VERBOSE=0
SNAP_NAME=${DRBD_LL_DISK##*/}-before-resync
DEFAULTFILE="/etc/default/drbd-snapshot"
if [ -f $DEFAULTFILE ]; then
. $DEFAULTFILE
fi
## command line parameters override default file
eval set -- "$TEMP"
while true; do
case $1 in
-p|--percent)
SNAP_PERC="$2"
shift
;;
-a|--additional)
SNAP_ADDITIONAL="$2"
shift
;;
-n|--disconnect-on-error)
DISCONNECT_ON_ERROR=1
;;
-v|--verbose)
BE_VERBOSE=1
;;
--)
break
;;
esac
shift
done
shift # the --
LVC_OPTIONS="$@"
if [[ $0 == *unsnapshot* ]]; then
[ $BE_VERBOSE = 1 ] && set -x
VG_PATH=${DRBD_LL_DISK%/*}
lvremove -f ${VG_PATH}/${SNAP_NAME}
exit 0
else
(
set -e
[ $BE_VERBOSE = 1 ] && set -x
OUT_OF_SYNC=$(sed -ne "/^ *$DRBD_MINOR:/ "'{
n;
s/^.* oos:\([0-9]*\).*$/\1/;
s/^$/0/; # default if not found
p;
q; }' < /proc/drbd) # unit KiB
_BDS=$(blockdev --getsize64 $DRBD_LL_DISK)
BACKING=$((_BDS / 1024)) # unit KiB
SNAP_SIZE=$((OUT_OF_SYNC + SNAP_ADDITIONAL + BACKING * SNAP_PERC / 100))
lvcreate -s -n $SNAP_NAME -L ${SNAP_SIZE}k $LVC_OPTIONS $DRBD_LL_DISK
)
RV=$?
[ $DISCONNECT_ON_ERROR = 0 ] && exit 0
exit $RV
fi
以下是unsnapshot-resync-target-lvm.sh脚本文件的内容:
#!/bin/bash
#
# snapshot-resync-target-lvm.sh
# This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
#
# The caller (drbdadm) sets for us:
# DRBD_RESOURCE, DRBD_VOLUME, DRBD_MINOR, DRBD_LL_DISK etc.
#
###########
#
# There will be no resync if this script terminates with an
# exit code != 0. So be carefull with the exit code!
#
if [ -z "$DRBD_RESOURCE" || -z "$DRBD_LL_DISK" ]; then
echo "DRBD_RESOURCE/DRBD_LL_DISK is not set. This script is supposed to"
echo "get called by drbdadm as a handler script"
exit 0
fi
PROG=$(basename $0)
exec > >(exec 2>&- ; logger -t "$PROG[$$]" -p local5.info) 2>&1
echo "invoked for $DRBD_RESOURCE/$DRBD_VOLUME (drbd$DRBD_MINOR)"
TEMP=$(getopt -o p:a:nv --long percent:,additional:,disconnect-on-error,verbose -- "$@")
if [ $? != 0 ]; then
echo "getopt failed"
exit 0
fi
lvdisplay "$DRBD_LL_DISK" > /dev/null || exit 0 # not a LV
SNAP_PERC=10
SNAP_ADDITIONAL=10240
DISCONNECT_ON_ERROR=0
LVC_OPTIONS=""
BE_VERBOSE=0
SNAP_NAME=${DRBD_LL_DISK##*/}-before-resync
DEFAULTFILE="/etc/default/drbd-snapshot"
if [ -f $DEFAULTFILE ]; then
. $DEFAULTFILE
fi
## command line parameters override default file
eval set -- "$TEMP"
while true; do
case $1 in
-p|--percent)
SNAP_PERC="$2"
shift
;;
-a|--additional)
SNAP_ADDITIONAL="$2"
shift
;;
-n|--disconnect-on-error)
DISCONNECT_ON_ERROR=1
;;
-v|--verbose)
BE_VERBOSE=1
;;
--)
break
;;
esac
shift
done
shift # the --
LVC_OPTIONS="$@"
if [[ $0 == *unsnapshot* ]]; then
[ $BE_VERBOSE = 1 ] && set -x
VG_PATH=${DRBD_LL_DISK%/*}
lvremove -f ${VG_PATH}/${SNAP_NAME}
exit 0
else
(
set -e
[ $BE_VERBOSE = 1 ] && set -x
OUT_OF_SYNC=$(sed -ne "/^ *$DRBD_MINOR:/ "'{
n;
s/^.* oos:\([0-9]*\).*$/\1/;
s/^$/0/; # default if not found
p;
q; }' < /proc/drbd) # unit KiB
_BDS=$(blockdev --getsize64 $DRBD_LL_DISK)
BACKING=$((_BDS / 1024)) # unit KiB
SNAP_SIZE=$((OUT_OF_SYNC + SNAP_ADDITIONAL + BACKING * SNAP_PERC / 100))
lvcreate -s -n $SNAP_NAME -L ${SNAP_SIZE}k $LVC_OPTIONS $DRBD_LL_DISK
)
RV=$?
[ $DISCONNECT_ON_ERROR = 0 ] && exit 0
exit $RV
fi
这两个脚本将会解析$DRBD_RESOURCE环境变量,该变量将被DRBD传递给其调用的处理程序。snapshot-resync-target-lvm.sh脚本文件将会在同步之前为资源中的卷创建一个快照,在这种情况下,如果脚本失败,那么同步不会进行。
在同步完成之后,快照就不再需要了,由脚本文件unsnapshot-resync-target-lvm.sh会移除这个快照。如果在这种情况下,删除快照失败,那么快照将继续存在。
如果出现这种情况,那么应该尽快的检测这种“悬挂”的快照,完整的快照会导致两个快照自身和原始卷失败。
如果在任何时候由于同步源失败于无法恢复的故障中时,那么可以在另一个节点上使用lvconvert -M来恢复最近的快照。
10.4. 配置DRBD资源作为物理卷
为了配置DRBD资源作为物理卷,必须在DRBD设备上创建一个物理卷PV。因此需要在DRBD当前的主节点上执行以下命令:
# pvcreate /dev/drbdX
或者
# pvcreate /dev/drbd/by-res/<resource>/0
需要说明的是,上面的例子是在单卷资源下进行的。
接下来在LVM的配置文件/etc/lvm/lvm.conf中为刚才创建的PV添加配置,在配置文件/etc/lvm/lvm.conf中找到以下部分:
devices {
# Where do you want your volume groups to appear ?
dir = "/dev"
# An array of directories that contain the device nodes you wish
# to use with LVM2.
scan = [ "/dev" ]
# If several entries in the scanned directories correspond to the
# same block device and the tools need to display a name for device,
# all the pathnames are matched against each item in the following
# list of regular expressions in turn and the first match is used.
preferred_names = [ ]
# preferred_names = [ "^/dev/mpath/", "^/dev/[hs]d" ]
# A filter that tells LVM2 to only use a restricted set of devices.
# The filter consists of an array of regular expressions. These
# expressions can be delimited by a character of your choice, and
# prefixed with either an 'a' (for accept) or 'r' (for reject).
# The first expression found to match a device name determines if
# the device will be accepted or rejected (ignored). Devices that
# don't match any patterns are accepted.
# Be careful if there there are symbolic links or multiple filesystem
# entries for the same device as each name is checked separately against
# the list of patterns. The effect is that if any name matches any 'a'
# pattern, the device is accepted; otherwise if any name matches any 'r'
# pattern it is rejected; otherwise it is accepted.
# Don't have more than one filter line active at once: only one gets used.
# Run vgscan after you change this parameter to ensure that
# the cache file gets regenerated (see below).
# If it doesn't do what you expect, check the output of 'vgscan -vvvv'.
# By default we accept every block device:
filter = [ "a/.*/" ]
以上是系统中默认的配置根据对DRBD的使用情况将filter修改为:
filter = [ "a|drbd.*|", "r|.*|" ]
说明:在这个配置里假设了将所有的DRBD设备作为了物理卷使用。
如果想使用堆叠资源作为LVM 物理卷,那么需要更加明确的过滤器。要确保LMV检测到在堆叠资源上的PV签名,而忽略与它们对应的底层块设备,看下面的配置:
filter = [ "a|drbd1[0-9]|", "r|.*|" ]
在这个例子中假设低级(也就是与堆叠资源对应的设备)的DRBD资源使用的子设备号为0到9,而使用的子设备号为10以上。这个配置的最终表现出来的结果是对于在系统中的DRBD设备仅找到/dev/drbd10到/dev/drbd19的设备,而忽略其它的DRBD设备资源。
在修改完成LVM的配置文件lvm.conf之后,必须运行vgscan命令来进行,从而丢弃以前的配置文件缓存并且为PV签名重新扫描设备。
对于特定的系统需要不同的过滤(filter)配置文件以便满足实际的需要,因此需要记住以下两点:
添加接受(也就是包括在内)的DRBD设备,就是说希望使用DRBD设备作为PV;
拒绝接受(也就是排除)相对的底层设备,以免LVM重复查找PV签名;
另外还要禁用LVM缓存设置:
write_cache_state = 0
在禁用了LVM缓存之后还要确保移除任何过期的缓存条目,说白了就是将LVM配置文件的缓存删除,配置文件的缓存为/etc/lvm/cache/.cache,文件的内容简要如下:
[root@s69 ~]# ll /etc/lvm/cache/.cache
-rw------- 1 root root 566 Jul 5 17:03 /etc/lvm/cache/.cache
[root@s69 ~]# more /etc/lvm/cache/.cache
# This file is automatically maintained by lvm.
persistent_filter_cache {
valid_devices=[
"/dev/ram11",
"/dev/loop0",
"/dev/VolGroup00/LogVol01",
"/dev/ram10",
"/dev/VolGroup00/LogVol00",
"/dev/ram12",
"/dev/ram6",
"/dev/ram13",
"/dev/ram14",
"/dev/ram5",
"/dev/mapper/VolGroup00-LogVol00",
"/dev/ram1",
"/dev/sda1",
"/dev/sdb1",
"/dev/mapper/VolGroup00-LogVol01",
"/dev/sdc",
"/dev/ram0",
"/dev/root",
"/dev/ram2",
"/dev/sda2",
"/dev/ram8",
"/dev/ram9",
"/dev/ram15",
"/dev/ram3",
"/dev/ram4",
"/dev/ram7"
]
}
[root@s69 ~]#
不同的安装配置,缓存内容可能不同。
需要说明的一点是,以上的所有操作必须在对点上进行同样的操作。
另外,如果系统的根文件系统构建在LVM之上,那么卷组将会在boot期间初始化ramdisk(initrd)时激活,在这个期间LVM工具将会评估LVM的配置文件lvm.conf中包含的initrd镜像,因此在对该配置文件进行过任何改变后,都要确保更新initrd,根据系统发布的版本可以使用mkinitrd、update-initramfs等工具。
在配置完成新的PV之后,可能会将其添加到某一个卷组,或者是从它上面创建一个新的卷组,然而需要说明的是,在进行以上操作时必须是在DRBD资源的primary角色下操作,例如:
# vgcreate <name> /dev/drbdX
在向卷组中添加DRBD时,同一个卷组中可能混合了DRBD和非DRBD物理卷,这种可能性是存在的,但是不推荐这么做,因为这么做实际上没有任何实际价值。
而如果是在其上创建了VG之后,那么就可以在其中创建逻辑卷,使用lvcreate命令来创建逻辑卷。
10.5. 为现有卷组中添加新的DRBD卷
可能有时候想卷组中添加一个基于DRBD的物理卷,当然在进行这个操作之前首先要将新的卷添加在DRBD的配置文件中,也就是说首先要配置好DRBD。
看下面的资源配置文件,在这个资源配置文件中添加了volume 1:
resource r0 {
volume 0 {
device /dev/drbd1;
disk /dev/sda7;
meta-disk internal;
}
volume 1 {
device /dev/drbd2;
disk /dev/sda8;
meta-disk internal;
}
on alice {
address 10.1.1.31:7789;
}
on bob {
address 10.1.1.32:7789;
}
}
确保每个DRBD上的配置相同,然后执行:
# drbdadm new-minor r0 1
执行以上命令之后将会在资源r0中添加一个新的卷,那就是volume 1,在新的卷添加到DRBD中之后,那么就可以对其初始化,并且将它添加到卷组当中:
# pvcreate /dev/drbd/by-res/<resource>/1
# lvextend <name> /dev/drbd/by-res/<resource>/1
以上的命令将会添加一个新的PV /dev/drbd/by-res/<resource>/1到 <name> 卷组中。
10.6. DRBD与LVM的嵌套配置
如果使用的高级一点,可以使用逻辑卷作为DRBD的后端设备,并且同时使用DRDB设备作为PV。看下面的例子:
准备两分区,名字为/dev/sda1和 /dev/sdb1,这两个分区将作为物理卷;
这两个物理卷将成为卷组local的一部分;
在这个卷组中创建一个10 GiB 的逻辑卷,命名为r0;
这个逻辑卷将成为local 用于DRBD资源的后端设备, 也命名为r0,相当于/dev/drbd0;
该设备将作为另一个卷组,命名为replicated;
replicated卷组将包含两个逻辑卷,命名为foo(4 GiB) 和 bar(6 GiB);
为了启用这个配置,需要按照以下的步骤进行:
在LVM的配置文件/etc/lvm/lvm.conf中设置适当的过滤器
filter = ["a|sd.*|", "a|drbd.*|", "r|.*|"]
上面设置的这个过滤器可以接受任何SCSI和DRBD设备,而忽略其它的设备。
在修改了lvm.conf配置文件之后,必须运行vgscan命令,以便LVM丢弃它的缓存,并且重新扫描PV签名:
禁用LVM缓存设置:
write_cache_state = 0
在禁用了LVM缓存之后,确保移除了陈旧的缓存条目/etc/lvm/cache/.cache。
接下来对分区/dev/sda1和 /dev/sdb1进行初始化PV:
# pvcreate /dev/sda1
Physical volume "/dev/sda1" successfully created
# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
创建卷组local,由上一步初始化完成的两个PV组成:
# vgcreate local /dev/sda1 /dev/sda2
Volume group "local" successfully created
创建逻辑卷作为DRBD的后端设备:
# lvcreate --name r0 --size 10G local
Logical volume "r0" created
在对点的机器上重复以上步骤;
编辑配置文件/etc/drbd.conf 创建一个新的资源,并且命名为r0:
resource r0 {
device /dev/drbd0;
disk /dev/local/r0;
meta-disk internal;
on <host> { address <address>:<port>; }
on <host> { address <address>:<port>; }
}
在创建了新的资源配置之后,要确保将该配置拷贝到对点的机器上。
接下来进行初始化资源,按照“第一次启动DRBD资源”部分的步骤在两个节点上进行;
然后提升资源的角色(在其中的一个节点上):
# drbdadm primary r0
接下来在上一步提升为primary角色的资源上作为一个新的物理卷进行DRBD设备初始化::
# pvcreate /dev/drbd0
Physical volume "/dev/drbd0" successfully created
在两个节点上分别使用上一步初始化的物理卷创建一个卷组,名字为replicated:
# vgcreate replicated /dev/drbd0
Volume group "replicated" successfully created
最后,在新创建的卷组中创建新的逻辑卷:
# lvcreate --name foo --size 4G replicated
Logical volume "foo" created
# lvcreate --name bar --size 6G replicated
Logical volume "bar" created
在上面的命令中创建了两个逻辑卷foo和bar,即/dev/replicated/foo和/dev/replicated/bar。
将VG切换到另一个节点
要在另一个节点上使得卷组可见,那么首先要在primary节点上进行以下一系列命令:
# vgchange -a n replicated
0 logical volume(s) in volume group "replicated" now active
# drbdadm secondary r0
然后再在另一个节点(仍旧为secondary角色)上执行以下命令:
# drbdadm primary r0
# vgchange -a y replicated
2 logical volume(s) in volume group "replicated" now active
在执行以上的命令之后,在另一个节点上(现在是primary角色了)的块设备/dev/replicated/foo和 /dev/replicated/bar将会变为可见。
10.7.使用Pacemaker实现高可用
Pacemaker 的LVM资源代理正是为这个目的设计的。
为了将一个已经存在的后端基于卷组管理的DRBD使用Pacemaker管理,那么在crm shell中使用以下命令:
primitive p_drbd_r0 ocf:linbit:drbd \
params drbd_resource="r0" \
op monitor interval="29s" role="Master" \
op monitor interval="31s" role="Slave"
ms ms_drbd_r0 p_drbd_r0 \
meta master-max="1" master-node-max="1" \
clone-max="2" clone-node-max="1" \
notify="true"
primitive p_lvm_r0 ocf:heartbeat:LVM \
params volgrpname="r0"
colocation c_lvm_on_drbd inf: p_lvm_r0 ms_drbd_r0:Master
order o_drbd_before_lvm inf: ms_drbd_r0:promote p_lvm_r0:start
commit
在commit命令执行之后,那么Pacemaker将会自动使得r0卷组在当前任何Primary (Master)节点可见。
|
|