天天看點

GlusterFS更換故障Brick

1 前言

筆者公司内有一套GlusterFS分布式存儲,最近資料分區的檔案系統提示錯誤,群集有一個Brick需要替換掉。

基于穩妥操作的原則,筆者要先搭建測試環境并通過測試後才能在真實環境中執行,以下是筆者的測試文檔,給有需要的博友參閱,另外筆者在發表本文時已經在生産環境通過驗證。

伺服器的故障日志(有修複檔案系統方法的博友歡迎指教):

1

<code>cat</code> <code>/var/log/messages</code>

可以看到如下資訊:

<code>Mar 21 14:58:04 GH01 kernel: XFS (dm-5): xfs_log_force: error 5 returned.</code>

2 實踐部分

2.1 環境資訊

2.1.1 主機資訊

GlusterH0[1-5]:

hostname=GlusterH0[1-5].cmdschool.org

ipaddress=10.168.0.19[1-5]

2.1.2 名稱解析配置

In GlusterH0[1-6]

2

3

4

5

<code>echo</code> <code>"10.168.0.191 GlusterH01.cmdschool.org GH01"</code> <code>&gt;&gt; </code><code>/etc/hosts</code>

<code>echo</code> <code>"10.168.0.192 GlusterH02.cmdschool.org GH02"</code> <code>&gt;&gt; </code><code>/etc/hosts</code>

<code>echo</code> <code>"10.168.0.193 GlusterH03.cmdschool.org GH03"</code> <code>&gt;&gt; </code><code>/etc/hosts</code>

<code>echo</code> <code>"10.168.0.194 GlusterH04.cmdschool.org GH04"</code> <code>&gt;&gt; </code><code>/etc/hosts</code>

<code>echo</code> <code>"10.168.0.195 GlusterH05.cmdschool.org GH05"</code> <code>&gt;&gt; </code><code>/etc/hosts</code>

2.1.3 配置YUM源

<code>yum </code><code>install</code> <code>-y centos-release-gluster38</code>

2.1.4 關閉防火牆

<code>/etc/init</code><code>.d</code><code>/iptables</code> <code>stop</code>

<code>chkconfig iptables off</code>

2.2 配置資料存儲根目錄

In GlusterH0[1-5]

2.2.1 建立分區

<code>fdisk</code> <code>/dev/sdb</code>

詳細向導如下:

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<code>Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel</code>

<code>Building a new DOS disklabel with disk identifier 0x089fd1ab.</code>

<code>Changes will remain </code><code>in</code> <code>memory only, </code><code>until</code> <code>you decide to write them.</code>

<code>After that, of course, the previous content won't be recoverable.</code>

<code>Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)</code>

<code>WARNING: DOS-compatible mode is deprecated. It's strongly recommended to</code>

<code>         </code><code>switch off the mode (</code><code>command</code> <code>'c'</code><code>) and change display </code><code>units</code> <code>to</code>

<code>         </code><code>sectors (</code><code>command</code> <code>'u'</code><code>).</code>

<code>Command (m </code><code>for</code> <code>help): n</code>

<code>Command action</code>

<code>   </code><code>e   extended</code>

<code>   </code><code>p   primary partition (1-4)</code>

<code>p</code>

<code>Partition number (1-4): 1</code>

<code>First cylinder (1-26108, default 1): </code>

<code>Using default value 1</code>

<code>Last cylinder, +cylinders or +size{K,M,G} (1-26108, default 26108): </code>

<code>Using default value 26108</code>

<code>Command (m </code><code>for</code> <code>help): w</code>

<code>The partition table has been altered!</code>

<code>Calling ioctl() to re-</code><code>read</code> <code>partition table.</code>

<code>Syncing disks.</code>

2.2.2 發現并校驗

<code>partx </code><code>/dev/sdb</code>

<code>ls</code> <code>/dev/sdb</code><code>*</code>

2.2.3 建立檔案系統

<code>mkfs.xfs -i size=512 </code><code>/dev/sdb1</code>

2.2.4 配置挂載

<code>mkdir</code> <code>-p </code><code>/data</code>

<code>echo</code> <code>'/dev/sdb1 /data xfs defaults 1 2'</code> <code>&gt;&gt; </code><code>/etc/fstab</code>

