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