天天看點

GlusterFS資料存儲腦裂修複方案

一. 概念解析

常見術語
名稱 解釋
Brick GlusterFS 的基本存儲單元,由可信存儲池中伺服器上對外輸出的目錄表示。存儲目錄的格式由伺服器和目錄的絕對路徑構成

SERVER:EXPORT

Volume 一個卷,在邏輯上由N個bricks組成
Fuse Unix-like OS上的可動态加載的子產品,允許使用者不用修改核心即可建立自己的檔案系統
Glusterd Gluster management daemon,glusterfs 背景程序,運作在所有Glusterfs 節點上
CLI Command LineInterface 控制台,指令行界面
AFR Automatic FileReplication 自動檔案複制
GFID glusterfs内部檔案辨別符,是一個uuid,每個檔案唯一
ReplicateVolume 副本卷
Client 用戶端,挂載服務端的存儲
Server 存儲節點伺服器,存儲資料的位置

1.1 什麼是腦裂

腦裂是指檔案的兩個或多個複制副本内容出現差異的情況。當檔案處于腦裂狀态時,副本的brick之間檔案的資料或中繼資料不一緻,此時盡管所有brick都存在,卻沒有足夠的資訊來權威地選擇一個原始副本并修複不良的副本。對于目錄,還存在一個條目腦裂,其中内部的檔案在副本的各個brick中具有不同的gfid檔案類型;當Gluster AFR無法确定複制集中哪個副本是正确時,此時将會産生腦裂。

1.2 腦裂類型

  • 資料腦裂:檔案中的資料在副本集中的brick上不同;
  • 中繼資料腦裂:brick上的中繼資料不同;
  • 條目裂腦:當檔案在每個副本對上具有不同的gfid時,會發生這種情況;此時是不能自動治愈的。

1.3 檢視腦裂資訊

gluster volume heal <VOLNAME> info           

此指令将會列出所有需要修複的檔案(并由self-heal守護程序處理)。執行以後将會輸出檔案路徑或者GFID。

heal info

指令原理概述

當調用此指令時,将生成一個

glfsheal

程序,該程序将讀取

/<brick-path>/.glusterfs/indices/

下的各個子目錄中(它可以連接配接到的)所有brick條目;這些條目是需要修複檔案的gfid;一旦從一個brick中獲得GFID條目,就根據該檔案在副本集和

trusted.afr.*

擴充屬性的每個brick上進行查找,确定檔案是否需要修複,是否處于腦裂或其他狀态。

指令輸出示例
[root@gfs ~]# gluster volume heal test info
Brick \<hostname:brickpath-b1>
<gfid:aaca219f-0e25-4576-8689-3bfd93ca70c2> - Is in split-brain
<gfid:39f301ae-4038-48c2-a889-7dac143e82dd> - Is in split-brain
<gfid:c3c94de2-232d-4083-b534-5da17fc476ac> - Is in split-brain
<gfid:6dc78b20-7eb6-49a3-8edb-087b90142246>

Number of entries: 4

Brick <hostname:brickpath-b2>
/dir/file2
/dir/file1 - Is in split-brain
/dir - Is in split-brain
/dir/file3
/file4 - Is in split-brain
/dir/a

Number of entries: 6           
指令輸出解釋

此指令輸出中列出的所有檔案都需要修複;列出的檔案将會附帶以下标記:

1)

Is in split-brain

資料或中繼資料腦裂的檔案将在其路徑/GFID後面附加

ls in split-brain

,例如,對

/file4

檔案的輸出;但是,對于GFID腦裂中的檔案,檔案的父目錄顯示為腦裂,檔案本身顯示為需要修複,例如,上面的

/dir

為檔案

/dir/a

的GFID腦裂。腦裂中的檔案如果不解決腦裂問題就無法自愈。

2)

Is possibly undergoing heal

運作

heal info

指令時,将會鎖定存儲中的每個檔案,以查找是否需要修複。但是,如果自我修複守護程式已經開始修複檔案,則它将不會被glfsheal鎖定。在這種情況下,它将會輸出此消息。另一個可能的情況是多個glfsheal程序同時運作(例如,多個使用者同時運作heal info指令)并争奪相同的鎖。

