天天看點

實作MooseFS的高可用

#################################################################

開篇引題

Distributed Replicated Block Device

部署MFS

部署Corosync+Pacemaker

故障模拟測試

補充和總結

<a href="http://s3.51cto.com/wyfs02/M01/23/DC/wKioL1NFSM2TZy5FAAIfCJj9_B0122.jpg" target="_blank"></a>

   直接上圖,有圖有真相啊!此圖是MFS網絡組成和運作原理,先不說圖中每種角色的作用(下文會有詳細說明),直覺資訊告訴我們用戶端無論是讀寫請求都需要與MasterServer通信,而圖中MasterServer角色隻有一個,是以單點故障的因素就顯而易見了。解決MFS的單點故障正是本文的初衷,接下來就介紹如何利用多種技術解決MFS的單點故障,實作MasterServer的高可用。

<a href="http://s3.51cto.com/wyfs02/M02/23/DC/wKiom1NFTqTAy-1WAAGOw7O5S_o836.jpg" target="_blank"></a>

   分布式複制塊裝置是Linux核心的存儲層中的一個分布式存儲系統,可利用DRBD在兩台Linux伺服器之間共享塊裝置、檔案系統和資料,類似于一個網絡RAID1的功能,核心中的DRBD子產品監聽特定套接字上,複制系統調用産生的寫資料為副本并通過TCP協定發送至DRBD從節點,因為節點間磁盤裝置每一個資料位都是相同的,是以DRBD可以實作廉價塊級别的資料共享。

   DRBD工作模型

       主從模型(primary/secondary),同一時刻隻能有一個節點提供服務(否則會産生腦裂),從節點無法使用磁盤分區(挂載也不可以)。

       主主模型(primary/primary),需要借助于叢集檔案系統并啟用分布式檔案鎖功能,而且寫性能不會有提升.

   DRBD管理

       核心子產品:drbd使用者空間

       管理工具:drbdadm,drbdsetup,drbdmeta

   工作流程(預設模型是Sync)

       Async:副本交于本地TCP/IP協定棧就傳回(性能最高)

       SemiSync:副本交對方TCP/IP協定棧就傳回(折中方案)

       Sync:副本被secondary存儲到磁盤中就傳回(性能差)

   安裝配置DRBD(drbd核心子產品必須和核心版本完全比對)

1

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

   主配置檔案

2

3

4

<code>[root@one packages]</code><code># cat /etc/drbd.conf</code>

<code># You can find an example in  /usr/share/doc/drbd.../drbd.conf.example</code>

<code>include </code><code>"drbd.d/global_common.conf"</code><code>;</code>

<code>include </code><code>"drbd.d/*.res"</code><code>;</code>

   全局配置檔案

5

6

7

8

9

10

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

<code>cat</code> <code>/etc/drbd</code><code>.d</code><code>/global_common</code><code>.conf</code>

<code>global {</code>

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

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

<code>}</code>

