使用 HA-LVM 實現高可用儲存

TP_funny發表於2015-03-11
他們為什麼不能這樣做呢?這種做法具有非常低的成本並且可以以更有利的方式來靈活地構建生態系統。唯一的限制是管理員想象的空間有多大。然而,一個問題要問:“與專利的和更昂貴的解決方案相比較,這樣的定製解決方案表現如何呢?”

開放原始碼專案已經發展成熟到了具有足夠的競爭力,並提供相同的功能豐富的解決方案,包括卷管理,資料快照,重複資料刪除等。雖然經常被忽視的,長期支援的概念是高可用性。

高可用性的想法很簡單:消除任何單點故障。這保證瞭如果一個伺服器節點或一個底層儲存路徑停止工作了(計劃或非計劃的),還依然可以提供資料請求服務。現在儲存部署的解決方案都是多層結構的,並且是可以為高可用性進行配置的,這就是為什麼本文嚴格關注HA-LVM。

HA-LVM
高可用性的邏輯卷管理器(HA-LVM)已經整合了LVM的套件。它提供共享卷一個故障轉移的配置,也就是說如果叢集中的一臺伺服器出現故障或進行維護,共享儲存配置將故障轉移到輔助伺服器上,所有I / O請求將恢復,不間斷的。HA-LVM配置是一個主/從配置。這意味著在任何一個時間只有一個伺服器訪問共享儲存。在許多情況下,這是一種理想的方法,因為一些先進的LVM的功能,如快照和重複資料刪除,在主/從環境下是不支援的(當多個伺服器訪問共享儲存)。

CLVM(LVM叢集的守護程式)是HA-LVM一個非常重要的元件。當啟動HA-LVM後,CLVM守護程式會防止有多臺機器同時對共享儲存做修 改,否則對LVM的後設資料和邏輯卷會造成破壞。儘管在採用主從配置時,這樣的問題並不需要太多擔心。要做到這一點,守護程式得依賴於分佈鎖管理器 (DLM). DLM的目的也是協助CLVM訪問磁碟。

下面會舉一個2臺伺服器的叢集訪問一個外部儲存的例子(圖一)。 這個外部儲存可以是採用磁碟陣列形勢的(RAID-enabled) 或者磁碟簇(JBOD)形式的磁碟驅動器,可以是通過光纖通道(Fibre Channel),序列連線(SAS),iSCSI或者其他的儲存區域網路及其協議(SAN)接入到伺服器的。這個配置是與協議無關的,只要求叢集中的伺服器能訪問到同一共享資料塊裝置。

圖一.舉例兩臺伺服器訪問同一個共享儲存的配置

CLVM
MD RAID還不支援叢集,所有也就不能相容CLVM.

CLVM 守護程式
CLVM 守護程式會將LVM後設資料的更新分發到整個叢集中,前提是叢集中的每個節點都必須執行守護程式。

磁碟簇
磁碟簇(就是一堆磁碟)是一種使用多個磁碟驅動器的架構,但是不支援具有冗餘能力的配置。

配置叢集
幾乎所有的Linux發行套件都提供必要的工具包。但是,工具包的名字可能各有差異。你需要安裝lvm2-clumster(在部分發行套件中,可能命名為clvm),Corosync叢集引擎,紅帽叢集管理器(cman),資源組管理程式(rgmanager),還有所有其他執行在伺服器上的獨立的工具。儘管紅帽叢集管理器的描述中就包含了“紅帽”的發行套件的名字,但是其他與紅帽無關的大多數Linux的發行套件還在會把cman列在他們的資源庫中。

當叢集中所有的伺服器都安裝好合適的叢集工具包後,必須修改叢集配置檔案來啟動叢集。建立檔案/etc/cluster/cluster.conf,如下編輯內容就可以了:
<cluster name="lvm-cluster" config_version="1">
    <cman two_node="1" expected_votes="1" />
    <clusternodes>
        <clusternode name="serv-0001" nodeid="1">
            <fence>
            </fence>
        </clusternode>
        <clusternode name="serv-0002" nodeid="2">
            <fence>
            </fence>
        </clusternode>
    </clusternodes>
    <logging debug="on">
    </logging>
    <dlm protocol="tcp" timewarn="500">
    </dlm>
    <fencedevices>
    </fencedevices>
    <rm>
    </rm>