<code>mount</code> <code>-a &amp;&amp; </code><code>mount</code>

2.3 配置glusterfs服務端

In GlusterH0[1-5] :

2.3.1 安裝yum源

<code>yum </code><code>install</code> <code>-y glusterfs-server</code>

2.3.2 啟動服務

<code>/etc/init</code><code>.d</code><code>/glusterd</code> <code>start</code>

<code>chkconfig glusterd on</code>

2.4 配置信任池

In GlusterH01:

<code>gluster peer probe GH02</code>

<code>gluster peer probe GH03</code>

<code>gluster peer probe GH04</code>

顯示如成功資訊:

<code>peer probe: success.</code>

檢查信任池狀态

<code>gluster peer status</code>

顯示如下:

<code>Number of Peers: 3</code>

<code>Hostname: GH02</code>

<code>Uuid: e935be20-6157-4bc6-804b-a6901850211f</code>

<code>State: Accepted peer request (Connected)</code>

<code>Hostname: GH03</code>

<code>Uuid: d91cf978-71d7-4734-b395-fae7ccf4c040</code>

<code>Hostname: GH04</code>

<code>Uuid: e05ea224-72f7-48c5-a73a-eeeb253d171d</code>

檢查本與其他伺服器的連接配接狀态

<code>netstat</code> <code>-antp | </code><code>grep</code> <code>glusterd</code>

<code>tcp        0      0 0.0.0.0:24007               0.0.0.0:*                   LISTEN      1213</code><code>/glusterd</code>

<code>tcp        0      0 10.168.0.191:24007          10.168.0.192:49150          ESTABLISHED 1213</code><code>/glusterd</code>

<code>tcp        0      0 10.168.0.191:49149          10.168.0.193:24007          ESTABLISHED 1213</code><code>/glusterd</code>

<code>tcp        0      0 10.168.0.191:24007          10.168.0.193:49149          ESTABLISHED 1213</code><code>/glusterd</code>

<code>tcp        0      0 10.168.0.191:49151          10.168.0.192:24007          ESTABLISHED 1213</code><code>/glusterd</code>

<code>tcp        0      0 10.168.0.191:49150          10.168.0.194:24007          ESTABLISHED 1213</code><code>/glusterd</code>

<code>tcp        0      0 10.168.0.191:24007          10.168.0.194:49151          ESTABLISHED 1213</code><code>/glusterd</code>

注:以上可以看出本機與其他的每個brick都有兩個TCP連接配接,一共6個。

2.5 配置GlusterFS卷

2.5.1 配置存儲位置

In GlusterH0[1-4] :

<code>mkdir</code> <code>-p </code><code>/data/brick1/gv0</code>

2.5.2 建立Gluster卷

In GlusterH01 :

<code>gluster volume create gv0 replica 2 transport tcp GH01:</code><code>/data/brick1/gv0</code> <code>GH02:</code><code>/data/brick1/gv0</code> <code>GH03:</code><code>/data/brick1/gv0</code> <code>GH04:</code><code>/data/brick1/gv0</code>

<code>volume create: gv0: success: please start the volume to access data</code>

2.5.3 啟動GlusterFS卷

<code>gluster volume start gv0</code>

<code>volume start: gv0: success</code>

2.5.4 驗證卷的資訊

<code>gluster volume info</code>

<code>Volume Name: gv0</code>

<code>Type: Distributed-Replicate</code>

<code>Volume ID: cfea514c-cdce-4ae4-bcd9-bf56f4173271</code>

<code>Status: Started</code>

<code>Snapshot Count: 0</code>

<code>Number of Bricks: 2 x 2 = 4</code>

<code>Transport-</code><code>type</code><code>: tcp</code>

<code>Bricks:</code>

<code>Brick1: GH01:</code><code>/data/brick1/gv0</code>

<code>Brick2: GH02:</code><code>/data/brick1/gv0</code>

<code>Brick3: GH03:</code><code>/data/brick1/gv0</code>

<code>Brick4: GH04:</code><code>/data/brick1/gv0</code>

<code>Options Reconfigured:</code>

<code>transport.address-family: inet</code>

