В Vitastor есть две реализации файловой системы. Обе используются через vitastor-nfs
.
Команды:
Псевдо-ФС
Упрощённая реализация псевдо-ФС используется для эмуляции файлового доступа к блочным образам Vitastor. Это не полноценная файловая система - в ней отсутствуют многие функции POSIX ФС, а метаданные всех файлов (образов) сохраняются в etcd и всё время хранятся в оперативной памяти - то есть, псевдо-ФС подходит для сотен или тысяч файлов, но не миллионов.
Псевдо-ФС предназначена для доступа к образам виртуальных машин в средах, где другие способы невозможны или неудобны - например, в VMWare. Для VMWare это лучшая опция, чем iSCSI, так как при использовании iSCSI VMWare размещает все виртуальные машины в одном большом блочном образе внутри собственной ФС VMFS, а с NFS VMFS не используется и каждый диск ВМ представляется в виде одного файла, то есть, соответствует одному блочному образу Vitastor, как это и задумано изначально.
Чтобы подключить псевдо-ФС Vitastor, выполните команду vitastor-nfs mount --block /mnt/vita
.
Либо же запустите сетевой вариант сервера:
vitastor-nfs start --block --etcd_address 192.168.5.10:2379 --portmap 0 --port 2050 --pool testpool
Примонтировать ФС, запущенную с такими опциями, можно следующей командой:
mount server:/ /mnt/ -o port=2050,mountport=2050,nfsvers=3,soft,nolock,tcp
VitastorFS
VitastorFS - полноценная кластерная (Read-Write-Many) файловая система. Она поддерживает большую часть функций POSIX - иерархическую организацию, символические ссылки, жёсткие ссылки, быстрые переименования и так далее.
Метаданные VitastorFS хранятся в собственной реализации БД формата ключ-значения,
основанной на Параллельном Оптимистичном Б-дереве поверх обычного блочного образа Vitastor.
И записи каталогов, и иноды, как обычно в Vitastor, хранятся в простом человекочитаемом
JSON-формате :-). Для инспекции содержимого БД можно использовать инструмент vitastor-kv
.
Чтобы использовать VitastorFS:
- Создайте пул для данных ФС или выберите существующий пустой пул
- Создайте блочный образ для метаданных ФС, желательно, в более быстром пуле (на SSD
или по крайней мере на HDD, но без EC), но можно и в том же пуле, что данные
(размер образа значения не имеет):
vitastor-cli create -s 10G -p fastpool testfs
- Пометьте пул данных как ФС-пул:
vitastor-cli modify-pool --used-for-fs testfs data-pool
- Либо примонтируйте ФС:
vitastor-nfs mount --fs testfs --pool data-pool /mnt/vita
- Либо запустите сетевой NFS-сервер:
vitastor-nfs start --fs testfs --pool data-pool
Поддерживаемые функции POSIX
- Чтение актуальной версии данных сразу после записи
- Последовательное и произвольное чтение и запись
- Запись за пределами текущего размера файла
- Иерархическая организация, мгновенное переименование файлов и каталогов
- Изменение размера файла (truncate)
- Права на файлы (chmod/chown)
- Фиксация данных на диски (когда необходимо) (fsync)
- Символические ссылки
- Жёсткие ссылки
- Специальные файлы (устройства, сокеты, каналы)
- Отслеживание времён модификации (mtime), изменения атрибутов (ctime)
- Ручное изменение времён модификации (mtime), последнего доступа (atime)
- Корректная обработка изменений списка файлов во время листинга
Ограничения
Отсутствующие на данный момент в VitastorFS функции POSIX:
- Блокировки файлов не поддерживаются
- Фактически занятое файлами место не подсчитывается и не возвращается вызовами
stat(2), так что
du
всегда показывает сумму размеров файлов, а не фактически занятое место - Времена доступа (
atime
) не отслеживаются (как будто ФС смонтирована с-o noatime
) - Времена модификации (
mtime
) отслеживаются асинхронно (как будто ФС смонтирована с-o lazytime
)
Другие недостающие функции, которые нужно добавить в будущем:
- Переиспользование номеров инодов. В текущей реализации номера инодов всё время увеличиваются, так что в теории вы можете упереться в лимит, если насоздаёте и наудаляете больше, чем 2^48 файлов.
- Очистка места в Б-дереве метаданных. Текущая реализация никогда не сливает и не
удаляет блоки Б-дерева, так что в теории дерево может разростись и стать неоптимальным.
Если вы столкнётесь с такой ситуацией сейчас, вы можете решить её с помощью
команд
vitastor-kv dumpjson
иloadjson
(т.е. пересоздав и загрузив обратно все метаданные ФС). - Инструмент проверки метаданных файловой системы. У VitastorFS нет журнала, так как журнал бы сильно замедлил реализацию, вместо него используются оптимистичные транзакции на основе CAS (сравнить-и-записать), и теоретически при нештатном завершении сервера ФС в БД также могут оставаться неконсистентные “мусорные” записи. ФС устроена так, что на работу они не влияют, но для порядка и их стоит уметь подчищать.
Горизонтальное масштабирование
Клиент Linux NFS 3.0 не поддерживает встроенное масштабирование или отказоустойчивость. То есть, вы не можете задать несколько адресов серверов при монтировании ФС.
Однако вы можете использовать любые стандартные сетевые балансировщики нагрузки
или схемы с отказоустойчивостью. Это точно безопасно при настройках immediate_commit=all
и
client_enable_writeback=false
, так как с ними NFS-сервер Vitastor вообще не хранит
в памяти ещё не зафиксированные на дисках данные; и вполне вероятно безопасно
даже без immediate_commit=all
, потому что NFS-клиент ядра Linux повторяет все
незафиксированные запросы при потере соединения.
Команды
mount
vitastor-nfs (--fs <NAME> | --block) mount [-o <OPT>] <MOUNTPOINT>
Запустить локальный сервер и примонтировать ФС в директорию
Чтобы отмонтировать ФС, используйте обычную команду umount <MOUNTPOINT>
.
Сервер автоматически останавливается при отмонтировании ФС.
-o|--options <OPT>
- Передать дополнительные опции монтирования NFS (пример: -o async).
start
vitastor-nfs (--fs <NAME> | --block) start
Запустить сетевой NFS-сервер. Опции:
--bind <IP> |
принимать соединения по адресу <IP> (по умолчанию 0.0.0.0 - на всех) |
--port <PORT> |
использовать порт <PORT> для NFS-сервисов (по умолчанию 2049) |
--portmap 0 |
отключить сервис portmap/rpcbind на порту 111 (по умолчанию включён и требует root привилегий) |
upgrade
vitastor-nfs --fs <NAME> upgrade
Обновить метаданные ФС. Можно запускать онлайн (при запущенных серверах NFS), но после выполнения их всё же желательно перезапустить.
defrag
vitastor-nfs --fs <NAME> defrag [OPTIONS] [--dry-run]
Дефрагментировать тома, используемые для хранения мелких файлов, в которых более, чем <defrag_percent> процентов данных удалено. Можно запускать онлайн.
На уровне реализации ФС файлы, меньшие, чем размер объекта пула (block_size умножить на число частей данных, если пул EC), упаковываются друг за другом в большие “тома” / “общие иноды”. Когда такие файлы удаляются или увеличиваются, они перемещаются и оставляют за собой “мусор”.
При дефрагментации мусор удаляется, а всё ещё используемые данные перемещаются в новые тома.
Опции:
--volume_untouched 86400 |
Дефрагментировать только тома, в которые уже не писали это число секунд |
--defrag_percent 50 |
Дефрагментировать только тома, в которых этот % данных удалён |
--defrag_block_count 16 |
Читать это количество блоков пула за один раз |
--defrag_iodepth 16 |
Перемещать одновременно до этого числа файлов |
--trace |
Печатать детальную статистику дефрагментации |
--dry-run |
Не производить никаких изменений, только описать выполняемые действия |
--recalc-stats |
Пересчитать и сохранить статистику всех томов |
--include-empty |
Дефрагментировать старые и пустые тома; обязательно перезапустите NFS-сервера после использования этой опции |
--no-rm |
Перемещать, но не удалять данные |
Общие опции
--fs <NAME> |
использовать VitastorFS с метаданными в образе <NAME> |
--block |
использовать псевдо-ФС для доступа к блочным образам |
--pool <POOL> |
использовать пул <POOL> для новых файлов (обязательно, если пул в кластере не один) |
--subdir <DIR> |
экспортировать подкаталог <DIR>, а не корень (только для псевдо-ФС) |
--nfspath <PATH> |
установить путь NFS-экспорта в <PATH> (по умолчанию /) |
--pidfile <FILE> |
записать ID процесса в заданный файл |
--logfile <FILE> |
записывать логи в заданный файл |
--foreground 1 |
не уходить в фон после запуска |