X

News, tips, partners, and perspectives for the Oracle Solaris operating system

Введение в PxFS и знакомство с глобальным монтированием

Guest Author

Программное обеспечение Sun Cluster предполагает применение файловой системы Proxy (Proxy file system – PxFS). Файловая система PxFS позволяет использовать глобальные устройства, которые занимают ключевое место в управлении устройствами в кластере. Под рукой есть источник, и теперь можно пояснить некоторые функции PxFS. Я представлю обзор архитектуры PxFS и приведу ссылки на источники. Это будет рассмотрено в нескольких записях блога. В данной записи я опишу файловую систему PxFS и объясню глобальное монтирование.

PXFS -- это такой уровень протокола, на котором дисковые файловые системы распределяются между узлами кластера в соответствии с принципами, обеспечивающими совместимость с POSIX и высокий уровень доступности. Одновременный совместимый с POSIX доступ с нескольких узлов возможен без необходимости блокирования на уровне файлов от приложений. Для выполнения глобального монтирования администратору необходимо только убедиться в том, что на всех узлах кластеров существует точка монтирования. После этого необходимо добавить "-g" к команде монтирования, и монтирование станет глобальным. В следующей записи блога объясняется терминология.

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

Примечание. Не пытайтесь выполнять это в Solaris 9, поскольку в этой версии Solaris имеется ошибка lofs, которая может нарушить работу системы.


# mkfile 100m /var/tmp/100m
# LOFIDEV=`lofiadm -a /var/tmp/100m`
# yes | newfs ${LOFIDEV}

Смонтируем приведенное выше устройство lofi на кластере (убедитесь, что целевой каталог существует на всех узлах).



# mount -g ${LOFIDEV} /mnt

Готово! Устройство /mnt доступно на всех узлах кластера, а файловая система UFS доступна на устройстве lofi на узле node1.

Теперь глобальное монтирование будет рассмотрено подробнее. Я приведу пример глобального монтирования файловой системы в совместно используемом устройстве хранения. Имеется трехузловой кластер, узлы node2 и node3 которого напрямую подключены к совместно используемому устройству хранения. Метаустройство svm "/dev/md/mydg/dsk/d42" смонтировано глобально в каталоге "/global/answer" узла node1.

Для просмотра кода, связанного с запуском служб PxFS, перейдите по следующей ссылке.

Подсистема монтирования является высокодоступной службой. Высокодоступная служба в кластере означает, что служба имеет возможность переключения при отказе. Любая высокодоступная служба имеет одну основную и одну или несколько дополнительных реплик. Любые дополнительные реплики могут стать основными в случае отказа текущей основной реплики. Это повышение дополнительной реплики до основной прозрачно для приложений.

В любой конфигурации кластера существует только одна основная реплика службы монтирования. На всех других узлах имеются только дополнительные реплики службы монтирования. На каждом узле кластера также имеется клиент монтирования, созданный при первом включении для узла глобального монтирования.

Основная и дополнительная реплики монтирования – это две стороны объекта реплики монтирования, создаваемого при присоединении узла к кластеру. Вот код, который создает сервер реплики монтирования. Платформа реплики обеспечивает одновременное наличие только одной основной реплики и повышение дополнительной реплики до основной в случае такой необходимости.

Теперь рассмотрим последовательность операций при выполнении глобального монтирования. См. рисунок ниже. Перечислены различные действия, выполняемые при глобальном монтировании. При наведении курсора мыши на номер появится подсказка с объяснением действия и ссылкой на соответствующий код.




