GlusterFS數(shù)據(jù)存儲腦裂修復方案最全解析

本文檔介紹了glusterfs中可用于監(jiān)視復制卷狀態(tài)的heal info命令以及解決腦裂的方法

一. 概念解析

常見術語

名稱 解釋
Brick GlusterFS 的基本存儲單元俏橘,由可信存儲池中服務器上對外輸出的目錄表示。存儲目錄的格式由服務器和目錄的絕對路徑構成 SERVER:EXPORT
Volume 一個卷朋贬,在邏輯上由N個bricks組成
Fuse Unix-like OS上的可動態(tài)加載的模塊铣揉,允許用戶不用修改內(nèi)核即可創(chuàng)建自己的文件系統(tǒng)
Glusterd Gluster management daemon,glusterfs 后臺進程蛾魄,運行在所有Glusterfs 節(jié)點上
CLI Command LineInterface 控制臺虑瀑,命令行界面
AFR Automatic FileReplication 自動文件復制
GFID glusterfs內(nèi)部文件標識符湿滓,是一個uuid,每個文件唯一
ReplicateVolume 副本卷
Client 客戶端舌狗,掛載服務端的存儲
Server 存儲節(jié)點服務器叽奥,存儲數(shù)據(jù)的位置

1.1 什么是腦裂

腦裂是指文件的兩個或多個復制副本內(nèi)容出現(xiàn)差異的情況。當文件處于腦裂狀態(tài)時痛侍,副本的brick之間文件的數(shù)據(jù)或元數(shù)據(jù)不一致朝氓,此時盡管所有brick都存在,卻沒有足夠的信息來權威地選擇一個原始副本并修復不良的副本主届。對于目錄赵哲,還存在一個條目腦裂,其中內(nèi)部的文件在副本的各個brick中具有不同的gfid文件類型君丁;當Gluster AFR無法確定復制集中哪個副本是正確時枫夺,此時將會產(chǎn)生腦裂。

1.2 腦裂類型

  • 數(shù)據(jù)腦裂:文件中的數(shù)據(jù)在副本集中的brick上不同;
  • 元數(shù)據(jù)腦裂:brick上的元數(shù)據(jù)不同;
  • 條目裂腦:當文件在每個副本對上具有不同的gfid時绘闷,會發(fā)生這種情況橡庞;此時是不能自動治愈的。

1.3 查看腦裂信息

gluster volume heal <VOLNAME> info

此命令將會列出所有需要修復的文件(并由self-heal守護進程處理)印蔗。執(zhí)行以后將會輸出文件路徑或者GFID扒最。

heal info命令原理概述

當調(diào)用此命令時,將生成一個glfsheal進程喻鳄,該進程將讀取/<brick-path>/.glusterfs/indices/下的各個子目錄中(它可以連接到的)所有brick條目;這些條目是需要修復文件的gfid;一旦從一個brick中獲得GFID條目扼倘,就根據(jù)該文件在副本集和trusted.afr.*擴展屬性的每個brick上進行查找,確定文件是否需要修復除呵,是否處于腦裂或其他狀態(tài)再菊。

命令輸出示例

[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

數(shù)據(jù)或元數(shù)據(jù)腦裂的文件將在其路徑/GFID后面附加ls in split-brain颜曾,例如纠拔,對/file4文件的輸出;但是泛豪,對于GFID腦裂中的文件稠诲,文件的父目錄顯示為腦裂,文件本身顯示為需要修復诡曙,例如臀叙,上面的/dir為文件/dir/a的GFID腦裂。腦裂中的文件如果不解決腦裂問題就無法自愈价卤。

2) Is possibly undergoing heal

運行heal info命令時劝萤,將會鎖定存儲中的每個文件,以查找是否需要修復慎璧。但是床嫌,如果自我修復守護程序已經(jīng)開始修復文件跨释,則它將不會被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的文件需要修復
2)aaca219f-0e25-4576-8689-3bfd93ca70c2疙驾,
39f301ae-4038-48c2-a889-7dac143e82ddc3c94de2-232d-4083-b534-5da17fc476ac 處于腦裂狀態(tài)

brick b2凶伙,有六項需要修復:

1)afile2file3需要修復
2)file1它碎、file4/dir處于腦裂狀態(tài)

二. 修復腦裂

命令語句

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)

他們的父目錄處于腦裂中狀態(tài)扳肛。

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

一旦確定了腦裂中的文件喜鼓,就可以使用多種策略從gluster命令行完成其修復茫虽。此方法不支持Entry/GFID腦裂修復;可以使用以下策略來修復數(shù)據(jù)和元數(shù)據(jù)腦裂:

2.1.1 選擇較大的文件作為源文件

此命令對于已知/確定要將較大的文件視為源文件的文件修復非常有用。

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

在這里谜慌,<FILE>可以是從卷的根目錄中看到的完整文件名(也可以是文件的GFID字符串),一旦執(zhí)行此命令测蹲,將會使用最大的<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校驗和和文件大小贞铣。

修復前

在brick b1:

