Thank you for reading this post, don't forget to subscribe!
GlusterFS — это распределенная, параллельная, линейно масштабируемая файловая система с возможностью защиты от сбоев. С помощью нее можно объединить множество хранилищ данных, размещенных на разных серверах (горизонтальное масштабирование) в одну сетевую файловую систему. Так же возможно объединение нескольких хранилищ одного сервера (вертикальное масштабирование). А защита от сбоев достигается с помощью различных политик дублирования данных.
GlusterFS использует механизмы FUSE (файловая система в пользовательском пространстве) и работает по верх любых POSIX ФС, например Ext3, Ext4, XFS, Btrfs.
В качестве транспорта может использоваться Infiniband RDMA и TCP/IP.
В отличие от других распределённых файловых систем, таких как Lustre и Ceph, для работы GlusterFS не требуется отдельный сервер для хранения метаданных. В данном случае они хранятся вместе с данными в расширенных атрибутах файлов. Благодаря отсутствию привязки к централизованному серверу мета-данных ФС предоставляет практически неограниченную масштабируемость. Объём хранилища может измеряться петабайтами.
Коротко о остальных возможностях ФС:
Можно использовать любое оборудование (подойдёт даже ARM);
Работает через стандартные протоколы NFS, SMB/CIFS или нативный клиент;
Автоматическое обнаружение отказа отдельного хранилища (Brick Failure Detection);
Возможно сжатие данных при передаче по сети;
Поддерживается шифрование данных дисковых разделов на стороне сервера с использованием ключей, доступных только клиенту. При этом шифруется только содержимое файлов, имена и метаданные остаются незашифрованными. Шифрование неприменимо при использовании NFS;
Оптимизирована для использования в качестве распределённого хранилища образов виртуальных машин;
Интеграция с QEMU и Samba позволяющая организовать прямой доступ к данным, хранимым в GlusterFS, без монтирования раздела;
Может использоваться в качестве первичного хранилища в OpenStack;
Механизм zerofill позволяет заполнять нулями новые образы виртуальных машин;
Поддерживается асинхронная гео-репликация по модели master–slave. На эту тему я планирую подготовить отдельный материал.
Примечание: FUSE — это модуль ядра в ОС UNIX и Linux, который является своего рода посредником между пользовательским пространством и пространством ядра. FUSE предоставляет интерфейс ядра (API) с помощью которого непривилегированные процессы получают доступ к низкоуровневым механизмам файловых систем (посредством VFS). Благодаря этому, можно написать свою собственную файловую систему которая будет обладать практически всеми возможностями низкоуровневой ФС но работать с правами обычного пользователя. Конечно же, наличие данной прослойки сказывается на производительности ФС, но сегодня даже среднее по производительности оборудование может компенсировать данный недостаток. Наиболее известные ФС использующие механизм FUSE; SSHFS (SSH Filesystem), EncFS(Encrypted Filesystem), NTFS-3G.
GlusterFS сейчас
Работа над GlusterFS была начата в 2005 году. В 2011 проект был приобретен компанией Red Hat и лег в основу Red Hat Storage Server.
На текущий момент код ФС полностью открыт а проект Gluster трансформирован в новое сообщество для разработки свободных проектов, связанных с системами хранения данных.
GlusterFS. Архитектура
GlusterFS имеет клиент-серверную архитектуру расширяемую за счет различных модулей(трансляторов).
Серверы здесь — это узлы хранения (Storage Node). На каждом таком узле работает служба glusterd которая предоставляет доступ клиентам к локальным файловым системам. Одна экспортируемая файловая система узла хранения называется «brick» (кирпич). В рамках статьи я так же буду использовать термин «под том». Таких кирпичей на одном сервере может быть множество. Например на одном диске или массиве может быть несколько разделов с различными файловыми системами каждая из которых будет отдельным кирпичом.
Несколько серверов объединяются в кластер или пул хранения данных (Trusted Storage Pool), в терминологии GlusterFS. В рамках пула хранения, под тома на различных узлах объединяются в логические тома(volumes) различной конфигурации. Клиентская часть, взаимодействуя с узлами кластера, совершенно прозрачно для приложений монтирует логический том посредством механизма FUSE.
На одном компьютере допускается работа как серверной так и клиентской части.
Трансляторы
Практически вся функциональность GlusterFS реализуется с помощью специальных модулей, называемых трансляторами. Это бинарные динамические объекты(.so) каждый из которых реализует определённую функциональность. По сути данные, записываемые и считываемые с виртуального тома проходят через целую цепочку трансляторов которые обрабатывают их по принципу конвейера. Разные тома могут иметь свои наборы трансляторов в зависимости от задачи. Параметры трансляторов определяется в файле конфигурации тома о которых ниже.
Стандартные трансляторы:
storage – низкоуровневый транслятор, производит запись и чтение данных с локальной файловой системы;
cluster – занимается репликацией данных и их распределением по кирпичам;
debug – предоставляет интерфейс и статистику ошибок для отладки;
encryption – занимается шифрованием и расшифровкой данных на лету;
protocol – производит аутентификацию между клиентом и сервером;
pеrformance – транслятор для оптимизации производительности(опережающее чтение (read-ahead) и запаздывающая запись (write-behind));
system – управление ACL;
scheduler – глобальный планировщик операций I/O;
features –квоты, фильтры, и прочее;
bindings – различные API.
Кроме этого есть возможность написать свой собственный транслятор для какой-то особой задачи. Например, есть сторонние реализации хранилища GlusterFS по аналогии с массивом RAID5.
Типы томов
Distributed — распределенный том. Тип тома, при котором данные распределяются равномерно (в произвольном порядке) по всем под томам. Например первый файл будет записан на первый сервер а второй файл — на третий. Тома такого типа очень хорошо и легко масштабируются, но никак не защищены средствами GlusterFS. Надежность Distributed тома необходимо обеспечить отдельно на аппаратном или программном уровне. В случае выхода из строя сервера или его дисков, данные находящиеся на нем будут не доступны. Самое интересное в этой схеме, что совершенно непредсказуемо, какие именно данные будут потеряны.
Replicated — тома с репликацией. Аналогично RAID 1. В такой конфигурации одни и те же данные записываются минимум на два подтома. Более детальное разъяснение будет дано с примерами.
Striped — том с чередованием. Аналогично RAID 0, наиболее производительный и одновременно самый ненадежный тип. Все поступающие данные разбиваются на части и параллельно пишутся на разные подтома на разных серверах. При считывании данные в обратном порядке собираются и отдаются клиенту. В результате выхода из строя одного сервера или его диска, том приходит в негодность до восстановления сбойного узла.
Distributed Striped — распределение с чередованием. Здесь как и в случае с Distributed-томом данные распределяются между разными серверами при этом они еще разбиваются на части между несколькими Striped-томами(См. рис. 1).
Distributed Replicated — то же, что и Distributed Striped, только вместо чередования будет использоваться репликация (мм. рис. 2). Этот вариант предоставляет такую же масштабируемость как и простой Distributed том но при этом обладает повышенной надежностью за которую придется платить вдвое большим количеством серверов/дисков. Такая конфигурация рекомендуется разработчиками для высокопроизводительных сред, с повышенными требованиям к надежности.
Принцип работы Distributed Striped тома
Принцип работы Distributed Replicated тома