Step 1href="javascript:void(0)"
onmouseover="Tip('The global mount command, mount -g, can be issued from any cluster node. It gets into the kernel and a generic mount redirects the call to PxFS. At this point, the directory to be mounted on is locked.
onnv-gate/usr/src/uts/common/syscall/mount.c#125
ohac/ohac/usr/src/common/cl/pxfs/client/pxvfs.cc#594', WIDTH, 400, TITLE, 'Step 1 for a global mount', SHADOW, true, FADEIN, 300, FADEOUT, 300, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true)"
onmouseout="UnTip()" />
Step 2href="javascript:void(0)"
onmouseover="Tip('The PxFS client tells the mount server about this global mount request via the mount client on that node. The mount client will have the server reference.
ohac/ohac/usr/src/common/cl/pxfs/client/pxvfs.cc#999', WIDTH, 400, TITLE, 'Step 2 for a global mount', SHADOW, true, FADEIN, 300, FADEOUT, 300, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true)"
onmouseout="UnTip()" />
Step 3href="javascript:void(0)"
onmouseover="Tip('The mount server in turn asks every client except the originating node, in this case node1, to lock the mount point.
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1204', WIDTH, 400, TITLE, 'Step 3 for a global mount', SHADOW, true, FADEIN, 300, FADEOUT, 300, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true)"
onmouseout="UnTip()" />
Step 3href="javascript:void(0)"
onmouseover="Tip('The mount server in turn asks every client except the originating node, in this case node1, to lock the mount point.
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1204', WIDTH, 400, TITLE, 'Step 3 for a global mount', SHADOW, true, FADEIN, 300, FADEOUT, 300, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true)"
onmouseout="UnTip()" />
Step 4href="javascript:void(0)"
onmouseover="Tip('

For shared devices, the mount server creates a PxFS primary and secondary. The node on which the device is primaried becomes the PxFS primary. For local devices, the mount is non-HA and an unreplicated PxFS server is created. The lofi device example, above, will result in an unreplicated PxFS server being created on node1.

The PxFS server does a hidden mount of the device. Details of the mount is contained in the PxFS server object.

ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1237
ohac/ohac/usr/src/common/cl/pxfs/server/repl_pxfs_server.cc#125', WIDTH, 400, TITLE, 'Step 4 for a global mount', SHADOW, true, FADEIN, 300, FADEOUT, 300, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true)"
onmouseout="UnTip()" />
Step 4href="javascript:void(0)"
onmouseover="Tip('

For shared devices, the mount server creates a PxFS primary and secondary. The node on which the device is primaried becomes the PxFS primary. For local devices, the mount is non-HA and an unreplicated PxFS server is created. The lofi device example, above, will result in an unreplicated PxFS server being created on node1.

The PxFS server does a hidden mount of the device. Details of the mount is contained in the PxFS server object.

ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1237
ohac/ohac/usr/src/common/cl/pxfs/server/repl_pxfs_server.cc#125', WIDTH, 400, TITLE, 'Step 4 for a global mount', SHADOW, true, FADEIN, 300, FADEOUT, 300, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true)"
onmouseout="UnTip()" />
Step 5href="javascript:void(0)"
onmouseover="Tip('The mount server passes a reference to the newly created server to all mount clients and asks the clients to do a user-visible PxFS mount.
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1438
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1684', WIDTH, 400, TITLE, 'Step 5 for a global mount', SHADOW, true, FADEIN, 300, FADEOUT, 300, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true)"
onmouseout="UnTip()" />
Step 5href="javascript:void(0)"
onmouseover="Tip('The mount server passes a reference to the newly created server to all mount clients and asks the clients to do a user-visible PxFS mount.
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1438
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1684', WIDTH, 400, TITLE, 'Step 5 for a global mount', SHADOW, true, FADEIN, 300, FADEOUT, 300, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true)"
onmouseout="UnTip()" />
Step 5href="javascript:void(0)"
onmouseover="Tip('The mount server passes a reference to the newly created server to all mount clients and asks the clients to do a user-visible PxFS mount.
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1438
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1684', WIDTH, 400, TITLE, 'Step 5 for a global mount', SHADOW, true, FADEIN, 300, FADEOUT, 300, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true)"
onmouseout="UnTip()" />
Step 6href="javascript:void(0)"
onmouseover="Tip('The mount client creates and adds a vfs_t entry of the same type as the underlying file system.
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_client_impl.cc#1804
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_client_impl.cc#1817', WIDTH, 400, TITLE, 'Step 6 for a global mount', SHADOW, true, FADEIN, 300, FADEOUT, 300, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true)"
onmouseout="UnTip()" />
Step 6href="javascript:void(0)"
onmouseover="Tip('The mount client creates and adds a vfs_t entry of the same type as the underlying file system.
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_client_impl.cc#1804
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_client_impl.cc#1817', WIDTH, 400, TITLE, 'Step 6 for a global mount', SHADOW, true, FADEIN, 300, FADEOUT, 300, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true)"
onmouseout="UnTip()" />
Step 6href="javascript:void(0)"
onmouseover="Tip('The mount client creates and adds a vfs_t entry of the same type as the underlying file system.
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_client_impl.cc#1804
ohac/ohac/usr/src/common/cl/pxfs/mount/mount_client_impl.cc#1817', WIDTH, 400, TITLE, 'Step 6 for a global mount', SHADOW, true, FADEIN, 300, FADEOUT, 300, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true)"
onmouseout="UnTip()" />

