Развертывание параллельной файловой системы GlusterFS в высокодоступном режиме
GlusterFS
При помощи этого руководства вы сможете создать инфраструктуру из трех сегментов, имеющих общую файловую систему GlusterFS. Размещение дисков для хранения данных в трех разных зонах доступности обеспечит высокую доступность и отказоустойчивость файловой системы.
Чтобы настроить высокодоступную файловую систему:
- Подготовьте облако к работе.
- Настройте профиль CLI.
- Подготовьте среду для развертывания ресурсов.
- Разверните ресурсы.
- Установите и настройте GlusterFS.
- Протестируйте доступность и отказоустойчивость решения.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за постоянно работающие ВМ и диски (см. тарифы Yandex Compute Cloud);
- плата за использование публичных IP-адресов и исходящий трафик (см. тарифы Yandex Virtual Private Cloud);
Настройте профиль CLI
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите его и авторизуйтесь от имени пользователя.
-
Создайте сервисный аккаунт:
Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором хотите создать сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта, например,
sa-glusterfs
. - Нажмите кнопку Создать.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.Выполните команду для создания сервисного аккаунта, указав имя
sa-glusterfs
:yc iam service-account create --name sa-glusterfs
Где
name
— имя сервисного аккаунта.Результат:
id: ajehr0to1g8b******** folder_id: b1gv87ssvu49******** created_at: "2023-06-20T09:03:11.665153755Z" name: sa-glusterfs
Чтобы создать сервисный аккаунт, воспользуйтесь вызовом gRPC API ServiceAccountService/Create или методом create для ресурса
ServiceAccount
REST API. - В консоли управления
-
Назначьте сервисному аккаунту роль администратора на каталог:
Консоль управленияCLIAPI- На стартовой странице
консоли управления выберите каталог. - Перейдите на вкладку Права доступа.
- Найдите аккаунт
sa-glusterfs
в списке и нажмите значок . - Нажмите кнопку Изменить роли.
- В открывшемся диалоге нажмите кнопку Добавить роль и выберите роль
admin
.
Выполните команду:
yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role admin \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
Чтобы назначить сервисному аккаунту роль на каталог, воспользуйтесь методом REST API setAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/SetAccessBindings.
- На стартовой странице
-
Настройте профиль CLI для выполнения операций от имени сервисного аккаунта:
CLI-
Создайте авторизованный ключ для сервисного аккаунта и запишите его в файл:
yc iam key create \ --service-account-id <идентификатор_сервисного_аккаунта> \ --folder-id <id_каталога_с_сервисным_аккаунтом> \ --output key.json
Где:
service-account-id
— идентификатор сервисного аккаунта.folder-id
— идентификатор каталога, в котором создан сервисный аккаунт.output
— имя файла с авторизованным ключом.
Результат:
id: aje8nn871qo4******** service_account_id: ajehr0to1g8b******** created_at: "2023-06-20T09:16:43.479156798Z" key_algorithm: RSA_2048
-
Создайте профиль CLI для выполнения операций от имени сервисного аккаунта:
yc config profile create sa-glusterfs
Результат:
Profile 'sa-glusterfs' created and activated
-
Задайте конфигурацию профиля:
yc config set service-account-key key.json yc config set cloud-id <идентификатор_облака> yc config set folder-id <идентификатор_каталога>
Где:
service-account-key
— файл с авторизованным ключом сервисного аккаунта.cloud-id
— идентификатор облака.folder-id
— идентификатор каталога.
-
Добавьте аутентификационные данные в переменные окружения:
export YC_TOKEN=$(yc iam create-token) export YC_CLOUD_ID=$(yc config get cloud-id) export YC_FOLDER_ID=$(yc config get folder-id)
-
Подготовьте среду для развертывания ресурсов
-
Создайте пару ключей SSH:
ssh-keygen -t ed25519
Рекомендуем оставить имя файла ключа без изменения.
-
Клонируйте репозиторий
yandex-cloud-examples/yc-distributed-ha-storage-with-glusterfs
из GitHub и перейдите в папкуyc-distributed-ha-storage-with-glusterfs
:git clone https://github.com/yandex-cloud-examples/yc-distributed-ha-storage-with-glusterfs.git cd ./yc-distributed-ha-storage-with-glusterfs
-
Отредактируйте файл
variables.tf
, указав параметры разворачиваемых ресурсов:Важно
Заданные в файле значения приводят к разворачиванию ресурсоемкой инфраструктуры.
Чтобы развернуть ресурсы в рамках имеющихся у вас квот, используйте приведенные ниже значения или измените значения на свое усмотрение.- В секции
disk_size
значениеdefault
измените на30
. - В секции
client_cpu_count
значениеdefault
измените на2
. - В секции
storage_cpu_count
значениеdefault
измените на2
. - Если при создании пары ключей SSH вы указали имя, отличное от имени по умолчанию, в секции
local_pubkey_path
значениеdefault
измените на<путь_к_публичному_ключу_SSH>
.
- В секции
Разверните ресурсы
- Выполните инициализацию Terraform:
terraform init
- Проверьте конфигурацию Terraform файлов:
terraform validate
- Проверьте список создаваемых облачных ресурсов:
terraform plan
- Создайте ресурсы:
terraform apply -auto-approve
- Дождитесь появления сообщения о завершении процесса:
Outputs: connect_line = "ssh storage@158.160.108.137" public_ip = "158.160.108.137"
В результате в каталоге будут созданы три ВМ для размещения клиентского кода (client01
, client02
и client03
) и три привязанные к ним ВМ для распределенного хранения данных (gluster01
, gluster02
и gluster03
) в трех разных зонах доступности.
Установите и настройте GlusterFS
-
Подключитесь к ВМ
client01
, используя команду из выдачи о завершении процесса:ssh storage@158.160.108.137
-
Перейдите в режим работы с правами суперпользователя
root
:sudo -i
-
Установите ClusterShell
:dnf install epel-release -y dnf install clustershell -y echo 'ssh_options: -oStrictHostKeyChecking=no' >> /etc/clustershell/clush.conf
-
Создайте конфигурационные файлы:
cat > /etc/clustershell/groups.conf <<EOF [Main] default: cluster confdir: /etc/clustershell/groups.conf.d $CFGDIR/groups.conf.d autodir: /etc/clustershell/groups.d $CFGDIR/groups.d EOF cat > /etc/clustershell/groups.d/cluster.yaml <<EOF cluster: all: '@clients,@gluster' clients: 'client[01-03]' gluster: 'gluster[01-03]' EOF
-
Установите GlusterFS:
clush -w @all hostname # check and auto add fingerprints clush -w @all dnf install centos-release-gluster -y clush -w @all dnf --enablerepo=powertools install glusterfs-server -y clush -w @gluster mkfs.xfs -f -i size=512 /dev/vdb clush -w @gluster mkdir -p /bricks/brick1 clush -w @gluster "echo '/dev/vdb /bricks/brick1 xfs defaults 1 2' >> /etc/fstab" clush -w @gluster "mount -a && mount"
-
Перезапустите GlusterFS:
clush -w @gluster systemctl enable glusterd clush -w @gluster systemctl restart glusterd
-
Проверьте доступность ВМ
gluster02
иgluster03
:clush -w gluster01 gluster peer probe gluster02 clush -w gluster01 gluster peer probe gluster03
-
Создайте папки
vol0
в ВМ для хранения данных и настройте доступность и отказоустойчивость за счет подключения к папке общего доступаregional-volume
:clush -w @gluster mkdir -p /bricks/brick1/vol0 clush -w gluster01 gluster volume create regional-volume disperse 3 redundancy 1 gluster01:/bricks/brick1/vol0 gluster02:/bricks/brick1/vol0 gluster03:/bricks/brick1/vol0
-
Выполните дополнительные настройки производительности:
clush -w gluster01 gluster volume set regional-volume client.event-threads 8 clush -w gluster01 gluster volume set regional-volume server.event-threads 8 clush -w gluster01 gluster volume set regional-volume cluster.shd-max-threads 8 clush -w gluster01 gluster volume set regional-volume performance.read-ahead-page-count 16 clush -w gluster01 gluster volume set regional-volume performance.client-io-threads on clush -w gluster01 gluster volume set regional-volume performance.quick-read off clush -w gluster01 gluster volume set regional-volume performance.parallel-readdir on clush -w gluster01 gluster volume set regional-volume performance.io-thread-count 32 clush -w gluster01 gluster volume set regional-volume performance.cache-size 1GB clush -w gluster01 gluster volume set regional-volume server.allow-insecure on
-
Смонтируйте папку общего доступа
regional-volume
на клиентских ВМ:clush -w gluster01 gluster volume start regional-volume clush -w @clients mount -t glusterfs gluster01:/regional-volume /mnt/
Протестируйте доступность и отказоустойчивость решения
-
Проверьте статус папки общего доступа
regional-volume
:clush -w gluster01 gluster volume status
Результат:
gluster01: Status of volume: regional-volume gluster01: Gluster process TCP Port RDMA Port Online Pid gluster01: ------------------------------------------------------------------------------ gluster01: Brick gluster01:/bricks/brick1/vol0 54660 0 Y 1374 gluster01: Brick gluster02:/bricks/brick1/vol0 58127 0 Y 7716 gluster01: Brick gluster03:/bricks/brick1/vol0 53346 0 Y 7733 gluster01: Self-heal Daemon on localhost N/A N/A Y 1396 gluster01: Self-heal Daemon on gluster02 N/A N/A Y 7738 gluster01: Self-heal Daemon on gluster03 N/A N/A Y 7755 gluster01: gluster01: Task Status of Volume regional-volume gluster01: ------------------------------------------------------------------------------ gluster01: There are no active volume tasks gluster01:
-
Создайте текстовый файл:
cat > /mnt/test.txt <<EOF Hello, GlusterFS! EOF
-
Убедитесь, что файл доступен на всех трех клиентских ВМ:
clush -w @clients sha256sum /mnt/test.txt
Результат:
client01: 5fd9c031531c39f2568a8af5512803fad053baf3fe9eef2a03ed2a6f0a884c85 /mnt/test.txt client02: 5fd9c031531c39f2568a8af5512803fad053baf3fe9eef2a03ed2a6f0a884c85 /mnt/test.txt client03: 5fd9c031531c39f2568a8af5512803fad053baf3fe9eef2a03ed2a6f0a884c85 /mnt/test.txt
-
Отключите одну из ВМ для хранения данных, например,
gluster02
:Консоль управленияCLIAPI- В консоли управления
выберите каталог, которому принадлежит ВМ. - Выберите сервис Compute Cloud.
- Выберите ВМ
gluster02
в списке, нажмите значок и выберите Остановить. - В открывшемся окне нажмите кнопку Остановить.
-
Посмотрите описание команды CLI для остановки ВМ:
yc compute instance stop --help
-
Остановите ВМ:
yc compute instance stop gluster02
Воспользуйтесь методом REST API stop для ресурса Instance или вызовом gRPC API InstanceService/Stop.
- В консоли управления
-
Убедитесь, что ВМ отключена:
clush -w gluster01 gluster volume status
Результат:
gluster01: Status of volume: regional-volume gluster01: Gluster process TCP Port RDMA Port Online Pid gluster01: ------------------------------------------------------------------------------ gluster01: Brick gluster01:/bricks/brick1/vol0 54660 0 Y 1374 gluster01: Brick gluster03:/bricks/brick1/vol0 53346 0 Y 7733 gluster01: Self-heal Daemon on localhost N/A N/A Y 1396 gluster01: Self-heal Daemon on gluster03 N/A N/A Y 7755 gluster01: gluster01: Task Status of Volume regional-volume gluster01: ------------------------------------------------------------------------------ gluster01: There are no active volume tasks gluster01:
-
Убедитесь, что файл по-прежнему доступен на всех трех клиентских ВМ:
clush -w @clients sha256sum /mnt/test.txt
Результат:
client01: 5fd9c031531c39f2568a8af5512803fad053baf3fe9eef2a03ed2a6f0a884c85 /mnt/test.txt client02: 5fd9c031531c39f2568a8af5512803fad053baf3fe9eef2a03ed2a6f0a884c85 /mnt/test.txt client03: 5fd9c031531c39f2568a8af5512803fad053baf3fe9eef2a03ed2a6f0a884c85 /mnt/test.txt
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы, удалите их:
terraform destroy -auto-approve