#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, чтобы он повторял запросы в окне консоли, и я увидел, что запросы повторяются в окнах обоих вторичных устройств.