免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7456 | 回复: 4
打印 上一主题 下一主题

DRBD使用LVM [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-19 11:35 |只看该作者 |倒序浏览
本帖最后由 ltgzs777 于 2013-02-19 11:36 编辑

DRBD使用LVM

    DRBD可以和LVM2协同工作,包括以下内容:

        将LVM逻辑卷作为DRBD的后端设备;
        使用DRBD设备作为LVM的物理卷;
        前两者的组合;
   
10.1. LVM 简介

LVM是商业Unix的一项高级磁盘管理工具,其功能非常强大,后来LVM被移植到了Linux操作系统上。使用LVM的系统中,可以在生产运行环境下在线扩展硬盘分区,还可以在卸载分区的情况下缩小分区大小,以及将一个分区从一个块磁盘转移到另一块磁盘等等,这些操作都是在生产环境中进行的,而LVM自豪的一点是它不会对生产环境造成任何影响。

    LVM2是一个在Linux设备映射框架环境下实施的逻辑卷管理。LVM现在两个版本,一个是LVM1和LVM2,需要说明的是在没有LVM2标准之前是没有LVM1一说的,而是在有了LVM2之后将前LVM追认为LVM1。为了更好的理解LVM,下面我们来了解一下与LVM相关的基本概念:

物理卷(PV):物理卷是由LVM管理的基本块设备,它是处于LVM系统的最底层,可以是一个完整的磁盘,也可以是一个有效的分区,或者是与分区具有相同功能的设备,例如RAID,如果是在整个硬盘上建立PV,那么不需要在该磁盘上创建任何分区,而如果是在分区上创建PV,那么首先要在磁盘上创建分区,一般的做法是在硬盘上创建分区表,为使用LVM管理的分区创建专有的分区类型,分区类型为Linux LVM (签名为 0x8E)。

卷组(VG): 卷组是LVM管理的基本单元,一个卷组可以包括一个或者是多个PV,但至少要包含一个PV。每一个VG都有一个唯一的名字,VG的扩展可在在系统运行时进行,就是说在运行的VG中可以加入其它的PV,或者扩大一个已经存在的PV。

逻辑卷(LV):LV可以在运行的VG中创建,并且在内核的其它部分会作为一个有效的块设备出现,因此它们可以被作为文件系统使用,或者是作为其它的任何块设备使用,另外,在LV运行时,也可以在线调整它们的大小,并且它们也可以从一个PV移动到另一个PV(只要PV是同一个VG的一部分)。

快照逻辑卷(SLV):快照是LV运行中时间点上的一个临时拷贝,创建快照是一个非常快的操作,几乎瞬间完成,即使原来的LV(原始卷)具有的几百G的大小。通常快照需要的空间要少于原始的LV。

图    解:


    查看当前系统中是否已经安装了lvm:

[root@s200 ~]# rpm -qa|grep lvm                                
lvm2-2.02.95-10.el6.i686
lvm2-libs-2.02.95-10.el6.i686
[root@s200 ~]#
   
    没问题,已经安装了,一般来说现代的linux都使用了LVM管理。对于使用LVM管理,由于是一种底层的技术,因此同样需要Linux内核的支持,运行下面的命令查看内核支持情况:

[root@s200 ~]# lsmod |grep dm_mod
dm_mod                 67821  11 dm_mirror,dm_log
[root@s200 ~]#
   
    没错,内核是支持的,默认情况下linux内核支持lvm,如果没有支持,那么需要重新编译内核。

    执行以下命令,可以看到lvm提供了相当多的命令:

[root@s200 ~]# rpm -qa|grep lvm                                
lvm2-2.02.95-10.el6.i686
lvm2-libs-2.02.95-10.el6.i686
[root@s200 ~]# rpm -ql lvm2-2.02.95-10.el6.i686
/etc/lvm
…… //省略
/sbin/fsadm
/sbin/lvchange
/sbin/lvconvert
/sbin/lvcreate
/sbin/lvdisplay
/sbin/lvextend
/sbin/lvm
/sbin/lvmchange
/sbin/lvmconf
/sbin/lvmdiskscan
/sbin/lvmdump
/sbin/lvmetad
/sbin/lvmsadc
/sbin/lvmsar
/sbin/lvreduce
/sbin/lvremove
/sbin/lvrename
/sbin/lvresize
/sbin/lvs
/sbin/lvscan
/sbin/pvchange
/sbin/pvck
/sbin/pvcreate
/sbin/pvdisplay
/sbin/pvmove
/sbin/pvremove
/sbin/pvresize
/sbin/pvs
/sbin/pvscan
/sbin/vgcfgbackup
/sbin/vgcfgrestore
/sbin/vgchange
/sbin/vgck
/sbin/vgconvert
/sbin/vgcreate
/sbin/vgdisplay
/sbin/vgexport
/sbin/vgextend
/sbin/vgimport
/sbin/vgimportclone
/sbin/vgmerge
/sbin/vgmknodes
/sbin/vgreduce
/sbin/vgremove
/sbin/vgrename
/sbin/vgs
/sbin/vgscan
/sbin/vgsplit
…… //省略
/var/lock/lvm
/var/run/lvm
[root@s200 ~]#
   
    在这里不打算一一讲述它们的用法,在使用时再进行说明。

10.2. 使用逻辑卷作为DRBD后端设备

在linux系统中,已经存在的逻辑卷就一种是块设备,因此当然也就能够将它作为DRBD的后端设备。要使用逻辑卷,首先要简单的创建逻辑卷,然后再在像DRBD使用其它设备一样进行设备初始化就可以了。

    下面来看一个例子,在这个例子中,DRBD所在的两个节点上启用了LVM管理,并且已经存在的foo卷组,现在就是要在这个卷组下创建一个bar的逻辑卷,然后用它做为DRBD资源r0的后端块设备存储。

添加磁盘并进行分区

    首先停机根据使用的硬件情况也有可能不用停机添加磁盘(包括RAID),然后再对磁盘进行分区:

[root@s201 ~]# fdisk  -c -u /dev/sdb

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First sector (2048-156249999, default 204:
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-156249999, default 156249999): +10G

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First sector (20973568-156249999, default 2097356:
Using default value 20973568
Last sector, +sectors or +size{K,M,G} (20973568-156249999, default 156249999): +20G

Command (m for help): p

Disk /dev/sdb: 80.0 GB, 80000000000 bytes
255 heads, 63 sectors/track, 9726 cylinders, total 156250000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x4b3ff212

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   83  Linux
/dev/sdb2        20973568    62916607    20971520   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@s201 ~]#
   
    在上面的操作中对磁盘sdb分了两个区,即/dev/sdb1和/dev/sdb2,但是没有使用完全部磁盘空间,而且每个分区的大小也很小,因为这只是用于讲述,在实际的使用中往往2T磁盘也就是一个区而已。另外我们注意到分区类型为83,为了使用LVM管理,最好转换为8e类型,因此通过以下命令进行转换:

[root@s201 ~]# fdisk  -c -u /dev/sdb

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/sdb: 80.0 GB, 80000000000 bytes
255 heads, 63 sectors/track, 9726 cylinders, total 156250000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x4b3ff212

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   8e  Linux LVM
/dev/sdb2        20973568    62916607    20971520   8e  Linux LVM

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@s201 ~]#
   
    同样,对/dev/sdb2也进行转换。

