环境:

    两台华为服务器,一台主存华为18500,一台备存5300,多路径软件为华为的power path

    操作系统是RHEL 6.5,做了集群,集群软件是RHCS,应用为ORACLE,主备模式


客户的想法:

    客户想在主存和备存上各划一个500G的lun给oracle数据库服务器(2台,做ha),然后做成镜像卷的形式,当有数据写入的时候,同时向mirror卷的两个lun上写,这样,当主存或者备存坏掉的时候,数据不会丢失,并且应用不会中断,类似raid1的形式。

我们的想法:

    我们不推荐这么做,因为如果要做mirror卷,主存和备存应该是型号完全相同的存储设备,这样两个lun的IO才相等,像这里的18500+5300这种情况,IO不同,肯定会以5300的IO为准,这样就失去了18500作为高端设备的意义。我们跟客户说明利害关系后,同意只用一台18500作为存储设备,划分几个lun给两台服务器做集群,安装oracle,实施过程正常结束。

    之后客户认为还是要做成mirror卷比较好,保证可用性,性能低一些没关系,也足够满足业务的正常运行。

    因此,我们只能在已经配置了线性卷的基础上将该卷转换为mirror卷(已经配置好rhcs和oracle)

    之后我查看了redhat的lvm文档,可以使用lvconvert来实现这一功能,但仅限于将线性卷转换为mirror卷,或者将mirror卷拆成线性卷。如果你要将线性卷修改为raid5卷,应该是不支持的,至少文档上没有这方面的说明。


具体过程是:

    原有的500G的lun不动,仍由18500映射给两个节点

    在5300上划分600G的lun,分别映射给两台服务器

    之后做lvm convert:由于已经在原lun上安装了RHCS并配置了ORACLE,因此需要先将集群关闭,之后在对lvm做操作,具体过程在下边有说明


原理部分:

    做mirror的pv和新添加的lun(也做成pv)不能是一样大的,linux不允许一样大,因为在linux的lvm2中(rhel6.5使用的就是lvm2)如果你将普通的线性卷修改为mirror卷,就需要单独添加一个log部分,log部分需要占用一定的空间

该log部分可以放在:

    1 内存中:需要在lvconvert命令中指定参数才能将log放到内存中

    2 放到磁盘上:这里又有两种情况:

        1 单独划分一个lun,做成pv,专门用于存放log

        2 不单独建立一个lun,而是使用默认的方式,将log放到新添加的第二个lun上

本项目中,我用的是第二种方式:将log放到新加的lun上。

所以第二个lun(lvm的mirror卷)的容量应该比第一个lun大,因为第二个lun上包括了:和第一个lun完全相同的数据部分+log部分。但是第二个lun比第一个lun大多少,就不容易判断了,在实际的项目中我的原lun是500G,新lun给设置为了600G,log肯定用不了100g,可能10g都用不到,但在lvm的配置文档上没有写明log该设置为多大,为了保险,设置100g足够了

log的作用:其实这个log就是在记录两个lun之间写数据的情况,并且只有当需要在两个lun之间同步数据的时候才需要用到这个log,这个log就是一个bitmap

mirror卷的特点和raid1类似,会同时往两个pv上写数据。假如有一个lun坏了,那就只能往一个lun上写了,当你将第二个lun修理好了的话,需要重新加入到lvm中,此时mirror卷会做一个同步,将第一个lun上多写的部分同步到第二个lun中。

    例如,正常情况下,500G的mirror卷我写了100G,这100G的数据同时写到了两个lun上,之后第二个lun(磁盘)坏了,你需要拿去修理,此时第一个lun继续接收数据,例如写了50G的数据。当第二个lun(磁盘)修理好重新加入到mirror卷中,需要将这50G的数据同步到第二个lun上。

    那lvm怎么知道哪50G的数据是多写的部分呢,就需要用log来记录了。log会记录两个lun(pv)数据分别写到了哪里,当做数据同步的时候,需要查看log才能知道同步哪些数据到另一个lun上。


注意:如果新加的lun和原lun一样大,则在你执行lvconvert的时候,会报如下错误:

[root@server ~]# lvconvert -m1 vg_test/lv_test

  Insufficient suitable allocatable extents for logical volume : 511 more required

  Unable to allocate extents for mirror(s).

[root@server ~]#

报这个错误是因为新添加的lun和之前的lun一样大,即:需要做mirror的pv和新添加的lun(也做成pv)是一样大的,linux不允许这样


【操作步骤】

step1:在5300存储上配置600G的lun,并映射给两个node


step2:因为这两个node做的是RHCS集群,因此需要先将集群关闭

node1/node2

    chkconfig cman off

    chkconfig rgmanager off

    service clvmd stop

    service cman stop

    service rgmanager stop


之后重启两个node的OS。RHEL6认盘时最好执行重启操作,保险起见。

