Существует 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.