160 lines
12 KiB
Markdown
160 lines
12 KiB
Markdown
[Документация](../../README-ru.md#документация) → Использование → VitastorFS и псевдо-ФС
|
||
|
||
-----
|
||
|
||
[Read in English](nfs.en.md)
|
||
|
||
# VitastorFS и псевдо-ФС
|
||
|
||
В Vitastor есть две реализации файловой системы. Обе используются через `vitastor-nfs`.
|
||
|
||
Команды:
|
||
- [mount](#mount)
|
||
- [start](#start)
|
||
|
||
## Псевдо-ФС
|
||
|
||
Упрощённая реализация псевдо-ФС используется для эмуляции файлового доступа к блочным
|
||
образам 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`)
|
||
|
||
Другие недостающие функции, которые нужно добавить в будущем:
|
||
- Дефрагментация "общих инодов". На уровне реализации ФС файлы, меньшие, чем размер
|
||
объекта пула (block_size умножить на число частей данных, если пул EC),
|
||
упаковываются друг за другом в большие "общие" иноды/тома. Если такие файлы удалять
|
||
или увеличивать, они перемещаются и оставляют за собой "мусор", вот тут-то и нужен
|
||
дефрагментатор.
|
||
- Переиспользование номеров инодов. В текущей реализации номера инодов всё время
|
||
увеличиваются, так что в теории вы можете упереться в лимит, если насоздаёте
|
||
и наудаляете больше, чем 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>`
|
||
|
||
Запустить локальный сервер и примонтировать ФС в директорию <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 привилегий) |
|
||
|
||
## Общие опции
|
||
|
||
| <!-- --> | <!-- --> |
|
||
|--------------------|---------------------------------------------------------|
|
||
| `--fs <NAME>` | использовать VitastorFS с метаданными в образе \<NAME> |
|
||
| `--block` | использовать псевдо-ФС для доступа к блочным образам |
|
||
| `--pool <POOL>` | использовать пул \<POOL> для новых файлов (обязательно, если пул в кластере не один) |
|
||
| `--subdir <DIR>` | экспортировать подкаталог \<DIR>, а не корень (только для псевдо-ФС) |
|
||
| `--nfspath <PATH>` | установить путь NFS-экспорта в \<PATH> (по умолчанию /) |
|
||
| `--pidfile <FILE>` | записать ID процесса в заданный файл |
|
||
| `--logfile <FILE>` | записывать логи в заданный файл |
|
||
| `--foreground 1` | не уходить в фон после запуска |
|