1 前言linux
筆者公司內有一套GlusterFS分佈式存儲,最近數據分區的文件系統提示錯誤,羣集有一個Brick須要替換掉。vim
基於穩妥操做的原則,筆者要先搭建測試環境並經過測試後才能在真實環境中執行,如下是筆者的測試文檔,給有須要的博友參閱,另外筆者在發表本文時已經在生產環境經過驗證。centos
服務器的故障日誌(有修復文件系統方法的博友歡迎指教):bash
cat /var/log/messages
能夠看到以下信息:服務器
Mar 21 14:58:04 GH01 kernel: XFS (dm-5): xfs_log_force: error 5 returned.
2 實踐部分ssh
2.1 環境信息tcp
2.1.1 主機信息
分佈式
GlusterH0[1-5]:ide
hostname=GlusterH0[1-5].cmdschool.org測試
ipaddress=10.168.0.19[1-5]
2.1.2 名稱解析配置
In GlusterH0[1-6]
echo "10.168.0.191 GlusterH01.cmdschool.org GH01" >> /etc/hosts echo "10.168.0.192 GlusterH02.cmdschool.org GH02" >> /etc/hosts echo "10.168.0.193 GlusterH03.cmdschool.org GH03" >> /etc/hosts echo "10.168.0.194 GlusterH04.cmdschool.org GH04" >> /etc/hosts echo "10.168.0.195 GlusterH05.cmdschool.org GH05" >> /etc/hosts
2.1.3 配置YUM源
In GlusterH0[1-6]
yum install -y centos-release-gluster38
2.1.4 關閉防火牆
In GlusterH0[1-6]
/etc/init.d/iptables stop chkconfig iptables off
2.2 配置數據存儲根目錄
In GlusterH0[1-5]
2.2.1 新建分區
fdisk /dev/sdb
詳細嚮導以下:
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x089fd1ab. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-26108, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-26108, default 26108): Using default value 26108 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
2.2.2 發現並校驗
partx /dev/sdb ls /dev/sdb*
2.2.3 建立文件系統
mkfs.xfs -i size=512 /dev/sdb1
2.2.4 配置掛載
mkdir -p /data echo '/dev/sdb1 /data xfs defaults 1 2' >> /etc/fstab mount -a && mount
2.3 配置glusterfs服務端
In GlusterH0[1-5] :
2.3.1 安裝yum源
yum install -y glusterfs-server
2.3.2 啓動服務
/etc/init.d/glusterd start chkconfig glusterd on
2.4 配置信任池
In GlusterH01:
gluster peer probe GH02 gluster peer probe GH03 gluster peer probe GH04
顯示如成功信息:
peer probe: success.
檢查信任池狀態
gluster peer status
顯示以下:
Number of Peers: 3 Hostname: GH02 Uuid: e935be20-6157-4bc6-804b-a6901850211f State: Accepted peer request (Connected) Hostname: GH03 Uuid: d91cf978-71d7-4734-b395-fae7ccf4c040 State: Accepted peer request (Connected) Hostname: GH04 Uuid: e05ea224-72f7-48c5-a73a-eeeb253d171d State: Accepted peer request (Connected)
檢查本與其餘服務器的鏈接狀態
netstat -antp | grep glusterd
顯示以下:
tcp 0 0 0.0.0.0:24007 0.0.0.0:* LISTEN 1213/glusterd tcp 0 0 10.168.0.191:24007 10.168.0.192:49150 ESTABLISHED 1213/glusterd tcp 0 0 10.168.0.191:49149 10.168.0.193:24007 ESTABLISHED 1213/glusterd tcp 0 0 10.168.0.191:24007 10.168.0.193:49149 ESTABLISHED 1213/glusterd tcp 0 0 10.168.0.191:49151 10.168.0.192:24007 ESTABLISHED 1213/glusterd tcp 0 0 10.168.0.191:49150 10.168.0.194:24007 ESTABLISHED 1213/glusterd tcp 0 0 10.168.0.191:24007 10.168.0.194:49151 ESTABLISHED 1213/glusterd
注:以上能夠看出本機與其餘的每一個brick都有兩個TCP鏈接,一共6個。
2.5 配置GlusterFS卷
2.5.1 配置存儲位置
In GlusterH0[1-4] :
mkdir -p /data/brick1/gv0
2.5.2 建立Gluster卷
In GlusterH01 :
gluster volume create gv0 replica 2 transport tcp GH01:/data/brick1/gv0 GH02:/data/brick1/gv0 GH03:/data/brick1/gv0 GH04:/data/brick1/gv0
顯示如成功信息:
volume create: gv0: success: please start the volume to access data
2.5.3 啓動GlusterFS卷
In GlusterH01 :
gluster volume start gv0
顯示如成功信息:
volume start: gv0: success
2.5.4 驗證卷的信息
In GlusterH01 :
gluster volume info
顯示以下:
Volume Name: gv0 Type: Distributed-Replicate Volume ID: cfea514c-cdce-4ae4-bcd9-bf56f4173271 Status: Started Snapshot Count: 0 Number of Bricks: 2 x 2 = 4 Transport-type: tcp Bricks: Brick1: GH01:/data/brick1/gv0 Brick2: GH02:/data/brick1/gv0 Brick3: GH03:/data/brick1/gv0 Brick4: GH04:/data/brick1/gv0 Options Reconfigured: transport.address-family: inet performance.readdir-ahead: on nfs.disable: on
2.6 配置Gluster客戶端
In GlusterH01 :
2.6.1 安裝客戶端相關包
yum install -y glusterfs-fuse
2.6.2 手動掛載卷gv0到本地
mount -t glusterfs GH01:/gv0 /mnt
2.7 測試Gluster卷
2.7.1 寫入測試
In GlusterH01 :
for i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/copy-test-$i; done
2.7.2 寫入確認
In GlusterH01 :
ls -lA /mnt/ | wc -l
In GlusterH0[1-4] :
ls -lA /data/brick1/gv0/
2.8 模擬brick故障
2.8.1 查看當前存儲狀態
In GlusterH01 :
gluster volume status
顯示以下:
Status of volume: gv0 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick GH01:/data/brick1/gv0 49153 0 Y 1447 Brick GH02:/data/brick1/gv0 49153 0 Y 1379 Brick GH03:/data/brick1/gv0 49153 0 Y 1281 Brick GH04:/data/brick1/gv0 49153 0 Y 1375 Self-heal Daemon on localhost N/A N/A Y 1506 Self-heal Daemon on GH02 N/A N/A Y 1440 Self-heal Daemon on GH04 N/A N/A Y 1430 Self-heal Daemon on GH03 N/A N/A Y 1430 Task Status of Volume gv0 ------------------------------------------------------------------------------ There are no active volume tasks
注:注意到Online項所有爲「Y」
2.8.2 製造故障
In GlusterH01 :
vim /etc/fstab
註釋掉以下行:
#/dev/sdb1 /data xfs defaults 1 2
重啓服務器
reboot
2.8.3 查看當前存儲狀態
In GlusterH01 :
gluster volume status
顯示以下:
Status of volume: gv0 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick GH01:/data/brick1/gv0 N/A N/A N N/A Brick GH02:/data/brick1/gv0 49153 0 Y 1379 Brick GH03:/data/brick1/gv0 49153 0 Y 1281 Brick GH04:/data/brick1/gv0 49153 0 Y 1375 Self-heal Daemon on localhost N/A N/A Y 1484 Self-heal Daemon on GH02 N/A N/A Y 1453 Self-heal Daemon on GH03 N/A N/A Y 1443 Self-heal Daemon on GH04 N/A N/A Y 1444 Task Status of Volume gv0 ------------------------------------------------------------------------------ There are no active volume tasks
注:注意到GH01的Online項爲「N」
注:文件系統故障,假設物理硬盤沒有問題或已經更換陣列中的硬盤
2.9 恢復故障brick方法
2.9.1 結束故障brick的進程
In GlusterH01 :
gluster volume status
顯示以下:
Status of volume: gv0 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick GH01:/data/brick1/gv0 N/A N/A N N/A Brick GH02:/data/brick1/gv0 49153 0 Y 1379 Brick GH03:/data/brick1/gv0 49153 0 Y 1281 Brick GH04:/data/brick1/gv0 49153 0 Y 1375 Self-heal Daemon on localhost N/A N/A Y 1484 Self-heal Daemon on GH02 N/A N/A Y 1453 Self-heal Daemon on GH03 N/A N/A Y 1443 Self-heal Daemon on GH04 N/A N/A Y 1444 Task Status of Volume gv0 ------------------------------------------------------------------------------ There are no active volume tasks
注:若是狀態Online項爲「N」的GH01存在PID號(不顯示N/A)應當使用以下命令結束掉進程方可繼續下面步驟。
kill -15 pid
2.9.2 建立新的數據目錄
In GlusterH01:
mkfs.xfs -i size=512 /dev/sdb1
編輯fstab
vim /etc/fstab
去掉註釋:
/dev/sdb1 /data xfs defaults 1 2
從新掛載文件系統:
mount -a
增長新的數據存放文件夾(不能夠與以前目錄同樣)
mkdir -p /data/brick1/gv1
2.9.3 查詢故障節點的備份節點(gh02)目錄的擴展屬性
In GlusterH01:
ssh gh02 getfattr -d -m. -e hex /data/brick1/gv0
顯示以下:
getfattr: Removing leading '/' from absolute path names # file: data/brick1/gv0 security.selinux=0x756e636f6e66696e65645f753a6f626a6563745f723a686f6d655f726f6f745f743a733000 trusted.gfid=0x00000000000000000000000000000001 trusted.glusterfs.dht=0x0000000100000000000000007ffffffe trusted.glusterfs.volume-id=0xcfea514ccdce4ae4bcd9bf56f4173271
2.9.4 掛載卷並觸發自愈
In GlusterH01:
1)將卷掛到mnt目錄下
mount -t glusterfs GH01:/gv0 /mnt
2)新建一個卷中不存在的目錄並刪除
mkdir /mnt/testDir001 rmdir /mnt/testDir001
3)設置擴展屬性觸發自愈
setfattr -n trusted.non-existent-key -v abc /mnt setfattr -x trusted.non-existent-key /mnt
2.9.5 檢查當前節點是否掛起xattrs
In GlusterH01:
1)再次查詢故障節點的備份節點(gh02)目錄的擴展屬性
ssh gh02 getfattr -d -m. -e hex /data/brick1/gv0
發現以下:
# file: data/brick1/gv0 security.selinux=0x756e636f6e66696e65645f753a6f626a6563745f723a686f6d655f726f6f745f743a733000 trusted.afr.dirty=0x000000000000000000000000 trusted.afr.gv0-client-0=0x000000000000000200000002 trusted.gfid=0x00000000000000000000000000000001 trusted.glusterfs.dht=0x0000000100000000000000007ffffffe trusted.glusterfs.volume-id=0xcfea514ccdce4ae4bcd9bf56f4173271 getfattr: Removing leading '/' from absolute path names
注:留意第4行,表示xattrs已經將源標記爲gh02:/data/brick1/gv0
2)檢查卷的狀態是否顯示須要替換
In GlusterH01:
gluster volume heal gv0 info
顯示以下:
Brick GH01:/data/brick1/gv0 Status: Transport endpoint is not connected Number of entries: - Brick GH02:/data/brick1/gv0 / Status: Connected Number of entries: 1 Brick GH03:/data/brick1/gv0 Status: Connected Number of entries: 0 Brick GH04:/data/brick1/gv0 Status: Connected Number of entries: 0
注:狀態提示傳輸端點未鏈接(第2行)
2.9.6 使用強制提交完成操做
In GlusterH01:
gluster volume replace-brick gv0 GH01:/data/brick1/gv0 GH01:/data/brick1/gv1 commit force
提示以下表示正常完成:
volume replace-brick: success: replace-brick commit force operation successful
注:也能夠將數據恢復到另一臺服務器,詳細命令以下(可選):
gluster peer probe GH05 gluster volume replace-brick gv0 GH01:/data/brick1/gv0 GH05:/data/brick1/gv0 commit force
2.9.7 檢查存儲的在線狀態
In GlusterH01:
gluster volume status
顯示以下:
Status of volume: gv0 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick GH01:/data/brick1/gv1 49153 0 Y 1658 Brick GH02:/data/brick1/gv0 49153 0 Y 1406 Brick GH03:/data/brick1/gv0 49153 0 Y 1371 Brick GH04:/data/brick1/gv0 49153 0 Y 1406 Self-heal Daemon on localhost N/A N/A Y 1663 Self-heal Daemon on GH04 N/A N/A Y 1703 Self-heal Daemon on GH03 N/A N/A Y 1695 Self-heal Daemon on GH02 N/A N/A Y 1726 Task Status of Volume gv0 ------------------------------------------------------------------------------ There are no active volume tasks
另外,若是更換到其餘服務器狀態顯示以下:
Status of volume: gv0 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick GH05:/data/brick1/gv0 49152 0 Y 1448 Brick GH02:/data/brick1/gv0 49153 0 Y 1270 Brick GH03:/data/brick1/gv0 49153 0 Y 1328 Brick GH04:/data/brick1/gv0 49153 0 Y 1405 Self-heal Daemon on localhost N/A N/A Y 1559 Self-heal Daemon on GH02 N/A N/A Y 1489 Self-heal Daemon on GH03 N/A N/A Y 1479 Self-heal Daemon on GH04 N/A N/A Y 1473 Self-heal Daemon on GH05 N/A N/A Y 1453 Task Status of Volume gv0 ------------------------------------------------------------------------------ There are no active volume tasks
參閱文檔
===================================
官方更換操做:
http://gluster.readthedocs.io/en/latest/Administrator%20Guide/Managing%20Volumes/#shrinking-volumes