天天看點

DRBD使用gfs2,cman實作雙主叢集檔案存儲方案

DRBD簡介

   DRBD (Distributed Replicated Block Device) 是 Linux 平台上的分散式儲存系統。其中包含了核心模組,數個使用者  空間管理程式及 shell scripts,通常用于高可用性(high availability, HA)叢集。DRBD 類似磁盤陣列的RAID 1(鏡像),隻不過 RAID 1 是在同一台電腦内,而 DRBD 是透過網絡。

DRBD 是以 GPL2 授權散布的自由軟體。 --- 此處摘自 wikipedia

規劃:

   ip                   主機名                 存儲磁盤     drbd裝置

   172.16.43.1   slave1.king.com  /dev/sda3   <code></code><code>/dev/drbd0</code>

   172.16.43.2   slave2.king.com  /dev/sda3   <code></code><code>/dev/drbd0</code>

一. 實作基本DRBD功能

以下操作沒有特殊說明,皆為雙個節點都要操作

   i) 主機互信(雙節點之間)

1

2

3

4

5

6

7

8

9

10

<code># 確定 hostname 與 uname -n 一緻</code>

<code>sed</code> <code>-i </code><code>'s@^\(HOSTNAME=\).*@\slave1.king.com@'</code> <code>/etc/sysconfig/network</code>

<code>hostname</code> <code>slave1.king.com</code>

<code>uname</code> <code>-n</code>

<code># 確定 /etc/hosts 檔案中添加兩節點非DNS解析資訊</code>

<code>172.16.43.1  slave1.king.com</code>

<code>172.16.43.2  slave2.king.com</code>

<code># 雙機互信</code>

<code>ssh</code><code>-keygen -t rsa -P </code><code>''</code>

<code>ssh</code><code>-copy-</code><code>id</code> <code>-i .</code><code>ssh</code><code>/id_rsa</code><code>.pub [email protected]</code>

   ii) drbd配置安裝

<code># 下載下傳drbd rpm包(注意drbd-kmdl版本号前一半與作業系統要相對應)</code>

<code>drbd-8.4.3-33.el6.x86_64.rpm</code>

<code>drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm</code>

<code>rpm -ivh *.rpm</code>

       1 配置/etc/drbd.d/global-common.conf

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<code>global {</code>

<code>    </code><code>usage-count no;</code>

<code>    </code><code># minor-count dialog-refresh disable-ip-verification</code>

<code>}</code>