示例

我們使用兩塊brick b1和b2在複制卷

test

上;關閉self heal守護程式,挂載點為/mnt。

# gluster volume heal test info
Brick \<hostname:brickpath-b1>
<gfid:aaca219f-0e25-4576-8689-3bfd93ca70c2> - Is in split-brain
<gfid:39f301ae-4038-48c2-a889-7dac143e82dd> - Is in split-brain
<gfid:c3c94de2-232d-4083-b534-5da17fc476ac> - Is in split-brain
<gfid:6dc78b20-7eb6-49a3-8edb-087b90142246>

Number of entries: 4

Brick <hostname:brickpath-b2>
/dir/file2
/dir/file1 - Is in split-brain
/dir - Is in split-brain
/dir/file3
/file4 - Is in split-brain
/dir/a

Number of entries: 6           
輸出結果分析

brick b1,有四項需要修複:

1)gfid為

6dc78b20-7eb6-49a3-8edb-087b90142246

的檔案需要修複

aaca219f-0e25-4576-8689-3bfd93ca70c2

39f301ae-4038-48c2-a889-7dac143e82dd

c3c94de2-232d-4083-b534-5da17fc476ac

處于腦裂狀态

brick b2,有六項需要修複:

a

file2

file3

需要修複

file1

file4

/dir

二. 修複腦裂

指令語句

gluster volume heal <VOLNAME> info split-brain           
輸出結果示例
# gluster volume heal test info split-brain
Brick <hostname:brickpath-b1>
<gfid:aaca219f-0e25-4576-8689-3bfd93ca70c2>
<gfid:39f301ae-4038-48c2-a889-7dac143e82dd>
<gfid:c3c94de2-232d-4083-b534-5da17fc476ac>
Number of entries in split-brain: 3

Brick <hostname:brickpath-b2>
/dir/file1
/dir
/file4
Number of entries in split-brain: 3           
注意,

heal info

指令,對于GFID split brains(相同的檔案名但不同的GFID)

他們的父目錄處于腦裂中狀态。

2.1 使用gluster指令行工具解決腦裂問題

一旦确定了腦裂中的檔案,就可以使用多種政策從gluster指令行完成其修複。此方法不支援Entry/GFID腦裂修複;可以使用以下政策來修複資料和中繼資料腦裂:

2.1.1 選擇較大的檔案作為源檔案

此指令對于已知/确定要将較大的檔案視為源檔案的檔案修複非常有用。

gluster volume heal <VOLNAME> split-brain bigger-file <FILE>           

在這裡,

<FILE>

可以是從卷的根目錄中看到的完整檔案名(也可以是檔案的GFID字元串),一旦執行此指令,将會使用最大的

<FILE>

副本,并以該brick作為源完成修複。

示例:

在修複檔案之前,需注意檔案大小和md5校驗和:

在brick b1:

[brick1]# stat b1/dir/file1
  File: ‘b1/dir/file1’
  Size: 17              Blocks: 16         IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 919362      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-03-06 13:55:40.149897333 +0530
Modify: 2015-03-06 13:55:37.206880347 +0530
Change: 2015-03-06 13:55:37.206880347 +0530
 Birth: -
[brick1]#
[brick1]# md5sum b1/dir/file1
040751929ceabf77c3c0b3b662f341a8  b1/dir/file1           

在brick b2:

[brick2]# stat b2/dir/file1
  File: ‘b2/dir/file1’
  Size: 13              Blocks: 16         IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 919365      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-03-06 13:54:22.974451898 +0530
Modify: 2015-03-06 13:52:22.910758923 +0530
Change: 2015-03-06 13:52:22.910758923 +0530
 Birth: -
[brick2]#
[brick2]# md5sum b2/dir/file1
cb11635a45d45668a403145059c2a0d5  b2/dir/file1           

使用以下指令修複file1:

gluster volume heal test split-brain bigger-file /dir/file1           

修複完成後,兩個brick上的md5校驗和和檔案大小應該相同。

在brick b1檢視:

[brick1]# stat b1/dir/file1
  File: ‘b1/dir/file1’
  Size: 17              Blocks: 16         IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 919362      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-03-06 14:17:27.752429505 +0530