Для упрощения чтения ниже приведены действия, указанные на карте ссылок выше.


  1. Команда глобального монтирования mount -g может быть выполнена с любого узла кластера. Команда передается ядру, а общее монтирование перенаправляет вызов PxFS. После этого каталог для монтирования блокируется.

    http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/syscall/mount.c#125 http://src.opensolaris.org/source/xref/ohac/ohac/usr/src/common/cl/pxfs/client/pxvfs.cc#594

  2. Клиент PxFS сообщает серверу монтирования об этом запросе на глобальное монтирование через клиент монтирования на данном узле. Клиент монтирования получит ссылку на сервер.

    http://src.opensolaris.org/source/xref/ohac/ohac/usr/src/common/cl/pxfs/client/pxvfs.cc#999

  3. Сервер монтирования последовательно отправляет запрос всем клиентам, кроме исходного узла, в данном случае node1, на блокировку точки монтирования.

    http://src.opensolaris.org/source/xref/ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1204

  4. Для совместно используемых устройств сервер монтирования создает основную и дополнительную реплики PxFS. Узел, на котором устройство становится основным, становится основной репликой PxFS. Для локальных устройств монтирование не является высокодоступным, и создается нереплицированный сервер PxFS. В приведенном выше примере устройства lofi на узле node1 будет создан нереплицированный сервер PxFS.

    Сервер PxFS осуществляет скрытое монтирование устройства. Сведения о монтировании содержатся в объекте сервера PxFS.

    http://src.opensolaris.org/source/xref/ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1237 http://src.opensolaris.org/source/xref/ohac/ohac/usr/src/common/cl/pxfs/server/repl_pxfs_server.cc#125

  5. Сервер монтирования передает ссылку на новый созданный сервер всем клиентам монтирования и запрашивает у клиентов выполнение видимого для пользователя монтирования PxFS.

    http://src.opensolaris.org/source/xref/ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1438 http://src.opensolaris.org/source/xref/ohac/ohac/usr/src/common/cl/pxfs/mount/mount_server_impl.cc#1684

  6. Клиент монтирования создает и добавляет запись vfs_t такого же типа, как и используемая файловая система.

    http://src.opensolaris.org/source/xref/ohac/ohac/usr/src/common/cl/pxfs/mount/mount_client_impl.cc#1804 http://src.opensolaris.org/source/xref/ohac/ohac/usr/src/common/cl/pxfs/mount/mount_client_impl.cc#1817

Теперь монтирование является видимым на всех клиентах. Подсистема монтирования выполняет некоторые другие сложные действия, такие как запуск реплики fs при присоединении узла к кластеру и создание новой основной или дополнительной реплики PxFS при присоединении к кластеру узла, соединенного с хранилищем и т.д. В следующей записи блога будут рассмотрены принципы доступа к обычным файлам в PxFS.

Я благодарю Вальтера Зома за библиотеку javascript, благодаря которой подсказки были значительно упрощены.


Бину Филип (Binu Philip)
инженер Solaris Cluster

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.