</cluster>
強調一下clusternode的名字是主機名(按需修改),而且務必保證所有叢集中的伺服器上的cluster.conf檔案是一致的。

啟動紅帽叢集管理器(cman):
$ sudo /etc/rc.d/init.d/cman start
Starting cluster: 
   Checking if cluster has been disabled at boot...   [  OK  ]
   Checking Network Manager...                        [  OK  ]
   Global setup...                                    [  OK  ]
   Loading kernel modules...                          [  OK  ]
   Mounting configfs...                               [  OK  ]
   Starting cman...                                   [  OK  ]
   Waiting for quorum...                              [  OK  ]
   Starting fenced...                                 [  OK  ]
   Starting dlm_controld...                           [  OK  ]
   Tuning DLM kernel config...                        [  OK  ]
   Starting gfs_controld...                           [  OK  ]
   Unfencing self...                                  [  OK  ]
   Joining fence domain...                            [  OK  ]

如果叢集中的某個節目沒有啟用,它的狀態顯示為離線:
$ sudo clustat
Cluster Status for lvm-cluster @ Sun Aug  3 11:31:51 2014
Member Status: Quorate

 Member Name                 ID   Status
 ------ ----                 ---- ------
 serv-0001                        1 Online, Local
 serv-0002                        2 Offline
如果所有伺服器都配置好了,cman服務也啟動了,所有節點顯示狀態為線上:
$ sudo clustat
Cluster Status for lvm-cluster @ Sun Aug  3 11:36:43 2014
Member Status: Quorate

 Member Name                 ID   Status
 ------ ----                 ---- ------
 serv-0001                        1 Online
 serv-0002                        2 Online, Local

現在你就有一個叢集的工作環境了。下一步就是啟動CLVM的高可用模式。當前場景中,你只有2臺伺服器共享的儲存中的一個卷,這2臺伺服器都可以監視和訪問/dev/sdb中的資料。
/etc/lvm/lvm.conf 也需要被修改。在全域性引數 locking_type 的值預設為 1,必須改為 3:
# Type of locking to use. Defaults to local file-based 
# locking (1).
# Turn locking off by setting to 0 (dangerous: risks metadata 
# corruption if LVM2 commands get run concurrently).
# Type 2 uses the external shared library locking_library.
# Type 3 uses built-in clustered locking.
# Type 4 uses read-only locking which forbids any operations 
# that might change metadata.
locking_type = 3

找一臺叢集中的伺服器,在指定的共享捲上面建立一個卷組,一個邏輯卷和一個檔案系統:
$ sudo pvcreate /dev/sdb

$ sudo vgcreate -cy shared_vg /dev/sdb

$ sudo lvcreate -L 50G -n ha_lv shared_vg

$ sudo mkfs.ext4 /dev/shared_vg/ha_lv

$ sudo lvchange -an shared_vg/ha_lv
上例中消耗卷組中的50GB的來建立邏輯卷,然後用其建立4個擴充的檔案檔案系統。vgcreate (建立卷組命令)的 -cy 選項 用於啟動,並在叢集中鎖定卷組。lvchange (邏輯卷修改命令)的 -an 選項用來停用邏輯組。但是你必須依賴CLVM和資源管理器的程式,按上面建立的/etc/cluster/cluster.conf的配置中的故障轉移的策略來啟用他們。一旦邏輯卷被啟用,你就可以從/dev/shared_vg/ha_lv訪問共享的捲了。