Modify: 2015-03-06 13:55:37.206880347 +0530
Change: 2015-03-06 14:17:12.880343950 +0530
 Birth: -
[brick1]#
[brick1]# md5sum b1/dir/file1
040751929ceabf77c3c0b3b662f341a8  b1/dir/file1           

在brick b2檢視:

[brick2]# stat b2/dir/file1
  File: ‘b2/dir/file1’
  Size: 17              Blocks: 16         IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 919365      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-03-06 14:17:23.249403600 +0530
Modify: 2015-03-06 13:55:37.206880000 +0530
Change: 2015-03-06 14:17:12.881343955 +0530
 Birth: -
[brick2]#
[brick2]# md5sum b2/dir/file1
040751929ceabf77c3c0b3b662f341a8  b2/dir/file1           

2.1.2 選擇以最新修改時間為源的檔案

gluster volume heal <VOLNAME> split-brain latest-mtime <FILE>           

該指令使用對

<FILE>

具有最新修改時間的brick作為修複源。

2.1.3 選擇副本中的一個brick作為特定檔案的源

gluster volume heal <VOLNAME> split-brain source-brick <HOSTNAME:BRICKNAME> <FILE>           

<HOSTNAME:BRICKNAME>

被選擇為源brick,使用存在于源brick中的檔案作為修複源。

注意在修複前後的md5校驗和和檔案大小。

修複前

[brick1]# stat b1/file4
  File: ‘b1/file4’
  Size: 4               Blocks: 16         IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 919356      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-03-06 13:53:19.417085062 +0530
Modify: 2015-03-06 13:53:19.426085114 +0530
Change: 2015-03-06 13:53:19.426085114 +0530
 Birth: -
[brick1]#
[brick1]# md5sum b1/file4
b6273b589df2dfdbd8fe35b1011e3183  b1/file4           
[brick2]# stat b2/file4
  File: ‘b2/file4’
  Size: 4               Blocks: 16         IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 919358      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-03-06 13:52:35.761833096 +0530
Modify: 2015-03-06 13:52:35.769833142 +0530
Change: 2015-03-06 13:52:35.769833142 +0530
 Birth: -
[brick2]#
[brick2]# md5sum b2/file4
0bee89b07a248e27c83fc3d5951213c1  b2/file4           

使用下述指令修複帶有gfid c3c94de2-232d-4083-b534-5da17fc476ac的檔案:

gluster volume heal test split-brain source-brick test-host:/test/b1 gfid:c3c94de2-232d-4083-b534-5da17fc476ac           

修複後:

在brick b1檢視:

# stat b1/file4
  File: ‘b1/file4’
  Size: 4               Blocks: 16         IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 919356      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-03-06 14:23:38.944609863 +0530
Modify: 2015-03-06 13:53:19.426085114 +0530
Change: 2015-03-06 14:27:15.058927962 +0530
 Birth: -
# md5sum b1/file4
b6273b589df2dfdbd8fe35b1011e3183  b1/file4           

在brick b2檢視:

# stat b2/file4
 File: ‘b2/file4’
  Size: 4               Blocks: 16         IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 919358      Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-03-06 14:23:38.944609000 +0530
Modify: 2015-03-06 13:53:19.426085000 +0530
Change: 2015-03-06 14:27:15.059927968 +0530
 Birth: -
# md5sum b2/file4
b6273b589df2dfdbd8fe35b1011e3183  b2/file4           

2.1.4 選擇一個brick作為所有檔案的源

場景:許多檔案都處于腦裂狀态,使用一個brick作為源

gluster volume heal <VOLNAME> split-brain source-brick <HOSTNAME:BRICKNAME>           

上述指令的結果是,選擇

<HOSTNAME:BRICKNAME>

中的所有腦裂檔案作為源檔案并将其修複到叢集中。

一個卷中有三個檔案

a,b和c

發生腦裂。

# gluster volume heal test split-brain source-brick test-host:/test/b1
Healed gfid:944b4764-c253-4f02-b35f-0d0ae2f86c0f.
Healed gfid:3256d814-961c-4e6e-8df2-3a3143269ced.
Healed gfid:b23dd8de-af03-4006-a803-96d8bc0df004.
Number of healed entries: 3           
如上所述,此方法不支援Entry/GFID腦裂修複不支援使用CLI修複腦裂。修複/dir将失敗,因為它在