创建物理卷

    在创建物理卷时首先要确认要被创建的分区是否已经被占用:

[root@s201 ~]# pvdisplay /dev/sdb1
  No physical volume label read from /dev/sdb1
  Failed to read physical volume "/dev/sdb1"
[root@s201 ~]# pvdisplay /dev/sdb2
  No physical volume label read from /dev/sdb2
  Failed to read physical volume "/dev/sdb2"
[root@s201 ~]#
   

[root@s201 ~]# pvcreate /dev/sdb1 /dev/sdb2
  Writing physical volume data to disk "/dev/sdb1"
  Physical volume "/dev/sdb1" successfully created
  Writing physical volume data to disk "/dev/sdb2"
  Physical volume "/dev/sdb2" successfully created
[root@s201 ~]#
   
[root@s201 ~]#  pvdisplay /dev/sdb1 /dev/sdb2      
  "/dev/sdb1" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               X7OiT3-4CFP-BNY6-MeUN-TZye-7HVy-MHSPwI
   
  "/dev/sdb2" is a new physical volume of "20.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb2
  VG Name               
  PV Size               20.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               cWniuK-xUCL-yFSH-alE8-Q4nr-hihZ-Plgpd8
   
[root@s201 ~]#
   
    可以通过pvremove命令移除一个物理卷:

[root@s201 ~]# pvremove /dev/sdb2
  Labels on physical volume "/dev/sdb2" successfully wiped
[root@s201 ~]# pvdisplay /dev/sdb2
  No physical volume label read from /dev/sdb2
  Failed to read physical volume "/dev/sdb2"
[root@s201 ~]#
   
创建卷组

    有了物理卷就可以创建卷组(一个卷组至少要有一个物理卷):

