Как набор реплик mongodb работает с nodejs -mon goose? - PullRequest
0 голосов
/ 03 мая 2020

Используется 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, который соответствует вторичному узлу, запрос будет перенаправлен на вторичный узел? мое понимание правильное или неправильное? (если мое понимание правильное, это вызовет другой набор вопросов)

: |

Я мог пропустить много деталей при чтении документов. Это моя последняя надежда на получение ответов. Поэтому, пожалуйста, поделитесь, если вы знаете ответы на любые из них.

1 Ответ

1 голос
/ 03 мая 2020

, если это так, то как mon goose узнает, какой ip является primaryReplicaset?

Не существует "набора первичных реплик", однако может быть первичный в наборе реплик.

Каждый драйвер MongoDB запрашивает все хосты, указанные в строке соединения, чтобы обнаружить членов набора реплик (в случае, если один или несколько хостов недоступны для по любой причине). Когда любой член набора реплик отвечает, он делает это с полным списком текущих членов набора реплик. Затем драйвер знает, какие члены набора реплик и какие из них в настоящее время являются первичными (если они есть).

вторичная реплика не может обслуживать запросы чтения

Это совсем не так правда. Любой несущий данные узел может выполнить запросы на чтение, ЕСЛИ приложение предоставило подходящее предпочтение чтения .

В этом случае mon goose инициирует первый URI (167,99 .21.9: 12017) и этот экземпляр будет перенаправлен на primaryReplicaset или возврат запроса к mon goose, а затем mon goose вызовет другой запрос к 167.99.21.9:12019?

mon goose напрямую не обращается к базе данных. Для этого используется драйвер (драйвер узла для MongoDB). Драйвер имеет подключения ко всем членам набора реплик и отправляет запросы соответствующему узлу.

Например, если вы указали первичное предпочтение чтения, драйвер отправит этот запрос в первичный, если таковой существует. Если вы указали предпочтение чтения вторичного файла, драйвер отправит этот запрос вторичному серверу, если он существует.

Я предполагаю, что когда оба экземпляра 167.99.21.9:12017 и 167.99.21.9:12019 доступно для запросов на чтение с помощью ReadPreference.SecondaryPreferred или ReadPreference.nearest

Правильно, любой узел может их выполнить.

нагрузка может быть распределена по

Да и нет. В общем случае реплики могут иметь устаревшие данные. Если вам нужны текущие данные, вы должны прочитать с первичного. Если вам не нужны текущие данные, вы можете читать из вторичных.

, как заставить его сбалансировать нагрузку?

Вы можете сделать ваше приложение , чтобы сбалансировать нагрузку с помощью вторичного или ближайшего чтения, при условии, что ваше приложение может получать устаревшие данные.

если mon goose инициирует запрос к primaryReplica, а primaryReplica засыпается запросами на чтение / запись, а primaryReplica свободен (ничего не делает), то mongodb автоматически перенаправит запрос на primaryReplica?

Нет, первичное чтение не будет изменено на вторичное чтение.

Особенно в описываемом вами сценарии вторичное чтение, вероятно, устарело, поэтому вторичное чтение может привести к неправильным результатам.

может пн goose автоматически узнать, какая реплика бесплатна?

mon goose не отслеживает состояние развертывания, за это отвечает драйвер. Драйверы имеют ограниченную поддержку для выбора «менее загруженного» узла, хотя это измеряется на основе задержки сети, а не загрузки процессора / памяти / диска и применяется только к предпочтению ближайшего чтения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...