entry split-brain

# gluster volume heal test split-brain source-brick test-host:/test/b1 /dir
Healing /dir failed:Operation not permitted.
Volume heal failed.           

但是此種問題可以通過從該brick之外的所有brick中删除檔案來修複。參見下文修複目錄腦裂。

2.2 從用戶端修複腦裂

使用

getfattr

setfattr

指令,檢測檔案的資料和中繼資料腦裂狀态,并從用戶端修複腦裂。

使用具有brick

b0,b1,b2和b3

test

卷進行測試。

# gluster volume info test

Volume Name: test
Type: Distributed-Replicate
Volume ID: 00161935-de9e-4b80-a643-b36693183b61
Status: Started
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: test-host:/test/b0
Brick2: test-host:/test/b1
Brick3: test-host:/test/b2
Brick4: test-host:/test/b3           

brick的目錄結構如下:

# tree -R /test/b?
/test/b0
├── dir
│   └── a
└── file100

/test/b1
├── dir
│   └── a
└── file100

/test/b2
├── dir
├── file1
├── file2
└── file99

/test/b3
├── dir
├── file1
├── file2
└── file99           

檢視處于腦裂狀态的檔案

# gluster v heal test info split-brain
Brick test-host:/test/b0/
/file100
/dir
Number of entries in split-brain: 2

Brick test-host:/test/b1/
/file100
/dir
Number of entries in split-brain: 2

Brick test-host:/test/b2/
/file99
<gfid:5399a8d1-aee9-4653-bb7f-606df02b3696>
Number of entries in split-brain: 2

Brick test-host:/test/b3/
<gfid:05c4b283-af58-48ed-999e-4d706c7b97d5>
<gfid:5399a8d1-aee9-4653-bb7f-606df02b3696>
Number of entries in split-brain: 2           

可以通過以下指令檢視檔案的資料/中繼資料腦裂狀态

getfattr -n replica.split-brain-status <path-to-file>           

如果檔案位于資料/中繼資料腦裂中,則從用戶端執行的上述指令可提供一些資訊;還提供了要分析的資訊,以獲得有關該檔案的更多資訊。此指令不适用于gfid目錄腦裂。

file100

中繼資料腦裂。

# getfattr -n replica.split-brain-status file100
file: file100
replica.split-brain-status="data-split-brain:no    metadata-split-brain:yes    Choices:test-client-0,test-client-1"           

file1

資料腦裂。

# getfattr -n replica.split-brain-status file1
file: file1
replica.split-brain-status="data-split-brain:yes    metadata-split-brain:no    Choices:test-client-2,test-client-3"           

3)

file99

資料和中繼資料同時腦裂。

# getfattr -n replica.split-brain-status file99
file: file99
replica.split-brain-status="data-split-brain:yes    metadata-split-brain:yes    Choices:test-client-2,test-client-3"           

4)

dir

是目錄腦裂,但如前所述,上述指令不适用于這種腦裂。

# getfattr -n replica.split-brain-status dir
file: dir
replica.split-brain-status="The file is not under data or metadata split-brain"           

5)

file2

腦裂但不存在于任何卷中。

# getfattr -n replica.split-brain-status file2
file: file2
replica.split-brain-status="The file is not under data or metadata split-brain"           

分析資料和中繼資料腦裂的檔案

在用戶端對腦裂中的檔案執行操作(比如cat、getfatter等)會出現

input/output error

錯誤。為了能夠分析這些檔案,glusterfs提供了setfattr指令,可以在安裝glusterfs後直接使用。

# setfattr -n replica.split-brain-choice -v "choiceX" <path-to-file>           

使用這個指令,可以選擇一個特定的

brick

來通路腦裂的檔案。

1) “file1”腦裂。試圖從檔案中讀取會出現

input/output error

錯誤。

# cat file1
cat: file1: Input/output error           

file1

在test-client-2和test-client-3上發生腦裂。

将test-client-2設定為

file1

的split brain choice,可以從b2讀取檔案。

# setfattr -n replica.split-brain-choice -v test-client-2 file1           