<code>performance.readdir-ahead: on</code>

<code>nfs.disable: on</code>

2.6 配置Gluster用戶端

In GlusterH01 :

2.6.1 安裝用戶端相關包

<code>yum </code><code>install</code> <code>-y glusterfs-fuse</code>

2.6.2 手動挂載卷gv0到本地

<code>mount</code> <code>-t glusterfs GH01:</code><code>/gv0</code> <code>/mnt</code>

2.7 測試Gluster卷

2.7.1 寫入測試

<code>for</code> <code>i </code><code>in</code> <code>`</code><code>seq</code> <code>-w 1 100`; </code><code>do</code> <code>cp</code> <code>-rp </code><code>/var/log/messages</code> <code>/mnt/copy-test-</code><code>$i; </code><code>done</code>

2.7.2 寫入确認

<code>ls</code> <code>-lA </code><code>/mnt/</code> <code>| </code><code>wc</code> <code>-l</code>

<code>ls</code> <code>-lA </code><code>/data/brick1/gv0/</code>

2.8 模拟brick故障

2.8.1 檢視目前存儲狀态

<code>gluster volume status</code>

<code>Status of volume: gv0</code>

<code>Gluster process                             TCP Port  RDMA Port  Online  Pid</code>

<code>------------------------------------------------------------------------------</code>

<code>Brick GH01:</code><code>/data/brick1/gv0</code>                 <code>49153     0          Y       1447</code>

<code>Brick GH02:</code><code>/data/brick1/gv0</code>                 <code>49153     0          Y       1379</code>

<code>Brick GH03:</code><code>/data/brick1/gv0</code>                 <code>49153     0          Y       1281</code>

<code>Brick GH04:</code><code>/data/brick1/gv0</code>                 <code>49153     0          Y       1375</code>

<code>Self-heal Daemon on localhost               N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1506</code>

<code>Self-heal Daemon on GH02                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1440</code>

<code>Self-heal Daemon on GH04                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1430</code>

<code>Self-heal Daemon on GH03                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1430</code>

<code>Task Status of Volume gv0</code>

<code>There are no active volume tasks</code>

注:注意到Online項全部為“Y”

2.8.2 制造故障

<code>vim </code><code>/etc/fstab</code>

注釋掉如下行:

<code>#/dev/sdb1 /data xfs defaults 1 2</code>

重新開機伺服器

<code>reboot</code>

2.8.3 檢視目前存儲狀态

<code>Brick GH01:</code><code>/data/brick1/gv0</code>                 <code>N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>N       N</code><code>/A</code>

<code>Self-heal Daemon on localhost               N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1484</code>

<code>Self-heal Daemon on GH02                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1453</code>

<code>Self-heal Daemon on GH03                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1443</code>

<code>Self-heal Daemon on GH04                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1444</code>

注:注意到GH01的Online項為“N”

注:檔案系統故障,假設實體硬碟沒有問題或已經更換陣列中的硬碟

2.9 恢複故障brick方法

2.9.1 結束故障brick的程序

注:如果狀态Online項為“N”的GH01存在PID号(不顯示N/A)應當使用如下指令結束掉程序方可繼續下面步驟。

<code>kill</code> <code>-15 pid</code>

2.9.2 建立新的資料目錄

編輯fstab

去掉注釋:

<code>/dev/sdb1</code> <code>/data</code> <code>xfs defaults 1 2</code>

重新挂載檔案系統:

<code>mount</code> <code>-a</code>

增加新的資料存放檔案夾(不可以與之前目錄一樣)

<code>mkdir</code> <code>-p </code><code>/data/brick1/gv1</code>

2.9.3 查詢故障節點的備份節點(gh02)目錄的擴充屬性

<code>ssh</code> <code>gh02 getfattr -d -m. -e hex </code><code>/data/brick1/gv0</code>

<code>getfattr: Removing leading </code><code>'/'</code> <code>from absolute path names</code>

<code># file: data/brick1/gv0</code>

<code>security.selinux=0x756e636f6e66696e65645f753a6f626a6563745f723a686f6d655f726f6f745f743a733000</code>

<code>trusted.gfid=0x00000000000000000000000000000001</code>