[root@s201 ~]# vgcreate vg_drbd /dev/sdb1
  Volume group "vg_drbd" successfully created
[root@s201 ~]#
   
    在物理卷组被成功创建之后查看一下该物理卷组:

[root@s201 ~]# vgdisplay  -v vg_drbd  
    Using volume group(s) on command line
    Finding volume group "vg_drbd"
  --- Volume group ---
  VG Name               vg_drbd
  System ID            
  Format                lvm2
  Metadata Areas        1
  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                1
  Act PV                1
  VG Size               10.00 GiB
  PE Size               4.00 MiB
  Total PE              2559
  Alloc PE / Size       0 / 0   
  Free  PE / Size       2559 / 10.00 GiB
  VG UUID               3r95LS-vwDE-eZ8G-MqQ2-jq20-RTre-Zs6ysy
   
  --- Physical volumes ---
  PV Name               /dev/sdb1     
  PV UUID               X7OiT3-4CFP-BNY6-MeUN-TZye-7HVy-MHSPwI
  PV Status             allocatable
  Total PE / Free PE    2559 / 2559
   
[root@s201 ~]#
   
    从上面看出,当前的物理卷组为vg_drbd,大小为10G,只包括了/dev/sdb1一个物理卷。现在再看/dev/sdb1的信息:

[root@s201 ~]# pvdisplay /dev/sdb1      
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               vg_drbd
  PV Size               10.00 GiB / not usable 4.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              2559
  Free PE               2559
  Allocated PE          0
  PV UUID               X7OiT3-4CFP-BNY6-MeUN-TZye-7HVy-MHSPwI
   
[root@s201 ~]#
   
    从这里我们看到/dev/sdb1已经属于vg_drbd物理卷了。

创建逻辑卷

    在创建好物理卷之后,就可以在物理卷组中添加逻辑卷了,创建逻辑卷的原则是“按需分配,动态调整”,说的明白一点就是不要一次性将全部物理卷的空间分配给一个或者是几个逻辑卷,而是要根据使用情况去动态的扩展使用的空间。

[root@s201 ~]# lvcreate -L 5G -n drbd_nfs vg_drbd
  Logical volume "drbd_nfs" created
[root@s201 ~]# lvcreate -L 3G -n drbd_mysql vg_drbd
  Logical volume "drbd_mysql" created
[root@s201 ~]#
   
    在创建了逻辑卷之后,再次查看物理卷组的信息:
   
[root@s201 ~]# vgdisplay  -v vg_drbd            
    Using volume group(s) on command line
    Finding volume group "vg_drbd"
  --- Volume group ---
  VG Name               vg_drbd
  System ID            
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               10.00 GiB
  PE Size               4.00 MiB
  Total PE              2559
  Alloc PE / Size       1280 / 5.00 GiB
  Free  PE / Size       1279 / 5.00 GiB
  VG UUID               3r95LS-vwDE-eZ8G-MqQ2-jq20-RTre-Zs6ysy
   
  --- Logical volume ---
  LV Path                /dev/vg_drbd/drbd_nfs
  LV Name                drbd_nfs
  VG Name                vg_drbd
  LV UUID                xxOtOG-hrft-P7Gv-d5vr-jKTy-89ZQ-CNtfl5
  LV Write Access        read/write
  LV Creation host, time s201, 2012-12-26 10:21:11 +0800
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:3

  --- Logical volume ---
  LV Path                /dev/vg_drbd/drbd_mysql
  LV Name                drbd_mysql
  VG Name                vg_drbd
  LV UUID                HCnMvy-5D6t-y772-YA3A-QBRi-m7wm-3XvcJV
  LV Write Access        read/write
  LV Creation host, time s201, 2012-12-26 10:25:43 +0800
  LV Status              available
  # open                 0
  LV Size                3.00 GiB
  Current LE             768
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:4

  --- Physical volumes ---
  PV Name               /dev/sdb1     
  PV UUID               X7OiT3-4CFP-BNY6-MeUN-TZye-7HVy-MHSPwI
  PV Status             allocatable
  Total PE / Free PE    2559 / 1279
   
[root@s201 ~]#

    从上面可以看出包括了两个逻辑卷及其相关的信息,例如逻辑卷属于的物理卷组、逻辑卷的名字及路径等。

创建文件系统

    在逻辑卷建立好之后就可以在其上创建文件系统了:

[root@s201 ~]# mkfs.ext4 /dev/vg_drbd/drbd_nfs
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Writing inode tables: done                           
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 35 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@s201 ~]#

    同样格式化/dev/vg_drbd/drbd_mysql设备。