在 cluster.conf 檔案中新增故障轉移的詳細配置資訊:
<rm>  
   <failoverdomains>
       <failoverdomain name="FD" ordered="1" restricted="0">
          <failoverdomainnode name="serv-0001" priority="1"/>
          <failoverdomainnode name="serv-0002" priority="2"/>
       </failoverdomain>
   </failoverdomains>
   <resources>
       <lvm name="lvm" vg_name="shared_vg" lv_name="ha-lv"/>
       <fs name="FS" device="/dev/shared_vg/ha-lv" 
         ↪force_fsck="0" force_unmount="1" fsid="64050" 
         ↪fstype="ext4" mountpoint="/mnt" options="" 
         ↪self_fence="0"/>
   </resources>
   <service autostart="1" domain="FD" name="serv" 
    ↪recovery="relocate">
       <lvm ref="lvm"/>
       <fs ref="FS"/>
   </service>
</rm>
“rm”中的內容會作用到資源管理器上(rgmanager)。這部分的配置通知叢集管理器,serv-0001優先獨佔訪問共享卷。資料會掛載在/mnt 這個絕對目錄下面。 如果serv-0001因為某些原因當機了,資源管理器就會做故障轉移處理,使serv-0002獨佔訪問共享卷,資料會掛載在serv-0002的/mnt的這個目錄下。所有傳送到serv-0001的處於等待的I/O請求會由serv-0002響應。

在所有伺服器中,重啟cman服務是配置修改生效:
$ sudo /etc/rc.d/init.d/cman restart
同樣,還需要再所有伺服器中重啟 rgmanager 和 clvmd 服務:
$ sudo /etc/rc.d/init.d/rgmanager start
Starting Cluster Service Manager:           [  OK  ]

$ sudo /etc/rc.d/init.d/clvmd start
Starting clvmd:                             [  OK  ]
如果都沒問題,那麼你就配置好了一個主/從的叢集配置。你可以通過檢視伺服器對共享卷的訪問許可權來校驗配置是否生效。實驗應該可以發現,serv-0001 可以掛在共享卷,但是 serv-0002 不可以。接著就是檢驗真理的時刻了——那就是測試故障轉移。手動對 serv-0001 斷電,你可以發現rgmanager 影子,並且 serv-0002 可以訪問/掛在共享捲了。

注意:
為了使所有的相關服務在開機的時候自動啟動,用chkconfig命令在合適的執行等級(runlevels)中啟動這些服務.

總結
對應一個理想的配置,fencing相關的配置必須出現在/etc/cluster/cluster.conf檔案中。fencing的目的是在有問題的節點對叢集造成顯而易見的問題之前就對其進行處理。比如,某臺伺服器發生Kernel panic,或者無法與叢集中的其他伺服器通訊,再或者遇到其他各種災難性的崩潰等情況下,可以配置IPMI來重啟問題伺服器:
<clusternode name="serv-0001" nodeid="1">
     <fence>
         <method name="1">
             <device name="ipmirecover1"/>
         </method>
     </fence>
 </clusternode>
 <clusternode name="serv-0002" nodeid="2">
     <fence>
         <method name="1">
             <device name="ipmirecover2"/>
         </method>
     </fence>
 </clusternode>

[ ... ]

   <fencedevices>
       <fencedevice agent="fence_ipmilan" ipaddr="192.168.1.50" 
        ↪login="ADMIN" passwd="ADMIN" name="ipmirecover1"/>
       <fencedevice agent="fence_ipmilan" ipaddr="192.168.10" 
        ↪login="ADMIN" passwd="ADMIN" name="ipmirecover2"/>
   </fencedevices>
HA-LVM的設計初衷是為資料中心提供廉價的容錯處理機制。沒有人希望伺服器當機,話說回來,只有配置得當,當機也不是肯定的。從資料中心到家庭辦公,幾乎任何場景都可以實施這套方案。

資源連結
clvmd(8): Linux man page
Appendix F. High Availability LVM (HA-LVM): https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Cluster_Administration/ap-ha-halvm-CA.html
來自:碼農網
相關閱讀
評論(1)

相關文章