Мое приложение использует MongoDB в качестве базы данных. Мы ожидаем 20K + одновременных подключений к кластеру mongodb. Как мне настроить сервер, если я хочу запустить mongodb на 20 серверах и расщепить кластер 20 способами?
Вот что я сделал до сих пор:
На каждом из моих 20 серверов у меня есть один mongo (маршрутизатор), работающий на порту 30000, и на 3 серверах я запускаю серверы mongo config на порту 20000. Затем на каждом сервере я запускаю 3 экземпляра mongod. Один из основных. Другими словами, у меня 20 mongo, 3 mongo-config, 60 mongod-серверов (20 основных и 40 реплик).
Затем в моем приложении (которое также запускается на каждом сервере и подключается к localhost: 30000 mongos) я установил параметры mongoOptions так, чтобы connectionsPerHost = 1000.
Через 10-15 минут после запуска всех служб некоторые из них перестали работать с ssh. Эти серверы по-прежнему могут пинговать. Я подозреваю, что было слишком много соединений, и это привело к смерти сервера.
Мой собственный анализ выглядит следующим образом:
1K соединений на пул соединений означает для каждого основного сегмента, у него будет 1K * 20 (сегменты) = 20K открытых соединений одновременно. Возможно, на нескольких серверах будет работать более одного основного сервера, что удвоит или утроит количество подключений до 60 КБ. Так или иначе, mongod не может обрабатывать эти многочисленные соединения, хотя я изменил настройки системы, чтобы каждый процесс мог открывать гораздо больше файлов.
Вот что показывает «ulimit -a»:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64000000
max memory size (kbytes, -m) unlimited
open files (-n) 320000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Кстати, я не указал --maxConns при запуске mongod / mongos, я также не изменил MONGO.POOLSIZE.
Дополнительный вопрос: если мои рассуждения верны, то на каждом первичном сервере будет выставлено общее количество требований одновременного подключения, что мне кажется неправильным, это почти означает, что кластер mongodb вообще не масштабируется. Кто-то скажет мне, что я не прав, пожалуйста?