searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享

glusterfs split-brain 脑裂解决方法

2023-05-25 07:27:32
349
0

# 脑裂类型

当 Gluster AFR 无法判断哪一个副本是正确的,这种情况就叫做脑裂。
有 3 种脑裂类型:

- 数据脑裂:文件中的数据在各个砖块上不一样
- 元数据脑裂:元数据在各个砖块上不一样
- 条目脑裂:文件的 GFID 或文件类型在各个砖块上不一样,GFID 和文件类型的修复方式也不一样,注意区分

# gluster volume heal info 命令

命令用法

```
gluster volume heal <VOLNAME> info
```

使用上面的命令会列出所有需要恢复以及将被自愈程序恢复的文件,打印它们的文件路径或 GFID。
文件列表可能会带上以下的 tag:

1. 'Is in split-brain'
   数据脑裂和元数据脑裂的文件会在文件路径或者 GFID 后面带上" - Is in split-brain"。GFID 条目脑裂则会同时显示文件的父目录路径。带有该 tag 的情况下需要手动处理,否则不会被恢复。
2. 'Is possibly undergoing heal'
   当 heal info 命令执行的时候,每个文件都会被上锁。如果自愈程序已经在恢复文件的过程中则会显示此 tag。同时执行了多次 heal 命令也可能导致这个情况。

## 命令输出示例

假设有一个复制卷名为 test,由 b1、b2 两个砖块组成,自愈程序已停止,挂载在/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

```

# gluster volume heal info split-brain 命令

命令用法

```
gluster volume heal <VOLNAME> info split-brain
```

这个命令的输出结果是 gluster volume heal <VOLNAME> info 的子集,只显示脑裂的文件列表。

## 命令输出示例

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

# 通过 gluster 命令行修复脑裂

## 修复数据/元数据脑裂

### 以较大的文件为源

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

FILE 可以是从卷的根目录看到的完整文件路径或 GFID ,会显示在 heal info 命令的输出中。执行此命令后,将找到包含文件大小更大的副本,并使用该砖作为源完成修复。

### 以较新的 mtime 为源

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

### 指定某一个砖块为源

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

### 指定某一个砖块为源修复所有脑裂文件

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

## 修复 GFID 脑裂

修复 GFID 脑裂的命令和修复数据/元数据脑裂的命令相同,但有以下不同点:

- FILE 参数只能是文件路径,不能是 GFID。
- GFID 修复必须指定文件路径,指定 source-brick 时 FILE 参数不能为空。
- 对于分布式复制卷,使用 source-brick 修复 GFID 时,需要在所有 sub-volume 执行修复操作。

# 修复文件类型脑裂

文件类型脑裂无法通过 gluster 命令行修复,除了砖块中那个需要保留的文件以外,手动删除其余砖块上对应的文件。

# 通过挂载修复脑裂

假设有一个复制卷名为 test,由 b0-b4 四个砖块组成

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

目录结构如下

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

"file100" 元数据脑裂,"file1" 数据脑裂,"file99" 既有数据脑裂也有元数据脑裂,"dir" "file2" 目录也脑裂了但不属于数据/元数据脑裂。

```
# 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"
# 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"
# 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"
# getfattr -n replica.split-brain-status dir
file: dir
replica.split-brain-status="The file is not under data or metadata split-brain"
# getfattr -n replica.split-brain-status file2
file: file2
replica.split-brain-status="The file is not under data or metadata split-brain"
```

此时通过挂载点访问文件,会报错 "Input/output error"。"file1" 的提供的脑裂选项有test-client-2 和 test-client-3,设置 test-client-2 以通过 b2 访问 file1。

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

此时再次访问 file1 即恢复正常

```
# cat file1
xyz
```

类似的,脑裂选项设置为 test-client-3 可查看 b3 上的内容,由此可判断哪个文件是需要恢复的。
还原脑裂选项可以执行以下命令,还原后访问 file1 仍会报错 "Input/output error"。

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

执行以下命令选择脑裂选项进行恢复

```
# setfattr -n replica.split-brain-heal-finalize -v test-client-2 file1
```

注:如果挂载时加了 "fopen-keep-cache" 参数,每次选择 split-brain-choice 之前都需要运行以下命令

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

# 自动修复脑裂问题

上面的方法是管理员手动操作,设置 cluster.favorite-child-policy 参数可以指定修复策略进行自动修复,对 volume 中所有文件生效,默认值是 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.
```

> 参考文献:https://docs.gluster.org/en/latest/Troubleshooting/resolving-splitbrain/

0条评论
0 / 1000
血小板
10文章数
0粉丝数
血小板
10 文章 | 0 粉丝
血小板
10文章数
0粉丝数
血小板
10 文章 | 0 粉丝

