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

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

Одна виртуальная машина (KVM), на которой запущен "Сервер Ubuntu 16.04 минимальная виртуальная машина", настроена со вторым "жестким диском" , настроить как однодисковое «хранилище» пула 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, и отключил эти две опции безрезультатно (не думал, что будет, но все же проверил). Поведение такое же.

3
задан 6 March 2017 в 15:05
1 ответ

Хорошо, по-видимому, БД Беркли предлагает механизмы блокировки для одновременного доступа, поэтому мой "простой тестовый сценарий" неадекватен в том, что блокировка должна происходить на уровне приложения; мой тестовый сценарий ничего подобного не делает, поэтому тест не соответствует случаю использования.

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

3
ответ дан 3 December 2019 в 06:28

Теги

Похожие вопросы