<code>common {</code>

<code>    </code><code>handlers {</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>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>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 degr-wfc-timeout outdated-wfc-timeout wait-after-sb</code>

<code>    </code><code>options {</code>

<code>        </code><code># cpu-mask on-no-data-accessible</code>

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

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

<code>        </code><code># size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes</code>

<code>        </code><code># disk-drain md-flushes resync-rate resync-after al-extents</code>

<code>                </code><code># c-plan-ahead c-delay-target c-fill-target c-max-rate</code>

<code>                </code><code># c-min-rate disk-timeout</code>

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

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

<code>        </code><code>shared-secret </code><code>"soulboy"</code><code>;</code>

<code>        </code><code># protocol timeout max-epoch-size max-buffers unplug-watermark</code>

<code>        </code><code># connect-int ping-int sndbuf-size rcvbuf-size ko-count</code>

<code>        </code><code># allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri</code>

<code>        </code><code># after-sb-1pri after-sb-2pri always-asbp rr-conflict</code>

<code>        </code><code># ping-timeout data-integrity-alg tcp-cork on-congestion</code>

<code>        </code><code># congestion-fill congestion-extents csums-alg verify-alg</code>

<code>        </code><code># use-rle</code>

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

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

   定義資源mfs

<code>[root@one packages]</code><code># cat /etc/drbd.d/mydata.res</code>

<code>resource mydata {</code>

<code>    </code><code>on one.soulboy.com {</code>

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

<code>        </code><code>disk    </code><code>/dev/sdb2</code><code>;     </code><code>#大小要一緻</code>

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

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

<code>    </code><code>on two.soulboy.com {</code>

<code>        </code><code>disk    </code><code>/dev/sdb1</code><code>;     </code><code>#大小要一緻</code>

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

<code>resource mfs {</code>

<code>        </code><code>device  </code><code>/dev/drbd1</code><code>;</code>

<code>        </code><code>disk    </code><code>/dev/sdb3</code><code>;</code>

<code>        </code><code>address 192.168.1.61:7788;</code>

<code>        </code><code>disk    </code><code>/dev/sdb2</code><code>;</code>

<code>        </code><code>address 192.168.1.62:7788;</code>

   同步配置檔案到從節點

<code>scp</code> <code>/etc/drbd</code><code>.d/* two.soulboy.com:</code><code>/etc/drbd</code><code>.d/</code>

   初始化資源(分别在兩個節點上執行)

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

   啟動資源(分别在兩個節點上執行)

<code>service drbd start</code>

   将某節點變為主節點(192.168.1.61為主節點)

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

   檢視狀态确定同步完畢

<code>[root@one packages]</code><code># service drbd status</code>

<code>1:mfs     Connected  Primary</code><code>/Secondary</code>  <code>UpToDate</code><code>/UpToDate</code>  <code>C  </code><code>/mfs</code>     <code>ext4</code>

   格式化檔案系統(在主節點)

<code>mke2fs -t ext4 </code><code>/dev/drbd1</code>

   允許對方搶占(分别在兩節點上執行)

<code>drbdadm primary mfs</code>

   開機不要自動啟動

<code>chkconfig drbd off</code>

   MFS工作原理

       MFS檔案系統能夠實作RAID功能,節約成本,不遜色于專業的存儲系統,可以實作線上擴容。

   MFS的四種角色

       MasterServer(中繼資料伺服器):負責管理各個ChunkServer及排程檔案讀寫,回收檔案空間及恢複多節點拷貝。

       Metalogger(中繼資料日志伺服器):負責備份管理伺服器的變化日志檔案。

       ChunkServer(資料存儲伺服器):真正存儲使用者資料的伺服器,将檔案切塊互相同步,聽從MasterServer的排程為Client提供資料傳輸,Chunk節點數量越多,可靠性和MFS可用的磁盤空間就會越大。

       Client(用戶端):用戶端通過fuse核心接口遠端管理伺服器上所管理的資料存儲伺服器,和使用本地檔案系統一樣。

   安裝配置中繼資料服務

<code>mount</code> <code>/dev/drbd1</code> <code>/mfs</code>               <code>#挂載drbd裝置</code>

<code>groupadd -g 1000 mfs                </code><code>#兩邊節點的uid要統一</code>

<code>useradd</code> <code>-u 1000 -g mfs -s </code><code>/sbin/nologin</code> <code>mfs  </code><code>#兩邊節點都需要建立</code>

<code>mkdir</code> <code>-pv </code><code>/mfs</code>                      <code>#主節點建立資料目錄即可</code>

<code>chown</code> <code>-R mfs.mfs </code><code>/mfs</code>               <code>#兩個節點修改目錄屬主和屬組為mfs</code>

<code>tar</code> <code>xf mfs-1.6.26.</code><code>tar</code><code>.gz</code>

<code>cd</code> <code>mfs-1.6.26</code>

<code>.</code><code>/configure</code> <code>--prefix=</code><code>/mfs</code> <code>--with-default-user=mfs --with-default-group=mfs</code>

<code>make</code> <code>&amp;&amp; </code><code>make</code> <code>install</code>

<code>cp</code> <code>/mfs/etc/mfsmaster</code><code>.cfg.dist  </code><code>/mfs/etc/mfsmaster</code><code>.cfg</code>

<code>cp</code> <code>/mfs/etc/mfsexports</code><code>.cfg.dist  </code><code>/mfs/etc/mfsexports</code><code>.cfg</code>

<code>cp</code> <code>/mfs/var/mfs/metadata</code><code>.mfs.empty  </code><code>/mfs/var/mfs/metadata</code><code>.mfs</code>

<code>vim </code><code>/mfs/etc/mfsmaster</code><code>.cfg</code>

<code>    </code><code># WORKING_USER = mfs            #運作使用者</code>

<code>    </code><code># WORKING_GROUP = mfs           #運作組</code>

<code>    </code><code># SYSLOG_IDENT = mfsmaster      #在syslog中辨別自己</code>

<code>    </code><code># LOCK_MEMORY = 0               #是否執行mlockall()以避免mfsmaster程序溢出(預設為0)</code>

<code>    </code><code># NICE_LEVEL = -19              #運作的優先級</code>

<code>    </code><code># EXPORTS_FILENAME = /usr/local/mfs/etc/mfsexports.cfg   #目錄控制檔案路徑</code>

<code>    </code><code># TOPOLOGY_FILENAME = /usr/local/mfs/etc/mfstopology.cfg #拓撲類型檔案路徑</code>

<code>    </code><code># DATA_PATH = /usr/local/mfs/var/mfs    #資料存放路徑(changelog,sessions,stats)</code>

<code>    </code><code># BACK_LOGS = 50                        #中繼資料的改變日志檔案數量</code>

<code>    </code><code># BACK_META_KEEP_PREVIOUS = 1           #</code>

<code>    </code><code># REPLICATIONS_DELAY_INIT = 300         #延遲複制時間(300秒)</code>

<code>    </code><code># REPLICATIONS_DELAY_DISCONNECT = 3600  #ChunkServer斷開複制的延遲</code>

<code>    </code><code># MATOML_LISTEN_HOST = *                #中繼資料日志伺服器監聽的IP位址(*代表任何IP)</code>

<code>    </code><code># MATOML_LISTEN_PORT = 9419             #中繼資料日志伺服器監聽的端口位址(9419)</code>

<code>    </code><code># MATOCS_LISTEN_HOST = *                #用于ChunkServer連接配接的IP位址(*代表任何IP)</code>

<code>    </code><code># MATOCS_LISTEN_PORT = 9420             #用于ChunkServer連接配接的端口(9420)</code>

<code>    </code><code># MATOCL_LISTEN_HOST = *                #用于用戶端連接配接的位址</code>

<code>    </code><code># MATOCL_LISTEN_PORT = 9421             #用于用戶端連接配接的端口</code>

<code>    </code><code># CHUNKS_LOOP_CPS = 100000      </code>

<code>    </code><code># CHUNKS_LOOP_TIME = 300                #Chunks回環頻率</code>

<code>    </code><code># CHUNKS_SOFT_DEL_LIMIT = 10    </code>

<code>    </code><code># CHUNKS_HARD_DEL_LIMIT = 25</code>

<code>    </code><code># CHUNKS_WRITE_REP_LIMIT = 2            #在一個循環裡複制到一個ChunkServer的最大Chunks數目</code>

<code>    </code><code># CHUNKS_READ_REP_LIMIT = 10</code>

<code>    </code><code># REJECT_OLD_CLIENTS = 0                #彈出低于1.6.0用戶端的連接配接</code>

   目錄挂載控制檔案

<code>vim </code><code>/mfs/etc/mfsexports</code><code>.cfg </code><code>#分為三個部分,無需修改</code>

<code>*                       .           rw</code>

<code>*                       /           rw,alldirs,maproot=0</code>

<code>用戶端IP         被挂載目錄       用戶端擁有的權限</code>

   為MasterServer提供lsb格式啟動腳本

<code>cat</code> <code>/etc/init</code><code>.d</code><code>/mfsmaster</code>

<code># chkconfig: 345 91 10</code>

<code># description: mfs start.</code>

<code>. </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code>

<code>. </code><code>/etc/sysconfig/network</code>

<code>path=</code><code>"/mfs/sbin"</code>

<code>[ </code><code>"${NETWORKING}"</code> <code>= </code><code>"no"</code> <code>] &amp;&amp; </code><code>exit</code> <code>0</code>

<code>start() {</code>

<code>$path</code><code>/mfsmaster</code> <code>start</code>

<code>$path</code><code>/mfscgiserv</code> <code>start</code>

<code>stop() {</code>

<code>$path</code><code>/mfsmaster</code> <code>stop</code>

<code>restart() {</code>

<code>$path</code><code>/mfsmaster</code> <code>restart</code>

<code>$path</code><code>/mfscgiserv</code> <code>restart</code>

<code>status() {</code>

<code>$path</code><code>/mfsmaster</code> <code>test</code>

<code>$path</code><code>/mfscgiserv</code> <code>test</code>

<code>case</code> <code>"$1"</code> <code>in</code>

<code> </code><code>start)</code>

<code>     </code><code>start</code>

<code>     </code><code>;;</code>

<code> </code><code>stop)</code>

<code>     </code><code>stop</code>

<code> </code><code>restart)</code>

<code>     </code><code>restart</code>

<code> </code><code>status)</code>

<code>     </code><code>status</code>

<code> </code><code>*)</code>

<code>     </code><code>echo</code> <code>$</code><code>"Usage: $0 start|stop|restart|status"</code>

<code>     </code><code>exit</code> <code>1</code>

<code>     </code><code>esac</code>

<code>     </code><code>exit</code> <code>0</code>

   修改權限

<code>chmod</code> <code>755 </code><code>/etc/init</code><code>.d</code><code>/mfsmaster</code>

   導出指令

<code>echo</code> <code>'export PATH=$PATH:/mfs/sbin'</code> <code>&gt; </code><code>/etc/profile</code><code>.d</code><code>/mfs</code><code>.sh</code>

<code>. </code><code>/etc/profile</code><code>.d</code><code>/mfs</code><code>.sh</code>

   同步啟動腳本至從節點

<code>scp</code> <code>-p </code><code>/etc/init</code><code>.d</code><code>/mfsmaster</code> <code>two:</code><code>/etc/init</code><code>.d/</code>

   關閉服務解除安裝drbd裝置

<code>service mfsmaster stop</code>

<code>umount</code> <code>/dev/drbd1</code>

<a href="http://s3.51cto.com/wyfs02/M02/23/DD/wKiom1NFX5jzjqXfAAI-RkHOIo4110.jpg" target="_blank"></a>

   Corosync是叢集管理套件的一部分,它在傳遞資訊的時候可以通過一個簡單的配置檔案來定義資訊傳遞的方式和協定等,RHCS叢集套件就是基于corosync實作。但corosync隻提供了message layer的能力。叢集的資源管理則需要Pacemaker,其管理接口有兩個分别是crmsh和pcs。

   環境準備

       service NetworkManager stop

       時間同

       主機名稱解析的結果等于uname -n

   安裝(pacemaker作為corosync的插件運作)

<code>yum </code><code>install</code> <code>-y corosync pacemaker</code>

   資料總管配置接口基于crmsh

<code>yum </code><code>install</code> <code>-y crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm</code>

   生成密鑰

<code>corosync-keygen</code>

<code>cp</code> <code>/etc/corosync/corosync</code><code>.conf.example </code><code>/etc/corosync/corosync</code><code>.conf</code>

   配置檔案

<code>vim </code><code>/etc/corosync/corosync</code><code>.conf </code><code>#添加pacemaker插件</code>

<code>            </code><code>compatibility: whitetank    </code><code>#是否相容0.8版本的corosync</code>

<code>            </code><code>totem {                     </code><code>#用來定義叢集節點心跳資訊傳遞</code>

<code>                </code><code>version: 2              </code><code>#版本号</code>

<code>                </code><code>secauth: on             </code><code>#啟用安全認證機制</code>

<code>                </code><code>threads: 0              </code><code>#啟用多少線程完成心跳資訊傳遞</code>

<code>                </code><code>interface {                   </code><code>#定義心跳資訊傳遞的接口</code>

<code>                    </code><code>ringnumber: 0             </code><code>#避免循環轉發心跳資訊</code>

<code>                    </code><code>bindnetaddr: 192.168.2.0  </code><code>#指定網卡的網絡位址</code>

<code>                    </code><code>mcastaddr: 226.194.61.21   </code><code>#心跳資訊使用的多點傳播位址</code>

<code>                    </code><code>mcastport: 5405            </code><code>#多點傳播監聽端口</code>

<code>                    </code><code>ttl: 1</code>

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

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

<code>            </code><code>logging {               </code><code>#心跳資訊層日志</code>

<code>                </code><code>fileline: off       </code><code>#</code>

<code>                </code><code>to_stderr: no       </code><code>#是否把錯誤資訊發往螢幕</code>

<code>                </code><code>to_logfile: </code><code>yes</code>     <code>#使用自定義日志檔案logfile</code>

<code>                </code><code>to_syslog: no       </code><code>#是否記錄到系統日志</code>

<code>                </code><code>logfile: </code><code>/var/log/cluster/corosync</code><code>.log</code>

<code>                </code><code>debug: off          </code><code>#調試功能</code>

<code>                </code><code>timestamp: on       </code><code>#每次記錄心跳資訊是否記錄時間戳</code>

<code>                </code><code>logger_subsys {</code>

<code>                    </code><code>subsys: AMF</code>

<code>                    </code><code>debug: off</code>

<code>            </code><code>amf {</code>

<code>                </code><code>mode: disabled</code>

<code>            </code><code>service {       </code><code>#添加pacemaker插件</code>

<code>                </code><code>ver: 0</code>

<code>                </code><code>name: pacemaker</code>

<code>            </code><code>aisexec {       </code><code>#可省略</code>

<code>                </code><code>user: root</code>

<code>                </code><code>group: root</code>

   複制配置檔案到其他節點

<code>scp</code> <code>-p </code><code>/etc/corosync/corosync</code><code>.conf </code><code>/etc/corosync/authkey</code> <code>two.soulboy.com:</code><code>/etc/corosync/</code>

  分别在兩節點啟動corosync服務

<code>service corosync start</code>

   使用crmsh接口定義drbd資源(忽略法定票數、禁用stonith裝置)

<code>crm(live)configure</code><code># property no-quorum-policy=ignore</code>

<code>crm(live)configure</code><code># property stonith-enabled=false</code>

   定義原始資源

<code>crm(live)configure</code><code># primitive mfs_drbd ocf:linbit:drbd params drbd_resource=mfs op monitor role=Master interval=10 timeout=20 op monitor role=Slave interval=20 timeout=20 op start timeout=240 op stop timeout=100   #定義drbd資源</code>

<code>crm(live)configure</code><code># ms ms_mfs_drbd mfs_drbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"   #定義drbd的克隆資源、克隆屬性</code>

<code>crm(live)configure</code><code># primitive mfsstore ocf:heartbeat:Filesystem params device="/dev/drbd1" directory="/mfs" fstype="ext4" op monitor interval=40 timeout=40 op start timeout=60 op stop timeout=60   #定義本地挂載資源</code>

<code>crm(live)configure</code><code># primitive mfsip ocf:heartbeat:IPaddr params ip="192.168.1.40" op monitor interval=20 timeout=20 on-fail=restart   #定義vip</code>

<code>crm(live)configure</code><code># primitive mfsserver lsb:mfsmaster   #定義mfs服務</code>

   定義colocation限制(資源運作在同一個節點上的偏好)

<code>crm(live)configure</code><code># colocation mfsstore_with_ms_mfs_drbd_master inf: mfsstore ms_mfs_drbd:Master   #挂載資源追随drbd主資源在一起</code>

<code>crm(live)configure</code><code># colocation mfsserver_with_mfsstore inf: mfsserver mfsstore   #mfs服務追随挂載資源</code>

<code>crm(live)configure</code><code># colocation mfsip_with_mfsserver inf: mfsip mfsserver   #vip追随mfs服務</code>

 定義資源組(如果定義了資源組就沒有必要定義colocation限制了)

<code>crm(live)configure</code><code># group ha_mfsservice mfsstore mfsserver mfsip   #本文沒有這樣做,但特此說明這樣做也是可以的</code>

   定義order限制(資源啟動和關閉的次序)  

<code>crm(live)configure</code><code># order ms_mfs_drbd_before_mfsstore mandatory: ms_mfs_drbd:promote mfsstore:start   #節點上存在drbdMaster才能啟動mystore服務</code>

<code>crm(live)configure</code><code># order mfsstore_before_mfsserver mandatory: mfsstore:start mfsserver:start   #mystore服務啟動才能啟動mfs服務</code>

<code>crm(live)configure</code><code># order mfsip_before_mfsserver mandatory: mfsip mfsserver   #vip啟動才能啟動mfs服務   </code>

 定義location限制(資源對節點的傾向性)

<code>location mfsservice_prefer_one ha_mfsservice 500: one.soulboy.com   </code><code>#主節點從故障中回複是否可以将資源搶奪回來,本文沒有這樣做,特此說明這樣做是可以完成資源搶占的。</code>

   檢查文法并儲存

<code>crm(live)configure</code><code># verify</code>

<code>crm(live)configure</code><code># commit</code>

   檢視叢集狀态(發現資源都運作在主節點上)

<code>[root@one packages]</code><code># crm</code>

<code>crm(live)</code><code># status</code>

<code>Online: [ one.soulboy.com two.soulboy.com ]</code>

<code>Master</code><code>/Slave</code> <code>Set: ms_mfs_drbd [mfs_drbd]</code>

<code>     </code><code>Masters: [ one.soulboy.com ]</code>

<code>     </code><code>Slaves:  [ two.soulboy.com ]</code>

<code> </code><code>mfsstore   (ocf::heartbeat:Filesystem):    Started one.soulboy.com</code>

<code> </code><code>mfsserver  (lsb:mfsmaster):                Started one.soulboy.com</code>

<code> </code><code>mfsip      (ocf::heartbeat:IPaddr):        Started one.soulboy.com</code>

  檢視驗證

<code>[root@one ~]</code><code># drbd-overview               #drbd資源正常</code>

<code>  </code><code>1:mfs</code><code>/0</code>     <code>Connected Primary</code><code>/Secondary</code> <code>UpToDate</code><code>/UpToDate</code> <code>C r----- </code><code>/mfs</code>    <code>ext4 5.0G 142M 4.6G 3%</code>

<code>[root@one ~]</code><code># service mfsmaster status       #mfs資源正常</code>

<code>mfsmaster pid: 13966</code>

<code>mfscgiserv pid:14158</code>

<code>[root@one ~]</code><code># ip addr show  | grep 192.168.1.40  #vip資源正常</code>

<code>    </code><code>inet 192.168.1.40</code><code>/24</code> <code>brd 192.168.1.255 scope global secondary eth0</code>

<code>[root@one ~]</code><code># ls /mfs               #挂載資源正常</code>

<code>etc  lost+found  sbin  share  var</code>

   安裝ChunkServer

<code>useradd</code> <code>mfs -s </code><code>/sbin/nologin</code>

<code>.</code><code>/configure</code> <code>--prefix=</code><code>/usr/local/mfs</code> <code>--with-default-user=mfs --with-default-group=mfs</code>

<code>cp</code> <code>/usr/local/mfs/etc/mfschunkserver</code><code>.cfg.dist </code><code>/usr/local/mfs/etc/mfschunkserver</code><code>.cfg</code>

<code>cp</code> <code>/usr/local/mfs/etc/mfshdd</code><code>.cfg.dist </code><code>/usr/local/mfs/etc/mfshdd</code><code>.cfg</code>

<code>vim </code><code>/usr/local/mfs/etc/mfschunkserver</code><code>.cfg</code>

<code># WORKING_USER = mfs</code>

<code># WORKING_GROUP = mfs</code>

<code># SYSLOG_IDENT = mfschunkserver</code>

<code># LOCK_MEMORY = 0</code>

<code># NICE_LEVEL = -19</code>

<code># DATA_PATH = /usr/local/mfs/var/mfs</code>

<code># MASTER_RECONNECTION_DELAY = 5</code>

<code># BIND_HOST = *</code>

<code>MASTER_HOST = 192.168.1.40         </code><code>#中繼資料伺服器的位址</code>

<code>MASTER_PORT = 9420                 </code><code>#中繼資料伺服器監聽端口</code>

<code># MASTER_TIMEOUT = 60</code>

<code># CSSERV_LISTEN_HOST = *</code>

<code># CSSERV_LISTEN_PORT = 9422       #此端口使用者和其他ChunkServer間複制資料</code>

<code># HDD_CONF_FILENAME = /usr/local/mfs/etc/mfshdd.cfg   #配置設定給MFS磁盤使用空間配置檔案路徑</code>

<code># HDD_TEST_FREQ = 10</code>

<code># LOCK_FILE = /var/run/mfs/mfschunkserver.lock</code>

<code># BACK_LOGS = 50</code>

<code># CSSERV_TIMEOUT = 5</code>

   磁盤空間配置檔案

<code>vim </code><code>/usr/local/mfs/etc/mfshdd</code><code>.cfg</code>

<code>/data</code>      <code>#/data是一個MFS的分區,執行個體化為本機一個獨立的磁盤挂載分區。</code>

   修改權限并啟動服務

<code>chown</code> <code>-R mfs:mfs </code><code>/data</code>

<code>mfschunkserver start</code>

   Client編譯安裝

   MFS用戶端依賴于fuse

<code>tar</code> <code>xf fuse-2.9.2.</code><code>tar</code><code>.gz</code>

<code>cd</code> <code>fuse-2.9.2</code>

<code>.</code><code>/configure</code>

<code>vim </code><code>/etc/profile</code><code>     </code><code>#在最後添加</code>

<code>export</code> <code>PKG_CONFIG_PATH=</code><code>/usr/local/lib/pkgconfig</code><code>:$PKG_CONFIG_PATH</code>

<code>source</code> <code>/etc/profile</code><code>   </code><code>#即時生效</code>

   安裝MFS用戶端

<code>.</code><code>/configure</code> <code>--prefix=</code><code>/usr/local/mfs</code> <code>--with-default-user=mfs --with-default-group=mfs --</code><code>enable</code><code>-mfsmount</code>

<code>modprobe fuse    </code><code>#加載fuse到核心</code>

   挂載MFS檔案系統

<code>mkdir</code> <code>/webdata</code><code>       </code><code>#建立本地目錄作為挂載點</code>

<code>/usr/local/mfs/bin/mfsmount</code> <code>/webdata</code> <code>-H 192.168.1.40   </code><code>#挂載MFS到本地/webdata目錄</code>

   挂載MFSMeta檔案系統

<code>mkdir</code> <code>/webdatameta</code><code>   </code><code>#建立本地MFSMeta目錄</code>

<code>/usr/local/mfs/bin/mfsmount</code> <code>-m </code><code>/webdatameta</code> <code>-H 192.168.1.40   </code><code>#挂載MFSMeta檔案系統</code>

   client建立檔案并檢視資訊(正常)

<code>[root@five /]</code><code># echo "123" &gt; /webdata/one   #建立檔案</code>

<code>[root@five /]</code><code># mfsfileinfo  /webdata/one  #檢視副本和存儲節點</code>

<code>/webdata/one</code><code>:</code>

<code>    </code><code>chunk 0: 0000000000000006_00000001 / (</code><code>id</code><code>:6 ver:1)</code>

<code>        </code><code>copy 1: 192.168.1.50:9422</code>

<code>        </code><code>copy 2: 192.168.1.64:9422</code>

   登入web管理控制台(正常)

<a href="http://s3.51cto.com/wyfs02/M01/23/DD/wKiom1NFcaqDOh_vAAJDlBgddZY353.jpg" target="_blank"></a>

   模拟主節點故障

<code>crm(live)node</code><code># standby    #離線,等待幾秒鐘</code>

<code>crm(live)node</code><code># online     #上線</code>

<code>crm(live)node</code><code># cd         #回退</code>

<code>crm(live)</code><code># status         #檢視叢集資源狀态</code>

<code> </code><code>Master</code><code>/Slave</code> <code>Set: ms_mfs_drbd [mfs_drbd]</code>

<code>     </code><code>Masters: [ two.soulboy.com ]</code>

<code>     </code><code>Slaves: [ one.soulboy.com ]</code>

<code> </code><code>mfsstore   (ocf::heartbeat:Filesystem):    Started two.soulboy.com</code>

<code> </code><code>mfsserver  (lsb:mfsmaster):                Started two.soulboy.com</code>

<code> </code><code>mfsip      (ocf::heartbeat:IPaddr):        Started two.soulboy.com</code>

   client再次建立檔案并檢視副本數(正常)

<code>[root@five /]</code><code># echo "123" &gt; /webdata/two</code>

<code>[root@five /]</code><code># mfsfileinfo  /webdata/two</code>

<code>/webdata/two</code><code>:</code>

<code>    </code><code>chunk 0: 0000000000000007_00000001 / (</code><code>id</code><code>:7 ver:1)</code>

   再次登入web管理控制台(正常)

<a href="http://s3.51cto.com/wyfs02/M01/23/DD/wKiom1NFdEKAHQEPAAJDlBgddZY112.jpg" target="_blank"></a>

   解決MFS單點故障的主要思路是将MasterServer安裝在drbd裝置目錄中,通過corosync+pacemaker将drbd、vip、mount、mfsmaster資源粘合在一起,并通過colocation和order的限制保證了資源間依賴關系和啟動次序,此外mfsmaster的啟動在pacemaker中定義為lsb風格RA,也就是形如/etc/init.d/目錄下的sysv風格的腳本。值得一提的是pacemaker的管理接口,本文中使用的是crmsh,而pcs接口有着比crmsh更強大的功能,可以實作管理叢集整個生命周期,支援節點的添加、移除、啟動、關閉等操作。

   實作mysql的高可用也可以通過本文這種思路實作,具體步驟可參考本文,這裡補充下pcs接口的用法,友善讀者做對比。

<code>pcs resource create myvip ocf:heartbeat:IPaddr params ip=192.168.1.70 </code><code>op</code> <code>monitor interval=20 timeout=20 on-fail=restart   </code><code>#定義vip</code>

<code>pcs resource create mystore ocf:heartbeat:Filesystem params device=</code><code>"192.168.1.50:/mysqldata"</code> <code>directory=</code><code>"/mydata"</code> <code>fstype=</code><code>"nfs"</code> <code>op</code> <code>monitor interval=40 timeout=40 on-fail=restart </code><code>op</code> <code>start timeout=60 </code><code>op</code> <code>stop timeout=60   </code><code>#定義nfs</code>

<code>pcs resource create mysqlserver lsb:mysqld </code><code>op</code> <code>monitor interval=20 timeout=20 on-fail=restart   </code><code>#定義httpd</code>

<code>pcs resource group add mysqlservice myvip mystore mysqlserver   </code><code>#定義webservice資源組</code>

<code>pcs constraint location mysqlservice prefers two.soulboy.com=500   </code><code>#定義資源傾向性,資源組webservice對節點二的傾向性為500</code>

<code>pcs constraint order start myvip </code><code>then</code> <code>start mystore   </code><code>#定義資源的order執行次序,這個貌似不能一下子定義三個資源月限制</code>

<code>pcs constraint order start mystore </code><code>then</code> <code>start mysqlserver   </code><code>#定義資源的order執行次序</code>

<code>pcs constraint colocation add myvip mystore   </code><code>#定義colocation,如果有資源組可以省略。這個貌似不能一次定義三個資源月限制</code>

<code>pcs constraint colocation add mystore mysqlserver   </code><code>#定義colocation</code>

本文轉自 ftmoonfans  51CTO部落格,原文連結:http://blog.51cto.com/soulboy/1393114