Назад | Перейти на главную страницу

Проблемы одновременной записи ZFS поверх NFS

Я запускаю кластер Proxmox, и в этом кластере у меня есть несколько виртуальных машин в частной сети с серверной частью хранилища CEPH (управляемой Proxmox) для дисков виртуальных машин.

Одна виртуальная машина (KVM), на которой запущен «Ubuntu 16.04 server minimal vm», настроена со вторым «жестким диском», настроенным как «хранилище» пула ZFS с одним диском, с использованием

zpool create storage /dev/sdb1

который автоматически монтируется в / storage. Эта виртуальная машина также запускает nfs-kernel-server.

Затем этот каталог экспортируется через nfs со следующей строкой в ​​/ etc / exports:

/storage        10.10.0.0/16(rw,sync)

Я монтирую этот экспорт с двух других машин (одна виртуальная машина с Ubuntu 14.04, одна физическая машина с сервером Ubuntu 16.04) через

mount -t nfs4 10.10.3.1:/storage /mnt

Поскольку это моя игровая площадка для тестирования конфигурации хранилища для запланированных двух веб-серверов, на которых размещается старое приложение Perl, записывающее файлы Berkeley DB, я решил протестировать одновременную запись простым способом, чтобы протестировать мое общее хранилище, с помощью простого скрипта php:

<?php
    $line = str_repeat($argv[1], 30) . "\n";

    for ($i = 1; $i <= 10000; $i++)
    {
        $of = fopen("test.txt", "a") or DIE("can't open output file\n");
            fwrite($of, sprintf("%04d-", $i)  . $line);
        fclose($of);
    }

?>

Я перехожу в каталог общего хранилища (здесь также находится скрипт php) и запускаю его, используя

php test.php 1

с первой удаленной машины и с

php test.php 2

со второй машины.

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

9286-222222222222222222222222222222
9287-222222222222222222222222222222
9288-222222222222222222222222222222
9289-222222222222222222222222222222
7473-111111111111111111111111111111
7474-111111111111111111111111111111
7475-111111111111111111111111111111
7476-111111111111111111111111111111
7477-111111111111111111111111111111
7478-111111111111111111111111111111
7479-111111111111111111111111111111
9297-222222222222222222222222222222
9298-222222222222222222222222222222
7481-111111111111111111111111111111
9300-222222222222222222222222222222
7482-111111111111111111111111111111
9302-222222222222222222222222222222
7484-111111111111111111111111111111

и проверка того, что строка не кэшируется и не записывается в другую позицию в файле:

nas:/storage# grep "9290-" test.txt
9290-111111111111111111111111111111
nas:/storage# 

т.е. отсутствует (среди прочего)

9290-222222222222222222222222222222

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

Изменить: я только заметил, что записи, похоже, блокируют друг друга, т.е. промежутки между номерами строк всегда соответствуют количеству чередующихся записей от другого удаленного «писателя». Я все еще не приблизился к объяснению того, почему это происходит, и к тому, как это решить.

Кроме того, у меня были активны «Discard» и «IO thread» на proxmox для жесткого диска vm, и я отключил эти две опции, но безрезультатно (не думал, что будет, но все же проверил). Поведение такое же.

Хорошо, очевидно, Berkeley DB предлагает механизмы блокировки для одновременного доступа, так что мой «простой тестовый сценарий» неадекватен, поскольку требуется, чтобы блокировка происходила на уровне приложения; мой тестовый скрипт ничего подобного не делает, поэтому тест не соответствует варианту использования.

Следовательно, я считаю, что на этот вопрос ответят. Спасибо за ответы!