Развертывание параллельной файловой системы 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
, указав параметры разворачиваемых ресурсов:Важно
Заданные в файле значения приводят к разворачиванию ресурсоемкой инфраструктуры.
Чтобы развернуть ресурсы в рамках имеющихся у вас квот, используйте приведенные ниже значения или измените значения на свое усмотрение.-
В секции
is_ha
значениеdefault
измените наfalse
. -
В секции
client_node_per_zone
значениеdefault
измените на30
. -
В секции
storage_node_per_zone
значениеdefault
измените на30
.Примечание
В данном сценарии разворачивается 30 виртуальных машин. Вы можете изменить это количество в зависимости от требований к объёму конечного хранилища или общей пропускной способности.
Максимальная агрегированная пропускная способность всей системы рассчитывается как произведение пропускной способности каждого сегмента (450 МБ/с для сетевых SSD-дисков) на количество сегментов (30), что составляет около 13,5 ГБ/с.
Объем системы рассчитывается как произведение количества сегментов (30) на размер каждого хранилища (1 ТБ), что составляет 30 ТБ. -
Если при создании пары ключей SSH вы указали имя, отличное от имени по умолчанию, в секции
local_pubkey_path
значениеdefault
измените на<путь_к_публичному_ключу_SSH>
. -
Если вам необходима повышенная производительность и не важна гарантия сохранности данных, вы можете использовать нереплицируемые SSD-диски. Для этого в секции
disk_type
значениеdefault
измените наnetwork-ssd-nonreplicated
. Кроме этого, в секцииdisk_size
значениеdefault
должно быть кратно 93.
-
Разверните ресурсы
- Выполните инициализацию 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"
В результате в каталоге будут созданы 30 ВМ для размещения клиентского кода (client01
, client02
и так далее) и 30 привязанных к ним ВМ для распределенного хранения данных (gluster01
, gluster02
и так далее) в одной зоне доступности.
Установите и настройте 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-30]' gluster: 'gluster[01-30]' 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
доgluster30
:clush -w gluster01 'for i in {2..9}; do gluster peer probe gluster0$i; done' clush -w gluster01 'for i in {10..30}; do gluster peer probe gluster$i; done'
-
Создайте папки
vol0
в ВМ для хранения данных и настройте доступность и отказоустойчивость за счет подключения к папке общего доступаstripe-volume
:clush -w @gluster mkdir -p /bricks/brick1/vol0 export STRIPE_NODES=$(nodeset -S':/bricks/brick1/vol0 ' -e @gluster) clush -w gluster01 gluster volume create stripe-volume ${STRIPE_NODES}:/bricks/brick1/vol0
-
Выполните дополнительные настройки производительности:
clush -w gluster01 gluster volume set stripe-volume client.event-threads 8 clush -w gluster01 gluster volume set stripe-volume server.event-threads 8 clush -w gluster01 gluster volume set stripe-volume cluster.shd-max-threads 8 clush -w gluster01 gluster volume set stripe-volume performance.read-ahead-page-count 16 clush -w gluster01 gluster volume set stripe-volume performance.client-io-threads on clush -w gluster01 gluster volume set stripe-volume performance.quick-read off clush -w gluster01 gluster volume set stripe-volume performance.parallel-readdir on clush -w gluster01 gluster volume set stripe-volume performance.io-thread-count 32 clush -w gluster01 gluster volume set stripe-volume performance.cache-size 1GB clush -w gluster01 gluster volume set stripe-volume performance.cache-invalidation on clush -w gluster01 gluster volume set stripe-volume performance.md-cache-timeout 600 clush -w gluster01 gluster volume set stripe-volume performance.stat-prefetch on clush -w gluster01 gluster volume set stripe-volume server.allow-insecure on clush -w gluster01 gluster volume set stripe-volume network.inode-lru-limit 200000 clush -w gluster01 gluster volume set stripe-volume features.shard-block-size 128MB clush -w gluster01 gluster volume set stripe-volume features.shard on clush -w gluster01 gluster volume set stripe-volume features.cache-invalidation-timeout 600 clush -w gluster01 gluster volume set stripe-volume storage.fips-mode-rchecksum on
-
Смонтируйте папку общего доступа
stripe-volume
на клиентских ВМ:clush -w gluster01 gluster volume start stripe-volume clush -w @clients mount -t glusterfs gluster01:/stripe-volume /mnt/
Протестируйте доступность решения
-
Проверьте статус папки общего доступа
stripe-volume
:clush -w gluster01 gluster volume status
-
Создайте текстовый файл:
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 ... client30: 5fd9c031531c39f2568a8af5512803fad053baf3fe9eef2a03ed2a6f0a884c85 /mnt/test.txt
Протестируйте производительность решения
IOR
-
Установите зависимости:
clush -w @clients dnf install -y autoconf automake pkg-config m4 libtool git mpich mpich-devel make fio cd /mnt/ git clone https://github.com/hpc/ior.git cd ior mkdir prefix
-
Выйдите из командной оболочки и войдите заново:
^C sudo -i module load mpi/mpich-x86_64 cd /mnt/ior
-
Установите IOR:
./bootstrap ./configure --disable-dependency-tracking --prefix /mnt/ior/prefix make make install mkdir -p /mnt/benchmark/ior
-
Запустите IOR:
export NODES=$(nodeset -S',' -e @clients) mpirun -hosts $NODES -ppn 16 /mnt/ior/prefix/bin/ior -o /mnt/benchmark/ior/ior_file -t 1m -b 16m -s 16 -F mpirun -hosts $NODES -ppn 16 /mnt/ior/prefix/bin/ior -o /mnt/benchmark/ior/ior_file -t 1m -b 16m -s 16 -F -C
Результат:
IOR-4.1.0+dev: MPI Coordinated Test of Parallel I/O Options: api : POSIX apiVersion : test filename : /mnt/benchmark/ior/ior_file access : file-per-process type : independent segments : 16 ordering in a file : sequential ordering inter file : no tasks offsets nodes : 30 tasks : 480 clients per node : 16 memoryBuffer : CPU dataAccess : CPU GPUDirect : 0 repetitions : 1 xfersize : 1 MiB blocksize : 16 MiB aggregate filesize : 120 GiB Results: access bw(MiB/s) IOPS Latency(s) block(KiB) xfer(KiB) open(s) wr/rd(s) close(s) total(s) iter ------ --------- ---- ---------- ---------- --------- -------- -------- -------- -------- ---- write 1223.48 1223.99 4.65 16384 1024.00 2.44 100.39 88.37 100.44 0 read 1175.45 1175.65 4.83 16384 1024.00 0.643641 104.52 37.97 104.54 0
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы, удалите их:
terraform destroy -auto-approve