挂载文件系统

    对于LVM管理的最后一步来说就是挂载文件系统,也就将前面格式化完成之后的设备挂载带Linux的目录下,例如:

[root@s201 ~]# mkdir /drbd_nfs
[root@s201 ~]# mount /dev/vg_drbd/drbd_nfs /drbd_nfs
   
    但是在这里(由于DRBD使用的原始设备)我们用不着挂载文件系统这一步,只是为了描述一个完整的LVM管理在这讲述了这一步。

    按照DRBD官方文档的指导如下:

首先来创建逻辑卷:

lvcreate --name bar --size 10G foo
Logical volume "bar" created
   
    这是要创建一个名字叫做“bar”的逻辑卷,大小为10G,下面执行这个命令:

[root@s201 ~]# lvcreate --name bar --size 10G vg_drbd
  Volume group "vg_drbd" has insufficient free space (511 extents): 2560 required.
[root@s201 ~]#
   
    显然现在的物理卷组空间不够了,下面首先来扩展物理卷组空间,实际上也是为了完善LVM管理来讲述物理卷的扩展。

向物理卷组中添加物理卷

    下面我们将为了物理卷/dev/sdb2添加到vg_drbd物理卷组中:

[root@s201 ~]# vgextend vg_drbd /dev/sdb2
  No physical volume label read from /dev/sdb2
  Writing physical volume data to disk "/dev/sdb2"
  Physical volume "/dev/sdb2" successfully created
  Volume group "vg_drbd" successfully extended
[root@s201 ~]#
   
   
[root@s201 ~]# vgdisplay  -v vg_drbd
    Using volume group(s) on command line
    Finding volume group "vg_drbd"
  --- Volume group ---
  VG Name               vg_drbd
  System ID            
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               29.99 GiB
  PE Size               4.00 MiB
  Total PE              7678
  Alloc PE / Size       2048 / 8.00 GiB
  Free  PE / Size       5630 / 21.99 GiB
  VG UUID               3r95LS-vwDE-eZ8G-MqQ2-jq20-RTre-Zs6ysy
   
…… //省略
   
  --- Physical volumes ---
  PV Name               /dev/sdb1     
  PV UUID               X7OiT3-4CFP-BNY6-MeUN-TZye-7HVy-MHSPwI
  PV Status             allocatable
  Total PE / Free PE    2559 / 511
   
  PV Name               /dev/sdb2     
  PV UUID               b14GgJ-gCMG-mk3I-B7CW-PPXM-wm2x-Pr60qd
  PV Status             allocatable
  Total PE / Free PE    5119 / 5119
   
[

论坛徽章:
0
2 [报告]
发表于 2013-02-19 11:36 |只看该作者
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)节点可见。

论坛徽章:
71
15-16赛季CBA联赛之同曦
日期:2018-08-23 15:41:42辰龙
日期:2014-08-15 09:07:43狮子座
日期:2014-06-03 13:55:33亥猪
日期:2014-06-02 11:17:08巨蟹座
日期:2014-05-06 10:02:03午马
日期:2014-05-04 08:18:27亥猪
日期:2014-04-29 11:11:32技术图书徽章
日期:2014-04-24 15:51:26技术图书徽章
日期:2014-04-17 11:01:53辰龙
日期:2014-04-15 12:45:46亥猪
日期:2014-04-11 09:06:23射手座
日期:2014-04-01 15:28:10
3 [报告]
发表于 2013-02-19 15:00 |只看该作者
写的不错,赞

论坛徽章:
0
4 [报告]
发表于 2013-02-19 15:28 |只看该作者
       谢谢阅读!

求职 : Linux运维
论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:15:0815-16赛季CBA联赛之山东
日期:2016-10-31 10:40:10综合交流区版块每日发帖之星
日期:2016-07-06 06:20:00IT运维版块每日发帖之星
日期:2016-02-08 06:20:00数据库技术版块每日发帖之星
日期:2016-01-15 06:20:00IT运维版块每日发帖之星
日期:2016-01-15 06:20:00IT运维版块每日发帖之星
日期:2016-01-10 06:20:00黄金圣斗士
日期:2015-11-24 10:45:10IT运维版块每日发帖之星
日期:2015-09-01 06:20:00IT运维版块每日发帖之星
日期:2015-08-13 06:20:00IT运维版块每日发帖之星
日期:2015-07-30 09:40:012015年亚洲杯之巴勒斯坦
日期:2015-05-05 10:19:03
5 [报告]
发表于 2013-03-18 21:55 |只看该作者
好文要顶!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP