Тестирование технологии NFS multipathing

Вводная часть

Сетевая файловая система (NFS) – это протокол распределенной файловой системы, первоначально разработанный Sun Microsystems (Sun) в 1984 году. Этот протокол позволяет пользователям NFS-клиентов получать доступ к файлам на NFS-серверах по компьютерным сетям. Поскольку сервис NFS широко используется в таких отраслях, как финансы, EDA, искусственный интеллект и контейнеризация, к производительности и надежности NFS предъявляются более высокие требования.

Традиционная NFS обладает следующими недостатками:

  • Доступ к точке монтирования на клиентском хосте можно получить только с помощью одного IP-адреса клиента и одного IP-адреса сервера. Когда между клиентом и сервером существует несколько физических соединений, производительность этих соединений не может быть использована в полной мере.

  • Если канал связи точки монтирования стал неисправен, то, даже при условии что у нас есть ещё один канал связи с NFS сервером, переход на этот другой канал не может быть выполнен. В результате на NFS-клиенте возникают сбои при попытке обращения к смонтированном ресурсу NFS.

NFS multipathing разработана для устранения предыдущих дефектов, возникающих при использовании традиционной NFS. Предлагается установить несколько каналов связи между клиентом и сервером в рамках одной точки монтирования для поддержки передачи данных ввода-вывода по нескольким каналам, повышая производительность одной точки монтирования. Кроме того, периодически проверяется состояние соединения, чтобы обеспечить быструю отработку отказа ввода-вывода при сбое соединения.

NFS multipathing предоставляет следующие функции:

  • NFSv3 поддерживает алгоритм циклического выбора каналов связи, чтобы сбалансировать их производительность.

  • NFSv3 и NFSv4 поддерживают быструю отработку отказа соединения, повышая надежность NFS.

  • Предоставляет интерфейс для регистрации алгоритмов выбора пути соединения и позволяет разработчикам сервера NFS настраивать алгоритмы выбора пути.

  • Поддерживает периодическое определение доступности канала.

  • Позволяет просматривать статус ссылки.

Кто-то может подумать, зачем нужна эта технология, если с 2010 года уже существует расширение протокола pNFS, которое было добавлено в версии NFSv4.1? Но тут есть нюанс в том, что клиентская часть pNFS в Linux реализована на достаточно приемлемом уровне, а вот реализации серверов требуют ещё некоторое количество доработок. Те кто пытался настроить pNFS в Linux сталкивался с рядом ограничений, а именно – некоторые реализации pNFS не поддерживают нужные режимы работы (Block Volume, Flexible Files, OSD2 Objects, Block SCSI, NFSv4.1 Files), или часть их функционала реализована ещё не полностью.

К тому же, следует заметить, что pNFS работает со слоями (layout) и имеет разделение серверов на хранилище метаданных (MDS) и хранилища данных (DS), а представленная в этой статье технология является расширением над классическим NFS v4 с файловым доступом к серверу NFS, у которого имеется несколько сетевых подключений, которые обеспечивают доступность с NFS клиента по множеству маршрутов.

Установка

Данная технология представлена в версии OpenScaler 23.03, которая не является LTS версией и предназначена больше для демонстрации новых технологий, которые в дальнейшем получат своё развитие.

Для установки достаточно поставить на виртуальную машину или физический сервер OpenScaler версии 23.03. Модуль ядра nfs_multipath будет доступен уже «из коробки»

Нам будет достаточно только убедиться, что он загружен в память:

nfs-server# modprobe nfs_multipath
nfs-server# lsmod | grep nfs
nfs_multipath          36864  0
nfs                   544768  1 nfs_multipath
fscache               380928  1 nfs
nfsd                  741376  5
auth_rpcgss           159744  2 nfsd,rpcsec_gss_krb5
nfs_acl                16384  1 nfsd
lockd                 135168  2 nfsd,nfs
grace                  16384  2 nfsd,lockd
sunrpc                704512  27 nfs_multipath,nfsd,rpcrdma,auth_rpcgss,lockd,rpcsec_gss_krb5,nfs_acl,nfs

Схема стенда тестирования

Наш NFS сервер в проводимом тестировании имеет следующие ip адреса на сетевых интерфейсах:

enp7s0: 172.17.40.201/24
enp8s0: 172.17.50.201/24
enp9s0: 172.17.60.201/24

На NFS клиенте мы настроим следующий адрес:

enp7s0: 172.17.4.210/24

Для удобства понимания приведём схему сети нашего теста тестирования.


Настраиваем маршрутизацию на стенде тестирования так, чтобы наш NFS сервер был доступен клиенту по всем трём ip адресам. Для этого можно воспользоваться утилитой iproute.

Прописываем маршруты на NFS сервере:

nfs-server# ip rule add from 172.17.40.200 lookup 200
nfs-server# ip route add 172.17.4.0/24 via 172.17.40.254 dev enp7s0 table 200

nfs-server# ip rule add from 172.17.50.200 lookup 300
nfs-server# ip route add 172.17.4.0/24 via 172.17.50.254 dev enp8s0 table 300

nfs-server# ip rule add from 172.17.60.200 lookup 400
nfs-server# ip route add 172.17.4.0/24 via 172.17.60.254 dev enp9s0 table 400

Прописываем маршруты на NFS клиенте:

nfs-client# ip r add 172.17.40.0/24 via 172.17.4.254
nfs-client# ip r add 172.17.50.0/24 via 172.17.4.254
nfs-client# ip r add 172.17.60.0/24 via 172.17.4.254

Для экспортирования ресурса /data на NFS сервере мы редактируем файл /etc/exports и вносим в него строки:

/data *(rw,no_root_squash)

Тем самым не ограничивая никого в монтировании ресурса с уровнем доступа чтение-запись.

Для удобства тестирования (чтобы не перегружать статью побочной информацией) мы отключили firewall и на сервере и на клиенте.

Запускаем NFS сервер:

nfs-server# systemctl enable --now nfs-server.service

На NFS клиенте монтируем каталог:

nfs-client# mount -t nfs -o localaddrs=172.17.4.210,remoteaddrs=172.17.40.200~172.17.50.200~172.17.60.200 172.17.40.200:/data /mnt/

Из этой команды видно, что перечисление ip адресов сервера и клиента идёт при помощи разделителя «~».

Посмотрим статус смонтированного каталога, для этого на клиенте даём команду:

nfs-client# cat /proc/fs/nfs/mutipath/conn_info
===============================Id:2 count 3 proto 4 start========================
index:0, client_ip:172.17.4.210, server_ip:172.17.40.200, status:connect, load:16
index:1, client_ip:172.17.4.210, server_ip:172.17.50.200, status:connect, load:0
index:2, client_ip:172.17.4.210, server_ip:172.17.60.200, status:connect, load:0
=========================================Id:2 end================================

Из этого вывода мы видим, что клиент пытается смонтировать NFS ресурс по схеме один-ко-многим, то есть с каждого своего адреса он пытается подключиться ко всем указанным серверным адресам. В данный момент у данной реализации NFS multipathing ограничение на 8 подключений к NFS ресурсу.

Проверка работы

Попробуем отключить на NFS-сервере первый интерфейс:

nfs-server# ip l set dev enp7s0 down

Проверяем на клиенте:

nfs-client # cat /proc/fs/nfs/mutipath/conn_info
===============================Id:1 count 3 proto 4 start========================
index:0, client_ip:172.17.4.210, server_ip:172.17.40.200, status:disconnect, load:19
index:1, client_ip:172.17.4.210, server_ip:172.17.50.200, status:connect, load:6
index:2, client_ip:172.17.4.210, server_ip:172.17.60.200, status:connect, load:0
=========================================Id:1 end================================

Файлы в каталоге /mnt доступны, мы спокойно можем создавать, удалять, изменять файлы в этом каталоге.

Попробуем отключить ещё один интерфейс:

nfs-server# ip l set dev enp8s0 down

и проверяем на NFS-клиенте:

nfs-client# cat /proc/fs/nfs/mutipath/conn_info
===============================Id:1 count 3 proto 4 start========================
index:0, client_ip:172.17.4.210, server_ip:172.17.40.200, status:disconnect, load:19
index:1, client_ip:172.17.4.210, server_ip:172.17.50.200, status:disconnect, load:7
index:2, client_ip:172.17.4.210, server_ip:172.17.60.200, status:connect, load:5
=========================================Id:1 end================================

Видно, что клиент фиксирует, что для доступа к NFS серверу у него остался только один сетевой линк, но при всём при этом сетевой ресурс NFS доступен и продолжает работать.

Возвращаем обратно в строй наши выключенные на NFS сервере линки и снова проверяем на NFS клиенте:

nfs-client# cat /proc/fs/nfs/mutipath/conn_info
===============================Id:1 count 3 proto 4 start========================
index:0, client_ip:172.17.4.210, server_ip:172.17.40.200, status:connect, load:57
index:1, client_ip:172.17.4.210, server_ip:172.17.50.200, status:connect, load:8
index:2, client_ip:172.17.4.210, server_ip:172.17.60.200, status:connect, load:43
=========================================Id:1 end================================

Выводы

Сегодня мы рассмотрели достаточно интересную, новую технологию, которая устраняет некоторые проблемы, которые могут возникать при создании высокодоступных NFS серверов и надеемся, что в будущем, получив развитие, эта технология по праву сможет занять своё место среди решений предоставляющих возможность гибкой и удобной работы с использованием старого и доброго протокола NFS.

P.S. И да, в команде cat /proc/fs/nfs/mutipath/conn_info всё написано верно. Путь к файлу conn_info действительно содержит опечатку в слове multipath. Надеемся, что это будет исправлено в следующих версиях.