Подтвердить что ты не робот

Понять систему MongoDB

Это основной вопрос, но очень важный, и я не уверен, чтобы действительно понять суть.

В официальной документации мы можем прочитать

MongoDB хранит все последние использованные данные в ОЗУ. Если вы создали индексы для своих запросов и ваш рабочий набор данных помещается в ОЗУ, MongoDB обслуживает все запросы из памяти.

Часть, которую я точно не понимаю,

Если вы создали индексы для своих запросов и ваш рабочий набор данных помещается в ОЗУ

что здесь означает "индексы"?

Например, если я обновляю модель, я запрашиваю ее, потому что я ее обновил, теперь она в ОЗУ, поэтому она будет поступать из памяти, но это не очень понятно.

Как мы можем быть уверены, что данные, которые мы запрашиваем, будут поступать из памяти или нет? Я понимаю, что MongoDB использует свободную память для кэширования данных о свободной памяти, но кто-то может объяснить дальнейшее глобальное поведение?

В этом случае лучше было бы использовать переменную на нашем сервере node, которая хранит данные, чем доверяет системе кэша MongoDB?

Как вы глобально советуете использовать MongoDB для огромного трафика?

4b9b3361

Ответ 1

Примечание: это было написано еще в 2013 году, когда MongoDB был еще довольно молод, у него не было функций, которые он имеет сегодня, хотя этот ответ по-прежнему остается верным для mmap, он не относится к другим технологиям хранения, которые теперь реализует MongoDB, такие как WiredTiger или Percona.


Хорошее место, чтобы начать точно понимать, что такое индекс: http://docs.mongodb.org/manual/core/indexes/

Однако после того, как вы разберетесь с этим, вы поймете, почему они так хороши, и перейдем к некоторым более сложным вопросам.

Как мы можем быть уверены, что данные, которые мы запрашиваем, будут получены из памяти или нет?

Один из способов - посмотреть на поле yields в любом запросе explain(). Это скажет вам, сколько раз считыватель выдал свою блокировку, потому что данные не были в ОЗУ.

Еще один более глубокий способ - взглянуть на такие программы, как mongostat и другие подобные программы. Эти программы сообщат вам о том, какие сбои страниц (когда данные должны быть выгружены в ОЗУ с диска) происходят на вашем mongod.

Я понимаю, что MongoDB использует свободную память для кэширования данных о памяти, которая свободна в данный момент, но может ли кто-нибудь объяснить дальнейшее глобальное поведение?

Это на самом деле неверно. Проще сказать, что MongoDB делает это, но на самом деле это не так. Это на самом деле ОС и ее собственные алгоритмы подкачки, обычно LRU, которые делают это для MongoDB. MongoDB выполняет кеширование планов индексов в течение определенного периода времени, так что ему не нужно постоянно продолжать проверку и тестирование индексов.

В каком случае может быть лучше использовать переменную на нашем сервере узлов, которая хранит данные, чем доверять кеш-системе MongoDB?

Не уверен, как вы ожидаете, что это сработает... Я имею в виду, что эти два делают совершенно разные вещи, и если вы собираетесь читать ваши данные из MongoDB в ваше приложение при запуске в эту переменную, то я определенно не рекомендую это.

Кроме того, алгоритмы ОС для управления памятью чрезвычайно развиты и быстры, так что все в порядке.

Как вы в целом советуете использовать MongoDB для огромного трафика?

Хм, это такой огромный вопрос. На самом деле, я бы порекомендовал вам Google немного в этой теме, но, как указано в документации, вам нужно убедиться, что ваш рабочий набор вписывается в ОЗУ на один.

Вот хорошая отправная точка: Что означает "рабочий набор"? в оперативную память для MongoDB?

Ответ 2

MongoDB пытается сохранить целые коллекции в памяти: он отображает карту на каждую страницу коллекции. Для того чтобы все было в памяти, как страницы данных, так и индексы, которые ссылаются на них, должны храниться в памяти.

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

MongoDB не хранит "кеш" записей так же, как, скажем, веб-браузер. Когда вы совершаете изменения, обновляются как память, так и диск.

Монго отлично подходит для соответствующих случаев использования. Это очень высокая производительность, если у вас достаточно памяти сервера для кэширования всего и быстро уменьшается за этот момент. Многие, многие веб-сайты большого объема используют MongoDB: хорошо, что память настолько дешевая, теперь.

Ответ 3

Таким образом, в идеальном случае было бы три узла MongoDB, в основном 2 в Prod и 1 в DR. Нужна ясность в следующих сценариях: - (для сценариев без разделения) 1. Если для транзакции обновления, если один узел обновляется, то, если моя следующая транзакция чтения перейдет к другому узлу, он не получит обновленные значения, верно? 2. Если я настроил ядро базы данных в памяти на одной реплике и не настроил на других, что произойдет с описанным выше сценарием? Как в одной записи на одном узле (в памяти включен один) и читать на других узлах?