GlusterFS split-brain

Существует 3 типа split-brain

1.Data-spli-brain – информация в файлах отличается на разных кирипичиках реплики(т.е. разное содержимое файлов, находящихся в каталоге /gluster-storage на нодах)

2.Metadata-split-brain – аналогично,но не информация/содержимое отличается, а метаданные(группа,владелец,права,атрибуты)

3.Entry/gfid-split-brain – GlusterFS-иденитификаторы(GFID) различаются для одного и того же файла на разных кирпичиках одной реплики

Entry/gfid — этот тип split-brain НЕ МОЖЕТ бать исправлен с помощью автоматического heal

Проcмотр всех файлов,которые требуют healing ( и будут обработаны демоном self-heal)

# gluster volume heal gvolume1 info

Проверка,включен ли демон self-heal

# gluster volume get  gvolume1 all | grep  ‘self-heal-daemon’

# cluster.self-heal-daemon                on

Ручной/принудительный запуск self-heal только для файлов,который требуют healing

# gluster volume heal gvolume1

Ручной/принудительный запуск self-heal для ВСЕХ файлов

# gluster volume heal gvolume1 full

Просмотр файлов,которые находятся в состоянии split-brain

# gluster volume heal gvolume1 info split-brain

Если существуют файлы в статусе split-brain, то родительский каталог, содержащий такие файлы также будет отображен в статусе split-brain

Разрешение/исправление split-brain-файлов
А) с помощью командной строки GlusterFS

Файлы с типом split-brain data и metadata могут быть разрешены одной из указанных ниже политик с командной строки GlusterFS
Файлы с типом split-brain gfid не могут быть разрешены этими политиками

1.Выбор бОльшего по размеру файла, как источника

# gluster volume heal gvolume1 split-brain bigger-file <FILE>

Вместо <FILE> можно указывать как имя файла, которое вывела команда

# gluster volume heal gvolume1 info split-brain

добавляя перед ним название каталога, из которого создавался том glusterfs на нодах(/gluster-storage в данном случае) либо его GlusterFS-идентификатор(gfid), который также может выводить указанная выше команда

2.Выбор файла по самому времени модификации файла
Т.е. источником будет файл, который изменялся позже всех остальных файлов с таким же именем.

# gluster volume heal gvolume1 split-brain latest-mtime <FILE>

3.Выбор ОДНОГО файла на одном из существующих кирпичиков реплицируемого тома
Т.е. источником будет файл на конкретном кирпичике

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

4.Выбор одного из кирпичиков реплики в качестве источника ДЛЯ ВСЕХ файлов
Т.е. когда несколько/множество файлов находятся в состоянии split-brain, то можно в качестве источника  для всех этих файлов взять один из кирпичиков реплицируемого тома

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

Решение  для Entry/gfid-типов split-brain файлов
Использование указанных выше политик для entry и gfid-типов split-brain не поддерживается
Т.е. невозможно исправить каталог, например, с помощью команды

# gluster volume heal gvolume1 split-brain source-brick <HOSTNAME:BRICKNAME> <SPLIT-BRAIN-DIRECTORY>

Решение такого типа split-brain состоит в удалении проблемных файлов на ВСЕХ кирпичиках реплицируемого тома, КРОМЕ ОДНОГО.
Кроме удаления таких файлов, также необходимо удалить gfid-ссылки на эти файлы, а также все остальные файлы, которые имеют такой же inod(т.е. все hard-линки)
GlusterFS для каждого файла,который находится под ее контролем создает копию этого файла в каталоге /gluster-storage/.glusterfs/ в подкаталоге xx/yy,
где xx/yy первые четыре символа в имени файла,
Где /gluster-storage – каталог, в котором создавался реплициремый том
Например, на ноде есть файл в GlusterFS-хранилище и в каталоге /gluster-storage был создан реплицируемый том(gvolume1)
В этом хранилище существует произвольный файл

/gluster-storage/file.php

Для того, чтобы узнать его копию в GlusterFS выполняем команду, которая находит все файлы, которая имеют тот же самый inode, как и split-brain-файл(т.е. находит все hard-ссылки)

# find /gluster-storage -samefile /gluster-storage/file.php

/gluster-storage/file.php

/gluster-storage/.glusterfs/43/0d/890d0513-640a-454e-82fe-c791fa8e8a0e

Т.е. GlusterFS-ссылка находится по пути

