Я запускаю кластер 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, и отключил эти две опции безрезультатно (не думал, что будет, но все же проверил). Поведение такое же.
Хорошо, по-видимому, БД Беркли предлагает механизмы блокировки для одновременного доступа, поэтому мой "простой тестовый сценарий" неадекватен в том, что блокировка должна происходить на уровне приложения; мой тестовый сценарий ничего подобного не делает, поэтому тест не соответствует случаю использования.
Следовательно, я рассматриваю этот вопрос как ответ на поставленный вопрос. Спасибо за ответы!