lvm2線性卷轉換爲mirror卷

環境:

    兩臺華爲服務器,一臺主存華爲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名字變化的問題》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章