211 lines
17 KiB
Markdown
211 lines
17 KiB
Markdown
[Документация](../../README-ru.md#документация) → Использование → VitastorFS и псевдо-ФС
|
||
|
||
-----
|
||
|
||
[Read in English](nfs.en.md)
|
||
|
||
# VitastorFS и псевдо-ФС
|
||
|
||
В Vitastor есть две реализации файловой системы. Обе используются через `vitastor-nfs`.
|
||
|
||
Команды:
|
||
- [mount](#mount)
|
||
- [start](#start)
|
||
- [upgrade](#upgrade)
|
||
- [defrag](#defrag)
|
||
|
||
## Псевдо-ФС
|
||
|
||
Упрощённая реализация псевдо-ФС используется для эмуляции файлового доступа к блочным
|
||
образам 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:
|
||
|
||
1. Создайте пул для данных ФС или выберите существующий пустой пул
|
||
2. Создайте блочный образ для метаданных ФС, желательно, в более быстром пуле (на SSD
|
||
или по крайней мере на HDD, но без EC), но можно и в том же пуле, что данные
|
||
(размер образа значения не имеет):
|
||
`vitastor-cli create -s 10G -p fastpool testfs`
|
||
3. Пометьте пул данных как ФС-пул: `vitastor-cli modify-pool --used-for-fs testfs data-pool`
|
||
4. Либо примонтируйте ФС: `vitastor-nfs mount --fs testfs --pool data-pool /mnt/vita`
|
||
5. Либо запустите сетевой 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 повторяет все
|
||
незафиксированные запросы при потере соединения.
|
||
|
||
## RDMA
|
||
|
||
vitastor-nfs поддерживает NFS через RDMA. В теории это также должно позволять использовать
|
||
VitastorFS из GPUDirect.
|
||
|
||
Вы можете протестировать NFS-RDMA, даже если у вас нет RDMA-карты, с помощью SoftROCE:
|
||
|
||
1. Сначала создайте SoftROCE устройства на обоих тестовых серверах: `rdma link add rxe0 type rxe netdev eth0`.
|
||
Утилита `rdma` входит в состав пакета iproute2, а `eth0` вам нужно заменить на имя своей
|
||
сетевой карты.
|
||
|
||
2. Запустите vitastor-nfs с RDMA: `vitastor-nfs start (--fs <NAME> | --block) --pool <POOL> --port 20049 --nfs_rdma 20049 --portmap 0`
|
||
|
||
3. Смонтируйте ФС: `mount 192.168.0.10:/mnt/test/ /mnt/vita/ -o port=20049,mountport=20049,nfsvers=3,soft,nolock,rdma`
|
||
|
||
## Команды
|
||
|
||
### mount
|
||
|
||
`vitastor-nfs (--fs <NAME> | --block) mount [-o <OPT>] <MOUNTPOINT>`
|
||
|
||
Запустить локальный сервер и примонтировать ФС в директорию <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). Укажите "auto", чтобы выбрать и напечатать случайный порт |
|
||
| `--portmap 0` | отключить сервис portmap/rpcbind на порту 111 (по умолчанию включён и требует root привилегий) |
|
||
| `--nfs_rdma <PORT>` | включить NFS-RDMA на порту RDMA-CM \<PORT> (попробуйте 20049). Если RDMA включено и указано `--port 0`, TCP будет отключено |
|
||
| `--nfs_rdma_credit 16` | максимальный "кредит", глубина очереди для NFS-клиентов |
|
||
| `--nfs_rdma_send 1024` | максимальное число операций RDMA отправки (должно быть больше nfs_rdma_credit) |
|
||
| `--nfs_rdma_alloc 1M` | округление выделения памяти для RDMA-клиентов |
|
||
| `--nfs_rdma_gc 64M` | максимальный объём неиспользуемой памяти RDMA-клиентом перед освобождением |
|
||
|
||
### 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` | не уходить в фон после запуска |
|