重启完两个node后发现:

    两个node都是别到了/dev/sdc,并且是600G大小,两个node上之前的lun(18500映射过来的lun)都是500G,都是正常的


step3:在node1上将新lun加到vg中来===node2执行scan即可

[root@node1 ~]# pvcreate /dev/sdc

  Physical volume "/dev/sdc" successfully created

[root@node1 ~]# pvs

  PV         VG        Fmt  Attr PSize   PFree  

  /dev/sdb   vg_oracle lvm2 a--  500.00g      0

  /dev/sdc             lvm2 a--  600.00g 600.00g

[root@node1 ~]# vgextend vg_oracle /dev/sdc

  Volume group "vg_oracle" successfully extended

[root@node1 ~]# vgs

  VG        #PV #LV #SN Attr   VSize VFree  

  vg_oracle   2   1   0 wz--n- 1.07t 600.00g


做mirror的两个pv需要在同一个vg中,跨vg的镜像卷是否支持可以查看文档,没做过


[root@node2 ~]# vgscan

  Reading all physical volumes.  This may take a while...

  Found volume group "vg_oracle" using metadata type lvm2

[root@node2 ~]# vgs

  VG        #PV #LV #SN Attr   VSize VFree  

  vg_oracle   2   1   0 wz--n- 1.07t 600.00g

[root@node1 ~]# lvs

  LV        VG        Attr       LSize   Pool Origin Data%  Move Log Cpy%Sync Convert

  lv_oracle vg_oracle -wi------- 500.00g         

[root@node2 ~]# lvs

  LV        VG        Attr       LSize   Pool Origin Data%  Move Log Cpy%Sync Convert

  lv_oracle vg_oracle -wi------- 500.00g     


step4:确保关闭了oracle和rhcs,并且在两个node上看到的卷的信息一致

[root@node1 ~]# ps -ef |grep smon

root     60662 59001  0 15:02 pts/0    00:00:00 grep smon

[root@node1 ~]# clustat -i 1

Could not connect to CMAN: No such file or directory

[root@node2 ~]# ps -ef |grep smon

root     60367 58736  0 15:03 pts/0    00:00:00 grep smon

[root@node2 ~]# clustat -i 1

Could not connect to CMAN: No such file or directory

[root@node1 ~]# pvs

  PV         VG        Fmt  Attr PSize   PFree  

  /dev/sdb   vg_oracle lvm2 a--  500.00g      0

  /dev/sdc   vg_oracle lvm2 a--  600.00g 600.00g

[root@node2 ~]# pvs

  PV         VG        Fmt  Attr PSize   PFree  

  /dev/sdb   vg_oracle lvm2 a--  500.00g      0

  /dev/sdc   vg_oracle lvm2 a--  600.00g 600.00g


step5:执行转换:将原有的线性卷转换为mirror卷

[root@node1 ~]# lvconvert -m1 vg_oracle/lv_oracle

  Conversion starts after activation.

[root@node1 ~]#

[root@node1 ~]#

因为lv_oracle不是激活状态的,所以你会看到命令马上就执行完毕了,但此时数据并没有进行复制,必须等到vg active时才可以执行数据复制

如果你的lvm是挂载的并且正在有人使用该lvm,此时你lvconvert的话,会马上执行数据复制,不过可能对在线业务会有影响,建议先对lvm执行完convert操作后,再上线业务


step6:查看卷的转换过程

可以看到卷已经带有mirror标记了。/dev/sdb和/dev/sdc组成了mirror卷,并且log放在了/dev/sdc上

由于是在node1上操作的(node2只需要重新scan即可),所以后台进程(拷贝数据的百分比)只能在node1上看到


[root@node1 ~]# lvs -a -o name,copy_percent,devices vg_oracle

  LV                   Cpy%Sync Devices                                    

  lv_oracle                     lv_oracle_mimage_0(0),lv_oracle_mimage_1(0)

  [lv_oracle_mimage_0]          /dev/sdb(0)                                

  [lv_oracle_mimage_1]          /dev/sdc(0)                                

  [lv_oracle_mlog]              /dev/sdc(127999)          

[root@node1 ~]# lvs

  LV        VG        Attr       LSize   Pool Origin Data%  Move Log            Cpy%Sync Convert

  lv_oracle vg_oracle mwi---m--- 500.00g                         lv_oracle_mlog                 

[root@node1 ~]# pvs

  PV         VG        Fmt  Attr PSize   PFree  

  /dev/sdb   vg_oracle lvm2 a--  500.00g      0

  /dev/sdc   vg_oracle lvm2 a--  600.00g 100.00g

[root@node1 ~]# vgs

  VG        #PV #LV #SN Attr   VSize VFree  

  vg_oracle   2   1   0 wz--n- 1.07t 100.00g