glusterfs split-brain 脑裂解决方法

2023-05-25 07:27:32
349
0

# 脑裂类型

当 Gluster AFR 无法判断哪一个副本是正确的,这种情况就叫做脑裂。
有 3 种脑裂类型:

- 数据脑裂:文件中的数据在各个砖块上不一样
- 元数据脑裂:元数据在各个砖块上不一样
- 条目脑裂:文件的 GFID 或文件类型在各个砖块上不一样,GFID 和文件类型的修复方式也不一样,注意区分

# gluster volume heal info 命令

命令用法

```
gluster volume heal <VOLNAME> info
```

使用上面的命令会列出所有需要恢复以及将被自愈程序恢复的文件,打印它们的文件路径或 GFID。
文件列表可能会带上以下的 tag:

1. 'Is in split-brain'
   数据脑裂和元数据脑裂的文件会在文件路径或者 GFID 后面带上" - Is in split-brain"。GFID 条目脑裂则会同时显示文件的父目录路径。带有该 tag 的情况下需要手动处理,否则不会被恢复。
2. 'Is possibly undergoing heal'
   当 heal info 命令执行的时候,每个文件都会被上锁。如果自愈程序已经在恢复文件的过程中则会显示此 tag。同时执行了多次 heal 命令也可能导致这个情况。

## 命令输出示例

假设有一个复制卷名为 test,由 b1、b2 两个砖块组成,自愈程序已停止,挂载在/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

```

# gluster volume heal info split-brain 命令

命令用法

```
gluster volume heal <VOLNAME> info split-brain
```

这个命令的输出结果是 gluster volume heal <VOLNAME> info 的子集,只显示脑裂的文件列表。

## 命令输出示例

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

# 通过 gluster 命令行修复脑裂

## 修复数据/元数据脑裂

### 以较大的文件为源

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

FILE 可以是从卷的根目录看到的完整文件路径或 GFID ,会显示在 heal info 命令的输出中。执行此命令后,将找到包含文件大小更大的副本,并使用该砖作为源完成修复。

### 以较新的 mtime 为源

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

### 指定某一个砖块为源

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

### 指定某一个砖块为源修复所有脑裂文件

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

## 修复 GFID 脑裂

修复 GFID 脑裂的命令和修复数据/元数据脑裂的命令相同,但有以下不同点:

- FILE 参数只能是文件路径,不能是 GFID。
- GFID 修复必须指定文件路径,指定 source-brick 时 FILE 参数不能为空。
- 对于分布式复制卷,使用 source-brick 修复 GFID 时,需要在所有 sub-volume 执行修复操作。

# 修复文件类型脑裂

文件类型脑裂无法通过 gluster 命令行修复,除了砖块中那个需要保留的文件以外,手动删除其余砖块上对应的文件。

# 通过挂载修复脑裂

假设有一个复制卷名为 test,由 b0-b4 四个砖块组成

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

目录结构如下

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

"file100" 元数据脑裂,"file1" 数据脑裂,"file99" 既有数据脑裂也有元数据脑裂,"dir" "file2" 目录也脑裂了但不属于数据/元数据脑裂。

```
# 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"
# 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"
# 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"
# getfattr -n replica.split-brain-status dir
file: dir
replica.split-brain-status="The file is not under data or metadata split-brain"
# getfattr -n replica.split-brain-status file2
file: file2
replica.split-brain-status="The file is not under data or metadata split-brain"
```

此时通过挂载点访问文件,会报错 "Input/output error"。"file1" 的提供的脑裂选项有test-client-2 和 test-client-3,设置 test-client-2 以通过 b2 访问 file1。

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

此时再次访问 file1 即恢复正常

```
# cat file1
xyz
```

类似的,脑裂选项设置为 test-client-3 可查看 b3 上的内容,由此可判断哪个文件是需要恢复的。
还原脑裂选项可以执行以下命令,还原后访问 file1 仍会报错 "Input/output error"。

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

执行以下命令选择脑裂选项进行恢复

```
# setfattr -n replica.split-brain-heal-finalize -v test-client-2 file1
```

注:如果挂载时加了 "fopen-keep-cache" 参数,每次选择 split-brain-choice 之前都需要运行以下命令

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

# 自动修复脑裂问题

上面的方法是管理员手动操作,设置 cluster.favorite-child-policy 参数可以指定修复策略进行自动修复,对 volume 中所有文件生效,默认值是 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.
```

> 参考文献:https://docs.gluster.org/en/latest/Troubleshooting/resolving-splitbrain/

文章来自个人专栏
Gluster
10 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
1
1