[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

在brick b2:

[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作為所有文件的源

場景:許多文件都處于腦裂狀態(tài),使用一個brick作為源

命令語句

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

上述命令的結果是沮明,選擇<HOSTNAME:BRICKNAME>中的所有腦裂文件作為源文件并將其修復到集群中辕坝。

示例:

一個卷中有三個文件a,b和c發(fā)生腦裂珊擂。

# 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 從客戶端修復腦裂

使用getfattrsetfattr命令吁峻,檢測文件的數(shù)據(jù)和元數(shù)據(jù)腦裂狀態(tài)滑负,并從客戶端修復腦裂。

使用具有brick b0用含,b1矮慕,b2和b3test卷進行測試。

# 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

查看處于腦裂狀態(tài)的文件

# 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

可以通過以下命令查看文件的數(shù)據(jù)/元數(shù)據(jù)腦裂狀態(tài)

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

如果文件位于數(shù)據(jù)/元數(shù)據(jù)腦裂中啄骇,則從客戶端執(zhí)行的上述命令可提供一些信息痴鳄;還提供了要分析的信息,以獲得有關該文件的更多信息缸夹。此命令不適用于gfid目錄腦裂痪寻。

示例:

1) file100元數(shù)據(jù)腦裂。

# 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"

2) file1數(shù)據(jù)腦裂虽惭。

# 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數(shù)據(jù)和元數(shù)據(jù)同時腦裂橡类。

# 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"

分析數(shù)據(jù)和元數(shù)據(jù)腦裂的文件

在客戶端對腦裂中的文件執(zhí)行操作(比如cat匆笤、getfatter等)會出現(xiàn)input/output error錯誤研侣。為了能夠分析這些文件,glusterfs提供了setfattr命令疚膊,可以在安裝glusterfs后直接使用义辕。

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

使用這個命令,可以選擇一個特定的brick來訪問腦裂的文件寓盗。

示例:

1) “file1”腦裂灌砖。試圖從文件中讀取會出現(xiàn)input/output error錯誤。

# cat file1
cat: file1: Input/output error

file1在test-client-2和test-client-3上發(fā)生腦裂傀蚌。

將test-client-2設置為file1的split brain choice基显,可以從b2讀取文件。

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

對文件執(zhí)行讀取操作善炫。

# cat file1
xyz

同樣撩幽,要從其他客戶端查看文件,replica.split-brain-choice設置為test-client-3。

從錯誤的選擇中檢查文件會出錯

要撤消已設置的腦裂選擇窜醉,可以將上述setfattr命令與none一起用作擴展屬性的值宪萄。

示例:

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

現(xiàn)在查看文件將再次出現(xiàn)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

上述命令可用于修復所有文件上的數(shù)據(jù)和元數(shù)據(jù)腦裂琅催。

注意:

1) 如果禁用了fopen keep cachefuse掛載選項居凶,則每次選擇新副本之前都需要使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適用于該卷的所有文件湿弦。如果啟用了此選項瓤漏,則不必在每個文件腦裂時手動修復腦裂文件,而將會根據(jù)設置的策略自動修復腦裂颊埃。

2.4 最佳實踐

1.獲取腦裂文件的路徑:

可以通過以下方法獲得:

a)命令gluster volume heal info split-brain蔬充。
b)標識從客戶端對其執(zhí)行的文件操作始終失敗并出現(xiàn)Input/Output error的文件。

2.從客戶端關閉打開此文件的應用程序班利。虛擬機需要關閉電源饥漫。

3.確定正確的副本:

通過使用getfattr命令獲取和驗證擴展屬性的變更記錄;然后通過擴展屬性來確定哪些brick包含可信的文件

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

有可能會出現(xiàn)一個brick包含正確的數(shù)據(jù)罗标,而另一個brick也包含正確的元數(shù)據(jù)

  1. 使用setfattr命令在包含文件數(shù)據(jù)/元數(shù)據(jù)的“不良副本”的brack上重置相關的擴展屬性庸队。

5.在客戶端執(zhí)行查找命令來觸發(fā)文件的自我修復:

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客戶端修改文件或目錄時宙拉,客戶端聯(lián)系每個模塊宾尚,并根據(jù)模塊的響應更新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位十六進制數(shù)字的值瑞你,前8位代表數(shù)據(jù)的變更日志酪惭,后8位代表變更日志
元數(shù)據(jù)的,最后8位數(shù)字表示目錄項的更改日志者甲。

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

首8位字段記錄數(shù)據(jù)變更記錄
中間8位字段記錄元數(shù)據(jù)變更記錄
末8位字段記錄索引gfid變更記錄

當發(fā)生腦裂時春感,文件的更改日志將如下所示:

示例:(兩份數(shù)據(jù),元數(shù)據(jù)在同一個文件上腦裂對比)

