Вместо того, чтобы использовать команду для всех членов набора реплик, чтобы выяснить, какой из них является текущим основным, следует использовать строку подключения набора реплик в командной строке mongo
. При желании вы можете включить учетные данные имени пользователя и пароля в строку подключения вместо использования отдельных параметров командной строки.
Пример использования оболочки MongoDB 3.6.3:
mongo "mongodb://USERNAME:PASSWORD@mngdb-cbt-stg-01:27058,mngdb-cbt-stg-02:27058/DATABASE?replicaSet=cdt_prod_playground" --eval "db.${file%.*}.remove({})"
Вам не нужно перечислять все элементы вашего набора реплик в строке подключения. Я использовал два в своем примере выше, так как это должно гарантировать обнаружение основного в наборе реплик из трех участников (, которому требуется 2/3 членов с правом голоса, доступных для обслуживания основного ). Драйвер/клиент определит текущие элементы, если вы включите имя replicaSet
в строку подключения и хотя бы один из элементов в строке подключения исправен.
См. Формат URI строки подключения для справки о доступных параметрах.
Также обратите внимание, что вызов db.collection.remove({})
приведет к удалению отдельных документов при сохранении определений индекса. Если вам нужно удалить значительный объем данных коллекции, будет быстрее вызвать db.colellection.drop()
и воссоздать все необходимые индексы.
The reason is I need to do this is because I don't know which host is the replica set PRIMARY, so I just have to test it brute force, because I don't have the authorization to run rs.status()
Если вам нужно определить текущий первичный сервер программно, вы можете использовать командуisMaster
. Эта команда используется драйверами и клиентами MongoDB (, такими как оболочка mongo
), как часть начального согласования соединения. При подключении к члену набора реплик вывод isMaster
включает primary
и другие сведения о текущем состоянии набора реплик .
Как и в MongoDB 3.6, команда isMaster
не требует аутентификации, поскольку она используется для предоставления информации, необходимой драйверам/клиентам для обнаружения сервера и согласования аутентифицированного соединения.
если вы используете сервер httpd, то у вас есть журнал http, это может помочь вам с вашим запросом (есть дополнительный мод для мода Apache _dumpio может обеспечить лучшую обратную связь ), и Я предлагаю вам запустить эту команду по запросу, чтобы лучше узнать, что в настоящее время запрашивает http на вашем сервере
# tcpdump filter for HTTP GET
sudo tcpdump -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
# tcpdump filter for HTTP POST
sudo tcpdump -s 0 -A 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
# tcpdump for specific client
tcpdump -vvvnn port 80 and host ip_addr_of_client -i any