MongoDB не распределяет операции чтения в наборе реплик

#mongodb

#mongodb

Вопрос:

У нас есть три сервера в наборе реплик. Для примера, ServerA является основным, в то время как ServerB и ServerC являются вторичными. Во время стресс-тестирования среды загрузка сервера на ServerA выросла примерно до 4,00, в то время как вторичные серверы остаются на уровне 0,00. Целевые URL-адреса стресс-тестирования не выполняют никаких операций записи в mongo, но, похоже, операции чтения не распространяются на вторичные устройства.

Мы используем официальный драйвер C #.

Журнал сервера показывает множество открытых подключений, записи набора lsn и кучу команд «killcursors» — очевидно, что он работает для обслуживания страниц. Однако ServerB и ServerC отображают только начальные соединения с веб-серверов (их четыре), и после этого в журналах появляются только записи «lsn set». Через несколько минут истекает время ожидания начальных четырех подключений и они закрываются.

Набор реплик находится в полном рабочем состоянии. Я могу остановить mongo на первичном, и вторичные пользователи правильно выберут новый первичный.

Наша строка подключения из Web.config:

 <connectionStrings>
    <add name="wellness.mongodb" connectionString="mongodb://serverA:27017,serverB:27017,serverC:27017/mydatabase?safe=true;replicaset=myreplicaset;slaveok=true" />
</connectionStrings>
  

Что мы делаем не так?

Комментарии:

1. Какую именно версию официального драйвера C # вы используете?

2. обязательно ли указывать slaveOk?

Ответ №1:

Строка подключения выглядит нормально. Я попытаюсь воспроизвести и сообщить об этом.

Комментарии:

1. Если вы использовали последнюю версию драйвера C # из главной ветки на github, я обнаружил ошибку, из-за которой все операции чтения отправлялись на один и тот же сервер. Исправление было отправлено на github. Если вы использовали версию v1.0, то мне нужно провести дальнейшее расследование.

2. Мы использовали версию v1.0, но мы попробуем последнюю версию с github. Я вскоре свяжусь с вами.

3. Когда я тестировал с драйвером версии v1.0, я видел, что операции чтения распределяются между вторичными устройствами правильно. Ошибка была только при использовании последнего исходного кода драйвера с github (сейчас исправлена).

4. Если операции чтения распространяются с драйвером версии v1.0, каков наилучший способ подтвердить это? Может быть, я неправильно понимаю журналы?

5. Я подтвердил это двумя способами: Я установил точку останова в драйвере, где происходит чтение, и проверил, на какой сервер направлялось чтение. В моем случае у меня было два вторичных, поэтому операции чтения чередовались между ними. Я также запустил mongod с флагами -vvvv, чтобы он повторял запросы в окне консоли, и я увидел, что запросы повторяются в окнах обоих вторичных устройств.