[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表示數(shù)據(jù)操作成功完成,但在/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表示數(shù)據(jù)操作成功完成,但在/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表示數(shù)據(jù)操作成功完成,但在/gfs/brick-a/a上失敗了。

trusted.afr.vol-client-0的后8位不是全為零(x……..0000000 1…….)
trusted.afr.vol-client-1的后8位全為零(x……..00000000……)
所以/gfs/brick-b/a上的changelog表示數(shù)據(jù)操作成功完成,但在/gfs/brick-a/a上失敗了刽辙。

由于兩個副本都具有數(shù)據(jù)窥岩,元數(shù)據(jù)更改并未在兩個副本同時生效,因此它既是數(shù)據(jù)腦裂又是元數(shù)據(jù)腦裂宰缤。

確定正確的副本

使用stat颂翼,getfatter命令的輸出來決定要保留的元數(shù)據(jù)和要決定要保留哪些數(shù)據(jù)的文件內(nèi)容。

繼續(xù)上面的例子慨灭,假設我們想要保留/gfs/brick-a/a和/gfs/brick-b/a的元數(shù)據(jù)朦乏。

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

解決數(shù)據(jù)腦裂:

更改文件的changelog擴展屬性,某些數(shù)據(jù)在/gfs/brick-a/a上操作成功氧骤,但在/gfs/brick-b/a上操作失敗呻疹,所以/gfs/brick-b/a不應包含任何更改日志,重置在/gfs/brick-b/a的trusted.afr.vol-client-0上更改日志的數(shù)據(jù)部分筹陵。

解決元數(shù)據(jù)腦裂:

更改文件的changelog擴展屬性刽锤,某些數(shù)據(jù)在/gfs/brick-b/a上操作成功,但在/gfs/brick-a/a上失敗惶翻,所以/gfs/brick-a/a不應包含任何更改日志姑蓝,重置trusted.afr.vol-client-1更改日志的元數(shù)據(jù)部分。

完成上述操作后吕粗,更改日志將如下所示:

在 /gfs/brick-b/a查看:
trusted.afr.vol-client-0
0x000003b00000000100000000 to 0x000000000000000100000000

元數(shù)據(jù)部分仍然不是全部為零纺荧,執(zhí)行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

數(shù)據(jù)部分仍然不是全部為零,執(zhí)行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

執(zhí)行ls -l <file-path-on-gluster-mount>觸發(fā)自愈

修復目錄腦裂

當目錄上出現(xiàn)腦裂時宙暇,AFR可以保守地合并目錄中的不同條目输枯。如果在一個brick上的目錄 storage 具有entry 12 而在另一個brick上具有entry 3 占贫, 4 則AFR將合并目錄中的所有 1, 2, 3, 4 條目桃熄;以在同一目錄中具有條目。但是型奥,如果由于目錄中文件的刪除而導致腦裂的情況瞳收,則可能導致重新顯示已刪除的文件。當至少有一個條目具有相同文件名但 gfid 在該目錄中不同時厢汹,腦裂需要人工干預螟深。例:

brick-a 目錄上有2個條目, file1 帶有 gfid_xfile2 烫葬。在 brick-b 目錄中有2項 file1gfid_yfile3 界弧。這里的 file1 brick的gfid 有所不同。這類目錄腦裂需要人工干預才能解決此問題搭综。必須刪除 file1 on brick-afile1 on brick-b 才能解決裂腦問題垢箕。

此外, gfid-link 必須刪除相應的文件兑巾。這些 gfid-link 文件位于brick的頂級目錄中条获。如果文件的gfid為 0x307a5c9efddd4e7c96e94fd4bcdcbd1bgetfattr 先前從命令接收到的trust.gfid 擴展屬性),則可以在找到gfid-link文件 /gfs/brick-a/.glusterfs/30/7a/307a5c9efddd4e7c96e94fd4bcdcbd1b 闪朱。

注意事項

刪除gfid-link之前月匣,必須確保在該Brick上沒有指向該文件的硬鏈接,如果存在硬鏈接奋姿,則也必須刪除它們。

本文轉自GlusterFS官方文檔

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末素标,一起剝皮案震驚了整個濱河市称诗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌头遭,老刑警劉巖寓免,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異计维,居然都是意外死亡袜香,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門鲫惶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜈首,“玉大人,你說我怎么就攤上這事』恫撸” “怎么了吆寨?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長踩寇。 經(jīng)常有香客問我啄清,道長,這世上最難降的妖魔是什么俺孙? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任辣卒,我火速辦了婚禮,結果婚禮上睛榄,老公的妹妹穿的比我還像新娘荣茫。我一直安慰自己,他們只是感情好懈费,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布计露。 她就那樣靜靜地躺著,像睡著了一般憎乙。 火紅的嫁衣襯著肌膚如雪票罐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天泞边,我揣著相機與錄音该押,去河邊找鬼。 笑死阵谚,一個胖子當著我的面吹牛蚕礼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梢什,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼奠蹬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嗡午?” 一聲冷哼從身側響起囤躁,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荔睹,沒想到半個月后狸演,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡僻他,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年宵距,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吨拗。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡满哪,死狀恐怖婿斥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翩瓜,我是刑警寧澤受扳,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站兔跌,受9級特大地震影響勘高,放射性物質發(fā)生泄漏。R本人自食惡果不足惜坟桅,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一华望、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仅乓,春花似錦赖舟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豫喧,卻和暖如春石洗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背紧显。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工讲衫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孵班。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓涉兽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親篙程。 傳聞我的和親對象是個殘疾皇子枷畏,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容