GlusterFS представляет собой кластерную файловую систему, способную масштабироваться для хранения далеко не одного петабайта данных. Как и многие другие кластерные файловые системы, GlusterFS агрегирует дисковое пространство большого количества машин в одну общую параллельную сетевую файловую систему через Infiniband RDMA или TCP/IP соединение. Обычно в качестве аппаратной основы для этой файловой системы используется ничем не выдающееся недорогое серверное оборудование, в полной мере реализуя принцип программного построения стабильности при использовании на ненадежном оборудовании.
Кластерные файловые системы еще не достаточно приспособлены для использования на крупных предприятиях: обычно процесс их развертывания и поддержания в работающем состоянии не так уж прост. Но зато они отлично масштабируются и достаточно дешевы, ведь для них достаточно самого простого серверного оборудования и opensource операционных систем и програмного обеспечения. Основной целью разработчиков GlusterFS как раз и является построение кластерной файловой системы, адаптированной для использования в рамках серьезных компаний.
Список основных ее особенностей по большей части мало чем отличается от других кластерных файловых систем:
- Состоит из клиентской и серверной частей. Клиентская часть позволяет монтировать файловую систему, а серверная - glusterfsd - экспортировать в нее локальное дисковое пространство.
- Масштабируемость близка к O(1).
- Широкий спектр возможностей за счет использования модульной архитектуры.
- Имеется возможность восстановления файлов и директорий из файловой системы даже без ее инициализации.
- Отсутствие централизованного сервера метаданных, что делает ее более устойчивой к потенциальным сбоям.
- Расширяемый интерфейс выполнения задач, с поддержкой загрузки модулей в зависимости от особенностей выполнения пользователями операций по работе с данными.
- Расширяющий функциональность механизм трансляторов.
- Поддержка Infiniband RDMA и TCP/IP.
- Возможность автоматического восстановления в случае сбоев.
- Полностью реализована на уровне приложений, что упрощает ее поддержание в рабочем состоянии, портирование и дальнейшую разработку.
Но некоторые моменты все же заслуживают отдельного внимания:
Совместимость
Как уже упоминалось, файловая система реализована полностью на уровне пользовательских приложений, что делает возможным ее монтирование без каких-либо дополнительных патчей в ядре операционной системы, единственное требование к нему: поддержка FUSE. Серверная часть GlusterFS может функционировать на любой POSIX-совместимой операционной системе и протестирована на Linux, FreeBSD, OpenSolaris, в отличии от клиентской части, которая может работать только в Linux.
Модули
В виде модулей реализованы различные варианты выполнения основополагающих операций: передачи данных и балансировки нагрузки в рамках кластера. Транспортные модули обеспечивают передачу данных по различным типам соединений:
- TCP/IP;
- Infiniband-verbs;
- Infiniband-SDP.
Балансировка нагрузки может выполняться по следующим алгоритмам:
- ALU - использует целый ряд факторов, включающий объем свободного локального дискового пространства, активность операций чтения и записи, количество одновременно открытых файлов, скорость физического вращения дисков. Значимость, придаваемая каждому из показателей, может достаточно гибко настраиваться.
- RR - по очереди размещает файлы последовательно на каждом узле, после чего начинает процесс заново, образуя своеобразный цикл. Этот метод эффективен если файлы имеют примерно одинаковый размер, а узлы кластера - одинаковый размер экспортированного локального дискового пространства.
- Random - распределяют файлы случайным образом.
- NUFA - приоритет отдается созданию файлов локально, а не на других узлах кластера.
- Switch - располагает файлы по определенным указанным особенностям имен файлов, по аналогии со switch(filename) в программировании, обычно в качестве критерия распределения файлов имеет смысл использовать их расширение.
- Трансляторы
- Они представляют собой очень мощный механизм для расширения возможностей GlusterFS, сама идея трансляторов бала позаимствована у GNU/Hurd и заключается она в загрузке бинарных библиотек (.so) в процессе работы системы в зависимости от использованных настроек и использовании их в виде своеобразной цепочки обработчиков при работе с файлами как на серверной, так и на клиентской стороне. В GlusterFS практически все дополнительные возможности реализованы именно виде трансляторов, начиная от дополнений, увеличивающих производительность, заканчивая средствами отладки. Вкратце перечислю основные из них: + AFR - автоматическая репликация файлов. + Stripe - разбивает файлы на блоки фиксированного размера. + Unify - объединяет несколько узлов кластера в один большой виртуальный узел, один узел выделяется для обеспечения внутреннего namespace. Директории создаются на всех узлах, составляющих unify, а каждый файл - лишь на одном (если не используется AFR). + Trace - предоставляют информацию для отладки в виде дополнительных записей в лог. + Filter - фильтрация файлов на основании их имен и/или атрибутов. + Posix-locks - обеспечивает POSIX блокировку записей независимую от используемой системы хранения. + Trash - предоставляет функциональность сопоставимую с libtrash (или "корзиной" - если так понятнее). + Fixed-id - обеспечивает доступ только для пользователей с определенными UID и GUID. + Posix - соединяет GlusterFS с низлежащей локальной файловой системой. + rot-13 - транслятор обеспечивает возможность шифрования и дешифрования данных по примитивному одноименному алгоритму.
Список возможностей, обеспечиваемых широким набором модулей и транслятором, впечатляет, большинство других opensource кластерных файловых систем не могут похвастаться подобной функциональностью (GlusterFS выпускается под GPL). Благодаря возможности работы через Infiniband производительность передачи данных также достаточно высока - она может достигать десятков гигабит в секунду. Обработка сбоев в отдельных узлах также осуществляется достаточно эффективно, так как может быть автоматизирована. Из потенциальных недостатков можно назвать некоторое количество редко проявляющих себя багов в коде, а также достаточно большой размер заголовков в используемом протоколе (несколько сотен байт). В целом эта система вполне работоспособна и полноценно выдерживает конкуренцию со стороны своих opensource "коллег".