對檔案執行讀取操作。

# cat file1
xyz           

同樣,要從其他用戶端檢視檔案,replica.split-brain-choice設定為test-client-3。

從錯誤的選擇中檢查檔案會出錯

要撤消已設定的腦裂選擇,可以将上述setfattr指令與

none

一起用作擴充屬性的值。

# setfattr -n replica.split-brain-choice -v none file1           

現在檢視檔案将再次出現

Input/output error

錯誤,如前所述。

# cat file
cat: file1: Input/output error           

一旦确定了使用的檔案,就應該設定brick以進行修複。使用以下指令完成此操作:

# setfattr -n replica.split-brain-heal-finalize -v <heal-choice> <path-to-file>           
# setfattr -n replica.split-brain-heal-finalize -v test-client-2 file1           

上述指令可用于修複所有檔案上的資料和中繼資料腦裂。

注意:

1) 如果禁用了

fopen keep cache

fuse挂載選項,則每次選擇新副本之前都需要使inode無效。

split-brain-choice

檢查檔案。可以使用如下指令:

# sefattr -n inode-invalidate -v 0 <path-to-file>           

2) 上面提到的從用戶端修複腦裂的過程将無法在nfs用戶端上運作,因為它不提供xattrs支援

2.3 自動修複腦裂

基于gluster指令行和用戶端的修複方法需要手動修複,手動運作指令。

cluster.favorite child policy

卷選項,當設定為可用的政策之一時,它将自動修複腦裂,而無需使用者幹預;預設值為

none

,即禁用。

# gluster volume set help | grep -A3 cluster.favorite-child-policy
Option: cluster.favorite-child-policy
Default Value: none
Description: This option can be used to automatically resolve split-brains using various policies without user intervention. "size" picks the file with the biggest size as the source. "ctime" and "mtime" pick the file with the latest ctime and mtime respectively as the source. "majority" picks a file with identical mtime and size in more than half the number of bricks in the replica.           

cluster.favorite child policy

适用于該卷的所有檔案。如果啟用了此選項,則不必在每個檔案腦裂時手動修複腦裂檔案,而将會根據設定的政策自動修複腦裂。

2.4 最佳實踐

1.擷取腦裂檔案的路徑:

可以通過以下方法獲得:

a)指令

gluster volume heal info split-brain

b)辨別從用戶端對其執行的檔案操作始終失敗并出現

Input/Output error

的檔案。

2.從用戶端關閉打開此檔案的應用程式。虛拟機需要關閉電源。

3.确定正确的副本:

通過使用getfattr指令擷取和驗證擴充屬性的變更記錄;然後通過擴充屬性來确定哪些brick包含可信的檔案

getfattr -d -m . -e hex <file-path-on-brick>           

有可能會出現一個brick包含正确的資料,而另一個brick也包含正确的中繼資料

  1. 使用setfattr指令在包含檔案資料/中繼資料的“不良副本”的brack上重置相關的擴充屬性。

5.在用戶端執行查找指令來觸發檔案的自我修複:

ls -l <file-path-on-gluster-mount>           

步驟3至5的詳細說明:

要了解如何解決腦裂,我們需要了解changelog擴充屬性。

getfattr -d -m . -e hex <file-path-on-brick>           
[root@store3 ~]# getfattr -d -e hex -m. brick-a/file.txt
\#file: brick-a/file.txt
security.selinux=0x726f6f743a6f626a6563745f723a66696c655f743a733000
trusted.afr.vol-client-2=0x000000000000000000000000
trusted.afr.vol-client-3=0x000000000200000000000000
trusted.gfid=0x307a5c9efddd4e7c96e94fd4bcdcbd1b           

trusted.afr.<volname>-client-<subvolume-index>

Afr使用擴充屬性來維護檔案的變更日志;這個值由glusterfs用戶端(fuse或nfs-server)程序計算;當glusterfs用戶端修改檔案或目錄時,用戶端聯系每個子產品,并根據子產品的響應更新changelog擴充屬性。