<code>common {</code>

<code>    </code><code>protocol C;</code>

<code>    </code><code>handlers {</code>

<code>        </code><code># 當承載drbd的實體檔案損壞時處理</code>

<code>        </code><code># echo b &gt; /proc/sysrq-trigger</code>

<code>        </code><code># 立即重新開機機器,而且不會将緩沖區同步到硬碟,也不會解除安裝已挂載的硬碟</code>

<code>        </code><code>pri-on-incon-degr </code><code>"/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b &gt; /proc/sysrq-trigger ; reboot -f"</code><code>;</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      </code> 

<code>        </code><code># 當同步過程中主裝置失去聯系處理</code>

<code>        </code><code>pri-lost-after-sb </code><code>"/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b &gt; /proc/sysrq-trigger ; reboot -f"</code><code>;</code>

<code>        </code><code># 當同步過程中發生io錯誤處理</code>

<code>        </code><code># echo o &gt; /proc/sysrq-trigger</code>

<code>        </code><code># 關閉系統</code>

<code>        </code><code>local</code><code>-io-error </code><code>"/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o &gt; /proc/sysrq-trigger ; halt -f"</code><code>;</code>

<code>        </code><code># fence-peer "/usr/lib/drbd/crm-fence-peer.sh";</code>

<code>        </code><code># split-brain "/usr/lib/drbd/notify-split-brain.sh root";</code>

<code>        </code><code># out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";</code>

<code>        </code><code># before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";</code>

<code>        </code><code># after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;</code>

<code>    </code><code>}</code>

<code>    </code><code>startup {</code>

<code>        </code><code>#wfc-timeout 120;</code>

<code>        </code><code>#degr-wfc-timeout 120;</code>

<code>    </code><code>disk {</code>

<code>        </code><code># 當磁盤io異常,将分離目前裝置</code>

<code>        </code><code>on-io-error detach;</code>

<code>        </code><code>#fencing resource-only;</code>

<code>    </code><code>net {</code>

<code>        </code><code># 消息驗證校驗碼</code>

<code>        </code><code>cram-hmac-alg </code><code>"sha1"</code><code>;</code>

<code>        </code><code>shared-secret </code><code>"9bb9f0ea87ca30cfbc094c7dad12d1ea"</code><code>;</code>

<code>        </code><code># openssl dgst sha1 install.log 對任意檔案進行資訊摘要取得交換碼</code>

<code>    </code><code>syncer {</code>

<code>        </code><code># drbd裝置同步速率</code>

<code>        </code><code>rate 1000M;</code>

       2. 格式化磁盤

<code>fdisk</code> <code>/dev/sda</code>

       3、定義一個資源/etc/drbd.d/web.res,内容如下:

<code>resource web {</code>

<code>    </code><code>device    </code><code>/dev/drbd0</code><code>;</code>

<code>    </code><code>disk      </code><code>/dev/sda3</code><code>;</code>

<code>    </code><code>meta-disk internal;</code>

<code>    </code><code>on master1.king.com {</code>

<code>        </code><code>address   172.16.43.1:7789;</code>

<code>    </code><code>on master2.king.com {</code>

<code>        </code><code>address   172.16.43.2:7789;</code>

       4. 同步以上操作或檔案,并初始化資源及啟動服務

<code>drbdadm create-md web</code>

<code>service drbd start</code>

<code># 此處隻能提升一個節點為主資源</code>

<code>drbdadm primary --force web</code>

<code># 檢視資訊等待同步完成</code>

<code>drbd-overview</code>

<code>#0:web  Connected Primary/Secondary UpToDate/UpToDate C r----</code>

        5. 挂載使用

<code>mke2fs -j -L DRBD </code><code>/dev/drbd0</code> <code># 僅在一個節點執行</code>

<code>mkdir</code> <code>/mnt/drbd</code>

<code>mount</code> <code>/dev/drbd0</code> <code>/mnt/drbd</code>

<code># 如果之前提升二個節點都為主資源時,在這個 /mnt/drbd</code>

<code># 目錄下同時讀寫可能會有IO異常,導緻drbd裝置失效</code>

<code># 為了解決這個問題則使用 gfs + cman 實作分布式檔案鎖方案</code>

二) gfs叢集檔案系統(重點)

       1. 在 /etc/drbd.d/global-common.conf檔案common 中添加      

<code># 在配置檔案的 net 選項中</code>

<code>allow-two-primaries </code><code>yes</code><code>;</code>

       2. 安裝 cman 底層消息通訊 + 全局鎖功能

<code>ccs_tool create gfscluster</code>

<code>ccs_tool addnode -n 1 -</code><code>v</code> <code>1 slave1.king.com</code>

<code>ccs_tool addnode -n 2 -</code><code>v</code> <code>1 slave2.king.com</code>

<code># 檢視節點</code>

<code>ccs_tool lsnode</code>

<code>#Cluster name: gfscluster, config_version: 3</code>

<code>.</code>

<code>#Nodename          Votes Nodeid Fencetype</code>

<code>#slave1.king.com     1    1</code>

<code>#slave2.king.com     1    2</code>

       3. 啟動cman之前禁用 NetworkManager

<code>chkconfig NetworkManager off</code>

<code>service cman restart</code>

       4. 準備新磁盤 

<code>partx -a </code><code>/dev/sda</code>

       5. 再次啟動 drbd 服務

<code># 如果之前做過 ii) 步實驗的話,請确定彈出的資訊</code>

<code>#</code>

<code># 提升第一節點為主資源</code>

<code>[slave1: ~] drbdadm primary --force web</code>

<code># 此處可以提升二個節點為主資源(分别執行)</code>

<code># 請注意請確定一個主已經同步完成</code>

<code># 0:web/0  Connected Primary/Secondary UpToDate/UpToDate C r-----</code>

<code># 再提升一下個為主節點</code>

<code>[slave2: ~] drbdadm primary --force web</code>

       6. 格式化gfs2并多處挂載     

<code># 将drbd格式化為gfs2 (這一步隻需要一個節點操作即可)</code>

<code>mkfs.gfs2 -j 2 -p lock_dlm -t gfscluster:gfslocktable </code><code>/dev/drbd0</code>

<code># 多處挂載使用</code>

<code>mount</code> <code>/dev/drbd0</code> <code>/gfs</code>

    iv) 測試

<a href="http://s3.51cto.com/wyfs02/M00/24/ED/wKioL1NWuofilHA1AAUtEucpflg450.jpg" target="_blank"></a>

   v) 總結

   基于drbd的單,雙主配置到此為止,有些童鞋會問雙主模型用在什麼情況下,它的用法恰恰在不需要叢集的場景.例如兩台httpd伺服器做負載均衡,兩台httpd都需要

通路一個共享儲存,無論那一台httpd伺服器都可以上傳修改共享存儲的資料,這是單主的drbd所不能實作的.當然這裡的gfs也可以做叢集lvm,在下一篇中我們将繼續

     本文轉自My_King1 51CTO部落格,原文連結:http://blog.51cto.com/apprentice/1400869,如需轉載請自行聯系原作者