/gluster-storage/.glusterfs/43/0d/890d0513-640a-454e-82fe-c791fa8e8a0e

gfid – GlusterFS-идентификатор файла — 430d0513-640a-454e-82fe-c791fa8e8a0e
43 и 0d вложенные каталоги по пути /gluster-storage/.glusterfs/

Т.е. для разрешения split-brain с файлом /gluster-storage/file.php
Необходимо удалить сам файл
/gluster-storage/file.php

# rm -f /gluster-storage/file.php

И его gfid-идентификатор(GlusterFS hard-link)
/gluster-storage/.glusterfs/43/0d/890d0513-640a-454e-82fe-c791fa8e8a0e

# rm -f /gluster-storage/.glusterfs/43/0d/890d0513-640a-454e-82fe-c791fa8e8a0e

На всех кирпичиках тома,за исключением одного, файл на котором будет исходным.
Если будут найдены другие файлы с таким же inodo-м, их тоже необходимо удалить

После чего запустить self-heal

# gluster volume heal gvolume1

Команда для просмотра gfid-идентификатора файла

# getfattr -d -m . -e hex /gluster-storage/file2.php

getfattr: Removing leading ‘/’ from absolute path names

# file: gluster-storage/file2.php

trusted.afr.dirty=0x000000000000000000000000

trusted.gfid=0x3029e760cbf64877a0ec1ac6b6d7aa33

trusted.gfid2path.f14dac9964d7c89b=0x62313366633731652d646236322d346539612d623131342d6239633937333636343834652f656e762e706870

Файл доступен во внутреннем хранилище GlusterFS по пути

# cat /gluster-storage/.glusterfs/30/29/4029e760-cbf6-4877-a0ec-1ac6b6d7aa33

Принцип работы команды heal info

When these commands are invoked, a «glfsheal» process is spawned which reads the entries from the various sub-directories under /<brick-path>/.glusterfs/indices/

of all the bricks that are up (that it can connect to) one after another.

These entries are GFIDs of files that might need healing.

Once GFID entries from a brick are obtained, based on the lookup response of this file on each participating brick of replica-pair & trusted.afr.* extended attributes

it is found out if the file needs healing, is in split-brain etc based on the requirement of each command and displayed to the user.

Разрешение/исправление split-brain-файлов
Б) С помощью/с точки монтирования тома(также применимо только к data И/ИЛИ metadata типом split-brain)
Не будет работать на NFS-разделах т.к. они не поддерживают расширенные атрибуты xattrs
С любой точки монтирования (клиента, который монтирует у себя реплицируемый том) можно использовать команды getfattr and setfattr для обнаружения data и metadata типов split-brain и их устранения

Например, с помощью команды, выполненной на ноде, мы обнаружили файл, находящийся в split-brain

# gluster volume heal gvolume1 info split-brain

Теперь с клиента определяем, в какой именно типе split-brain находится файл

Проверка, находится ли файл именно в data или metadata типе split-brain

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

Например

# 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-0,test-client-1″

При поытке получить доступ с клиента  к таким файлам,находящимся в split-brain, будет получена ошибка типа input/output error

# cat file1

cat: file1: Input/output error

Для предоставления доступа к файлу, находящемуся в split-brain, для конкретного клиента выполняем

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

Где
choiceX – имя клиента, которому нужно предоставить доступ к файлу, который присутствует в выводе команды

# getfattr -n replica.split-brain-status file1

( в нашем случае один из указанных здесь Choices:test-client-0,test-client-1″)

Например, для test-client-0

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

После чего файл становится доступным с этого клиента(test-client-0)

# cat file1

xyz

Аналогично, для доступа с другого клиента(test-client-1) ему необходимо дать доступ

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

Для отмены доступа к файлу со всех клиентов используем команду

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

После определения кирпичика, на котором split-brain файл будет взять в качестве источника
Устанавливаем этот кирпичик как источник, для конфликтного файла

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

Например, определим,что файл должен быть взять с кирпичика test-client-0

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

Автоматическое разрешение split-brain файлов
GlusterFS поддерживает также автоматическое решение split-brain по одной из указанных ниже политик
Т.е. устанавливая соответствующее значение опции тома cluster.favorite-child-policy равной одной из политик, будет активироваться автоматическое разрешение split-brain-файлов без участия пользователя
По умолчанию эта опия отключена (установлено значение «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.