[root@pranithk-laptop ~]# gluster volume info vol
 Volume Name: vol
 Type: Distributed-Replicate
 Volume ID: 4f2d7849-fbd6-40a2-b346-d13420978a01
 Status: Created
 Number of Bricks: 4 x 2 = 8
 Transport-type: tcp
 Bricks:
 brick-a: pranithk-laptop:/gfs/brick-a
 brick-b: pranithk-laptop:/gfs/brick-b
 brick-c: pranithk-laptop:/gfs/brick-c
 brick-d: pranithk-laptop:/gfs/brick-d
 brick-e: pranithk-laptop:/gfs/brick-e
 brick-f: pranithk-laptop:/gfs/brick-f
 brick-g: pranithk-laptop:/gfs/brick-g
 brick-h: pranithk-laptop:/gfs/brick-h           

在上面的示例中:

Brick             |    Replica set        |    Brick subvolume index
----------------------------------------------------------------------------
-/gfs/brick-a     |       0               |       0
-/gfs/brick-b     |       0               |       1
-/gfs/brick-c     |       1               |       2
-/gfs/brick-d     |       1               |       3
-/gfs/brick-e     |       2               |       4
-/gfs/brick-f     |       2               |       5
-/gfs/brick-g     |       3               |       6
-/gfs/brick-h     |       3               |       7           

brick中的每個檔案都維護自己的變更日志,副本集中所有其他brick中存在的檔案的變更日志,如該brick所示。

在上面給出的示例卷中,brick-a中的所有檔案都有兩個條目,一個用于自身,另一個用于副本卷中的檔案,即brick-b:

trusted.afr.vol-client-0=0x000000000000000000000000-->自身的更改日志(brick-a)

brick-b的trusted.afr.vol-client-1=0x000000000000000000000000-->更改日志,如brick-a所示

同樣,brick-b中的所有檔案也将具有:

brick-a的trusted.afr.vol-client-0=0x000000000000000000000000-->更改日志,如brick-b所示

trusted.afr.vol-client-1=0x000000000000000000000000-->自身的更改日志(brick-b)

Changelog值解析

每個擴充屬性都有一個24位十六進制數字的值,前8位代表資料的變更日志,後8位代表變更日志

中繼資料的,最後8位數字表示目錄項的更改日志。

0x 000003d7 00000001 00000000
        |      |       |
        |      |        \_ changelog of directory entries
        |       \_ changelog of metadata
         \ _ changelog of data           

首8位字段記錄資料變更記錄

中間8位字段記錄中繼資料變更記錄

末8位字段記錄索引gfid變更記錄

當發生腦裂時,檔案的更改日志将如下所示:

示例:(兩份資料,中繼資料在同一個檔案上腦裂對比)
[root@pranithk-laptop vol]# getfattr -d -m . -e hex /gfs/brick-?/a
getfattr: Removing leading '/' from absolute path names
\#file: gfs/brick-a/a
trusted.afr.vol-client-0=0x000000000000000000000000
trusted.afr.vol-client-1=0x000003d70000000100000000
trusted.gfid=0x80acdbd886524f6fbefa21fc356fed57
\#file: gfs/brick-b/a
trusted.afr.vol-client-0=0x000003b00000000100000000
trusted.afr.vol-client-1=0x000000000000000000000000
trusted.gfid=0x80acdbd886524f6fbefa21fc356fed57           

結果解析

檔案/gfs/brick-a/a上的changelog擴充屬性:

trusted.afr.vol-client-0的前8位都是零(0x00000000……………)

trusted.afr.vol-client-1的前8位并非全為零(0x000003d7……………)

是以/gfs/brick-a/a上的changelog表示資料操作成功完成,但在/gfs/brick-b/a上失敗了。

trusted.afr.vol-client-0的後8位全為零(x……..00000000…….)

trusted.afr.vol-client-1不是全為零(x……..0000000 1……)

是以/gfs/brick-a/a上的changelog表示資料操作成功完成,但在/gfs/brick-b/a上失敗了。

檔案/gfs/brick-b/a上的changelog擴充屬性:

trusted.afr.vol-client-0的前8位并非全為零(0x000003b0……………)

trusted.afr.vol-client-1的前8位都為零(0x00000000……………)

是以/gfs/brick-b/a上的changelog表示資料操作成功完成,但在/gfs/brick-a/a上失敗了。

