Используется Techstack nodejs, пн goose, mongodb
Я работаю над продуктом, который обрабатывает множество запросов DB. В начале каждого месяца количество запросов в БД велико из-за большого количества запросов на чтение / запись (массовая обработка данных). Количество записей в каждой коллекции, предназначенных для обслуживания этих запросов на чтение / запись, достаточно велико. Чтение велико, но запись не так высока.
Таким образом, загрузка ЦП в экземпляре, в котором работает mongodb, достигает опасной зоны (выше 90%) в это время. Единственное, что помогает мне пережить это время - это HOPE
(да, надеюсь, что этот экземпляр не обработает sh).
Вместо масштабирования по вертикали, я ищу решения для масштабирования по горизонтали (не революционная мысль). я посмотрел на replicaset
и sharding
. Этот вопрос относится только к replicaSet.
Я просмотрел документы и чувствую, что понимание, которое у меня есть по replicaset
, на самом деле не совсем так, как могло бы работать.
Я настроил свой репликационный набор с приведенной ниже конфигурацией. я просто хочу добавить еще один экземпляр, потому что согласно пониманию, которое у меня есть сейчас, если я добавлю еще один экземпляр, тогда моя база данных сможет обрабатывать больше запросов на чтение, распределяя нагрузку, которая может минимизировать cpuUtilization по крайней мере на 30% на primaryNode. это понимание правильное или неправильное? Пожалуйста, поделитесь своими мыслями
var configuration = {
_id : "testReplicaDB",
members:[
{_id:0,host:"localhost:12017"},
{_id:1,host:"localhost:12018",arbiterOnly:true,buildIndexes:false},
{_id:2,host:"localhost:12019"}
]
}
Когда я поднял репликацию с помощью вышеуказанного конфига и запустил мой код nodejs -mon goose, я столкнулся с этой проблемой . Решение, которое они предлагают, состоит в том, чтобы изменить вышеуказанный конфиг на
var configuration = {
_id : "testReplicaDB",
members:[
{_id:0,host:"validdomain.com:12017"},
{_id:1,host:"validdomain.com:12018",arbiterOnly:true,buildIndexes:false},
{_id:2,host:"validdomain.com:12019"}
]
}
Вопрос 1 (связанный с кодированием, написанным в nodejsproject с библиотекой mon goose (для обработки db), которая подключается к the replicaSet)
const URI = mongodb://167.99.21.9:12017,167.99.21.9:12019/${DB};
я должен указать оба URI моих экземпляров mongodb в mongoose connection URI String
.
Когда я смотрю на мой код nodejs-mongoose
, который будет подключиться к replicaSet, у меня много сомнений в том, как он может обрабатывать множественный узел.
Как mongoose
узнает, какой ip является первичным узлом?
Предположим, что 167.99.21.9:12019
является primaryNode и rs.slaveOk(false)
для secondReplica, поэтому вторичныйNode не может обслуживать readRequests.
В этом случае mongoose
вызывает первый uri (167.99.21.9:12017
) и этот экземпляр будет перенаправлять на primaryNode или запрос вернется к mon goose, а затем mon goose вызовет другой запрос к 167.99.21.9:12019
?
Вопрос 2
В этом документе docLink упоминается, что избыточность данных позволяет обрабатывать запросы на чтение большого объема. Предположим, что чтение включено для secondNode, и
- Предположим, что случай, когда mon goose инициирует запрос к primaryNode, и primaryNode в это время подвергался бомбардировке с запросами на чтение / запись, но вторичный узел свободен (ничего не делая), тогда mongodb автоматически перенаправит запрос на вторичный узел или этот запрос не будет выполнен и перенаправит обратно в пн goose, так что нагрузка будет на пн goose, чтобы инициировать другой запрос к следующему доступному узлу?
- может пн goose автоматически узнать, какой узел в наборе реплики свободен?
Вопрос 3
Предполагается, что оба экземпляра 167.99.21.9:12017
и 167.99.21.9:12019
доступны для запросов на чтение с ReadPreference.SecondaryPreferred
или ReadPreference.nearest
, будет ли загрузка распространяться, когда вторичный узел подвергается бомбардировке с использованием readRequests, а первичный узел подобен использованию на 20%? это тот случай? или мое понимание неверно? Может ли replicaSet выступать в качестве балансировщика нагрузки? если нет, как заставить его сбалансировать нагрузку?
Вопрос 4
var configuration = {
_id : "testReplicaDB",
members:[
{_id:0,host:"validdomain.com:12017"},
{_id:1,host:"validdomain.com:12018",arbiterOnly:true,buildIndexes:false},
{_id:2,host:"validdomain.com:12019"}
]
}
Вы можете увидеть имя DNS в конфигурации, означает ли это, что, когда primaryNode перенаправляет запрос на вторичный узел, происходит разрешение DNS, а затем, используя тот IP, который соответствует вторичному узлу, запрос будет перенаправлен на вторичный узел? мое понимание правильное или неправильное? (если мое понимание правильное, это вызовет другой набор вопросов)
: |
Я мог пропустить много деталей при чтении документов. Это моя последняя надежда на получение ответов. Поэтому, пожалуйста, поделитесь, если вы знаете ответы на любые из них.