[root@node2 ~]# lvs -a -o name,copy_percent,devices vg_oracle

  LV                   Cpy%Sync Devices                                    

  lv_oracle                     lv_oracle_mimage_0(0),lv_oracle_mimage_1(0)

  [lv_oracle_mimage_0]          /dev/sdb(0)                                

  [lv_oracle_mimage_1]          /dev/sdc(0)                                

  [lv_oracle_mlog]              /dev/sdc(127999)          

[root@node2 ~]# lvs

  LV        VG        Attr       LSize   Pool Origin Data%  Move Log            Cpy%Sync Convert

  lv_oracle vg_oracle mwi---m--- 500.00g                         lv_oracle_mlog                 

[root@node2 ~]# pvs

  PV         VG        Fmt  Attr PSize   PFree  

  /dev/sdb   vg_oracle lvm2 a--  500.00g      0

  /dev/sdc   vg_oracle lvm2 a--  600.00g 100.00g

[root@node2 ~]# vgs

  VG        #PV #LV #SN Attr   VSize VFree  

  vg_oracle   2   1   0 wz--n- 1.07t 100.00g


只有当vgchange -ay之后,后台进程才会开始执行复制操作,可以看到进度

[root@node1 ~]# vgchange -ay vg_oracle

  1 logical volume(s) in volume group "vg_oracle" now active

[root@node1 ~]# vgs

  VG        #PV #LV #SN Attr   VSize VFree  

  vg_oracle   2   1   0 wz--n- 1.07t 100.00g

[root@node1 ~]# lvs

  LV        VG        Attr       LSize   Pool Origin Data%  Move Log            Cpy%Sync Convert

  lv_oracle vg_oracle mwi-a-m--- 500.00g                         lv_oracle_mlog     0.08        

[root@node1 ~]# lvs -a -o name,copy_percent,devices vg_oracle

  LV                   Cpy%Sync Devices                                    

  lv_oracle                0.27 lv_oracle_mimage_0(0),lv_oracle_mimage_1(0)

  [lv_oracle_mimage_0]          /dev/sdb(0)                                

  [lv_oracle_mimage_1]          /dev/sdc(0)                                

  [lv_oracle_mlog]              /dev/sdc(127999)                           

[root@node1 ~]# lvs -a -o name,copy_percent,devices vg_oracle

  LV                   Cpy%Sync Devices                                    

  lv_oracle                0.52 lv_oracle_mimage_0(0),lv_oracle_mimage_1(0)

  [lv_oracle_mimage_0]          /dev/sdb(0)                                

  [lv_oracle_mimage_1]          /dev/sdc(0)                                

  [lv_oracle_mlog]              /dev/sdc(127999)               

            

可以发现,vg active的时候复制会在后台自动开始,等到100%的时候就OK了


[root@node1 ~]# lvs -a -o name,copy_percent,devices vg_oracle

  LV                   Cpy%Sync Devices                                    

  lv_oracle               12.15 lv_oracle_mimage_0(0),lv_oracle_mimage_1(0)

  [lv_oracle_mimage_0]          /dev/sdb(0)                                

  [lv_oracle_mimage_1]          /dev/sdc(0)                                

  [lv_oracle_mlog]              /dev/sdc(127999)    


[root@node2 ~]# lvs -a -o name,copy_percent,devices vg_oracle

  LV                   Cpy%Sync Devices                                    

  lv_oracle                     lv_oracle_mimage_0(0),lv_oracle_mimage_1(0)

  [lv_oracle_mimage_0]          /dev/sdb(0)                                

  [lv_oracle_mimage_1]          /dev/sdc(0)                                

  [lv_oracle_mlog]              /dev/sdc(127999)           

node2上是看不到进度的


[root@node1 ~]# lvs -a -o name,copy_percent,devices vg_oracle

  LV                   Cpy%Sync Devices                                    

  lv_oracle              100.00 lv_oracle_mimage_0(0),lv_oracle_mimage_1(0)

  [lv_oracle_mimage_0]          /dev/sdb(0)                                

  [lv_oracle_mimage_1]          /dev/sdc(0)                                

  [lv_oracle_mlog]              /dev/sdc(127999)      

这一过程非常费时间,本项目中PC服务器大概花费了80-90分钟


[root@node2 ~]# lvs

  LV        VG        Attr       LSize   Pool Origin Data%  Move Log            Cpy%Sync Convert

  lv_oracle vg_oracle mwi---m--- 500.00g                         lv_oracle_mlog       


step7:在两个node上开启cman/rgmanager两个进程开机运行

    chkconfig cman on

    chkconfig rgmanager on


step8:重启两个node后就OK了,RHCS正常,oracle正常,lvm是mirror卷了


后来还发现了一个问题:两个node上的两个lun的名字不一致,解决过程相见另一篇文章《rhcs中解决lun名字变化的问题》