trusted.afr.vol-client-0的後8位不是全為零(x……..0000000 1…….)

trusted.afr.vol-client-1的後8位全為零(x……..00000000……)

由于兩個副本都具有資料,中繼資料更改并未在兩個副本同時生效,是以它既是資料腦裂又是中繼資料腦裂。

确定正确的副本

stat,getfatter

指令的輸出來決定要保留的中繼資料和要決定要保留哪些資料的檔案内容。

繼續上面的例子,假設我們想要保留/gfs/brick-a/a和/gfs/brick-b/a的中繼資料。

重置相關變更日志以解決腦裂:

解決資料腦裂:

更改檔案的changelog擴充屬性,某些資料在/gfs/brick-a/a上操作成功,但在/gfs/brick-b/a上操作失敗,是以/gfs/brick-b/a不應包含任何更改日志,重置在/gfs/brick-b/a的trusted.afr.vol-client-0上更改日志的資料部分。

解決中繼資料腦裂:

更改檔案的changelog擴充屬性,某些資料在/gfs/brick-b/a上操作成功,但在/gfs/brick-a/a上失敗,是以/gfs/brick-a/a不應包含任何更改日志,重置trusted.afr.vol-client-1更改日志的中繼資料部分。

完成上述操作後,更改日志将如下所示:

在 /gfs/brick-b/a檢視:

trusted.afr.vol-client-0

0x000003b00000000100000000 to 0x000000000000000100000000

中繼資料部分仍然不是全部為零,執行

setfattr-n trusted.afr.vol-client-0-v 0x00000000000000010000000/gfs/brick-b/a

在/gfs/brick-a/a檢視:

trusted.afr.vol-client-1

0x000003d70000000100000000 to 0x000003d70000000000000000

資料部分仍然不是全部為零,執行

setfattr-n trusted.afr.vol-client-1-v 0x000003d7000000000000000/gfs/brick-a/a

在完成上述操作之後,變更日志如下所示:

[root@pranithk-laptop vol]# getfattr -d -m . -e hex /gfs/brick-?/a
getfattr: Removing leading '/' from absolute path names
#file: gfs/brick-a/a
trusted.afr.vol-client-0=0x000000000000000000000000
trusted.afr.vol-client-1=0x000003d70000000000000000
trusted.gfid=0x80acdbd886524f6fbefa21fc356fed57

#file: gfs/brick-b/a
trusted.afr.vol-client-0=0x000000000000000100000000
trusted.afr.vol-client-1=0x000000000000000000000000
trusted.gfid=0x80acdbd886524f6fbefa21fc356fed57           

執行

ls -l <file-path-on-gluster-mount>

觸發自愈

修複目錄腦裂

當目錄上出現腦裂時,AFR可以保守地合并目錄中的不同條目。如果在一個brick上的目錄

storage

具有entry

1

2

而在另一個brick上具有entry

3

4

則AFR将合并目錄中的所有

1, 2, 3, 4

條目;以在同一目錄中具有條目。但是,如果由于目錄中檔案的删除而導緻腦裂的情況,則可能導緻重新顯示已删除的檔案。當至少有一個條目具有相同檔案名但

gfid

在該目錄中不同時,腦裂需要人工幹預。例:

brick-a

目錄上有2個條目,

file1

帶有

gfid_x

file2

。在

brick-b

目錄中有2項

file1

gfid_y

file3

。這裡的

file1

brick的gfid 有所不同。這類目錄腦裂需要人工幹預才能解決此問題。必須删除

file1

on

brick-a

file1

brick-b

才能解決裂腦問題。

此外,

gfid-link

必須删除相應的檔案。這些

gfid-link

檔案位于brick的頂級目錄中。如果檔案的gfid為

0x307a5c9efddd4e7c96e94fd4bcdcbd1b

getfattr

先前從指令接收到的trust.gfid 擴充屬性),則可以在找到gfid-link檔案

/gfs/brick-a/.glusterfs/30/7a/307a5c9efddd4e7c96e94fd4bcdcbd1b

注意事項

删除gfid-link之前,必須確定在該Brick上沒有指向該檔案的硬連結,如果存在硬連結,則也必須删除它們。

本文轉自

GlusterFS官方文檔