Исключение "ожидание истекло время ожидания репликации" для операции массовой записи MongoDB - PullRequest
0 голосов
/ 20 марта 2019

У нас есть два сервера для серверов MongoDB, один является основным, другой настроен как реплика.

Мы используем PHP для массовой записи списка обновлений MongoDB.Из журналов сервера мы делаем небольшое количество исключений «ожидания истечения времени ожидания репликации» в журналах нашего сервера.

  1. В чем может быть причина исключения?Сеть между двумя серверами стабильна.
  2. Когда мы получаем исключение «ожидание истекло время ожидания репликации», мы можем предположить, что операция «Массовая запись» успешно обновила целевые документы на первичном сервере?

Основная часть записи PHP-кодов:

 try {
            $manager = new MongoDB\Driver\Manager("mongodb://" . DB_HOST);
            $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 10000);
            $result = $manager->executeBulkWrite($DBName . '.' . $collection, $bulk, $writeConcern);
            return $result;
        } catch (Exception $ee) {
            AppendToLogFile(ERROR_Internal_Error, 'Script:' . __FILE__ . ', LINE:' . __LINE__ . ',$ee:' . $ee->getMessage());
            continue;
        }

Спасибо!

1 Ответ

1 голос
/ 20 марта 2019

В соответствии с вашим кодом, вы упомянули проблему записи как Majority, а ваша реплика состоит из двух элементов, поэтому большинство будет равно 2. Также вы упомянули значение wtimeout как 10000 мс (10 секунд). Таким образом, ожидается, что все записи должны быть реплицированы с первичного на вторичный в течение 10 секунд, в противном случае система вернет сообщение об ошибке, говорящее waiting for replication timed out.

Отвечая на ваш второй вопрос, да, документы будут успешно обновлены на первичном сервере, сообщение предназначено только для того документа, который не был реплицирован на вторичный сервер в указанный wtimeout раз в мс.

...