<code>trusted.glusterfs.dht=0x0000000100000000000000007ffffffe</code>

<code>trusted.glusterfs.volume-</code><code>id</code><code>=0xcfea514ccdce4ae4bcd9bf56f4173271</code>

2.9.4 挂載卷并觸發自愈

1)将卷挂到mnt目錄下

2)建立一個卷中不存在的目錄并删除

<code>mkdir</code> <code>/mnt/testDir001</code>

<code>rmdir</code> <code>/mnt/testDir001</code>

3)設定擴充屬性觸發自愈

<code>setfattr -n trusted.non-existent-key -</code><code>v</code> <code>abc </code><code>/mnt</code>

<code>setfattr -x trusted.non-existent-key </code><code>/mnt</code>

2.9.5 檢查目前節點是否挂起xattrs

1)再次查詢故障節點的備份節點(gh02)目錄的擴充屬性

發現如下:

<code>trusted.afr.dirty=0x000000000000000000000000</code>

<code>trusted.afr.gv0-client-0=0x000000000000000200000002</code>

注:留意第4行,表示xattrs已經将源标記為gh02:/data/brick1/gv0

2)檢查卷的狀态是否顯示需要替換

<code>gluster volume heal gv0 info</code>

<code>Brick GH01:</code><code>/data/brick1/gv0</code>

<code>Status: Transport endpoint is not connected</code>

<code>Number of entries: -</code>

<code>Brick GH02:</code><code>/data/brick1/gv0</code>

<code>/</code>

<code>Status: Connected</code>

<code>Number of entries: 1</code>

<code>Brick GH03:</code><code>/data/brick1/gv0</code>

<code>Number of entries: 0</code>

<code>Brick GH04:</code><code>/data/brick1/gv0</code>

注:狀态提示傳輸端點未連接配接(第2行)

2.9.6 使用強制送出完成操作

<code>gluster volume replace-brick gv0 GH01:</code><code>/data/brick1/gv0</code> <code>GH01:</code><code>/data/brick1/gv1</code> <code>commit force</code>

提示如下表示正常完成:

<code>volume replace-brick: success: replace-brick commit force operation successful</code>

注:也可以将資料恢複到另外一台伺服器,詳細指令如下(可選):

<code>gluster peer probe GH05</code>

<code>gluster volume replace-brick gv0 GH01:</code><code>/data/brick1/gv0</code> <code>GH05:</code><code>/data/brick1/gv0</code> <code>commit force</code>

2.9.7 檢查存儲的線上狀态

<code>Brick GH01:</code><code>/data/brick1/gv1</code>                 <code>49153     0          Y       1658</code>

<code>Brick GH02:</code><code>/data/brick1/gv0</code>                 <code>49153     0          Y       1406</code>

<code>Brick GH03:</code><code>/data/brick1/gv0</code>                 <code>49153     0          Y       1371</code>

<code>Brick GH04:</code><code>/data/brick1/gv0</code>                 <code>49153     0          Y       1406</code>

<code>Self-heal Daemon on localhost               N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1663</code>

<code>Self-heal Daemon on GH04                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1703</code>

<code>Self-heal Daemon on GH03                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1695</code>

<code>Self-heal Daemon on GH02                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1726</code>

另外,如果更換到其他伺服器狀态顯示如下:

<code>Brick GH05:</code><code>/data/brick1/gv0</code>                 <code>49152     0          Y       1448</code>

<code>Brick GH02:</code><code>/data/brick1/gv0</code>                 <code>49153     0          Y       1270</code>

<code>Brick GH03:</code><code>/data/brick1/gv0</code>                 <code>49153     0          Y       1328</code>

<code>Brick GH04:</code><code>/data/brick1/gv0</code>                 <code>49153     0          Y       1405</code>

<code>Self-heal Daemon on localhost               N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1559</code>

<code>Self-heal Daemon on GH02                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1489</code>

<code>Self-heal Daemon on GH03                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1479</code>

<code>Self-heal Daemon on GH04                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1473</code>

<code>Self-heal Daemon on GH05                    N</code><code>/A</code>       <code>N</code><code>/A</code>        <code>Y       1453</code>

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