MongoDB не использует доступную память

359
Pumices

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

Настройка

В настоящее время в моем кластере 4 машины, и все они имеют одинаковые характеристики (2 x 8-Core Xeon E5-2667 при 3,5 ГГц, 512 ГБ оперативной памяти, сеть Infiniband 100 Гбит / с). Я использую 1 машину в качестве моего «клиента», а остальные три - в качестве кластера mongodb. Я использую docker-контейнер mongodb на всех компьютерах кластера. Одной из возможных проблем является тот факт, что на машинах нет локально подключенного хранилища, все их хранилище предоставляется через Ceph через Infiniband со скоростью 100 Гбит / с.

Я немного обманул и установил маршрутизатор и сервер конфигурации на той же машине, что и первый узел mongodb, на двух других машинах просто есть узел mongodb. Поскольку данные уже реплицированы через Ceph, я решил разделить базу данных и настроить каждый узел как сегмент с набором репликации, в каждом из которых по 1 машине. (Возможно, это часть моей проблемы, но она имела смысл для меня)

Я должен также упомянуть, что все мои запросы / вставки выполняются клиентом с использованием pymongo.

Данные

Набор данных, который у меня есть, представляет собой набор данных временных рядов, в данных вообще нет связей, поэтому он кажется идеальным для БД типа no-sql. Я только пытаюсь вставить часть данных, около 550 точек данных за шаг по времени и около 600 миллионов шагов по времени. Я разбил базу данных на области, в которых данные разбиты на 86 000 сегментов, поэтому я решил, что это хороший выбор.

У меня не было проблем с вставкой данных, база данных не была узким местом, ограничивающим фактором было то, насколько быстро мой клиент смог обработать существующие файлы данных (они в настоящее время находятся в csvs).

Проблема

После того, как я вставил все документы, размер базы данных составил около 1,4 ТБ. Между этими 3 узлами у меня есть 1,5 ТБ памяти, но с накладными расходами, контейнерами докеров и т. Д. Я не ожидал, что весь набор данных поместится в памяти, но он должен был быть близок. Тем не менее, когда я смотрю на узлы, каждый из них использует от 100 до 150 ГБ памяти. Так что это кажется мне неправильным, я думал, что Монго поместит столько памяти в память. Я не установил лимит ресурсов на монго или докер.

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

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

Что я нахожу странным, так это то, что когда я смотрю на узлы Монго, работает только одно ядро, может быть, примерно на 50% нагрузки, память по-прежнему в основном пуста, а сеть почти не используется (~ 10 Мбит / с, что заставляет меня поверить что Сеф не является узким местом).

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

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

Файлы конфигурации

Вот докер, который создает файлы, которые я использую для каждого из узлов.

Узел 1:

version: '3' services: mongosn1: container_name: mongosn1 image: mongo hostname: snode1 extra_hosts: - "snode1:10.0.2.107" - "snode2:10.0.2.108" - "snode3:10.0.2.109" - "cfgnode1:10.0.2.107" - "rtnode1:10.0.2.107" command: mongod --shardsvr --replSet mongors1 --dbpath /data/db --port 27019 --smallfiles ports: - "27019:27019" expose: - "27019" volumes: - /mnt/work/db/mongo/data/shard1:/data/db - /etc/localtime:/etc/localtime:ro mongocfg1: container_name: mongocfg1 image: mongo hostname: cfgnode1 extra_hosts: - "snode1:10.0.2.107" - "snode2:10.0.2.108" - "snode3:10.0.2.109" - "cfgnode1:10.0.2.107" - "rtnode1:10.0.2.107" command: mongod --configsvr --replSet mongors1conf --dbpath /data/db -- port 27018 --smallfiles ports: - "27018:27018" expose: - "27018" volumes: - /etc/localtime:/etc/localtime:ro - /mnt/work/db/mongo/data/config1:/data/db  mongort1: container_name: mongort1 image: mongo  hostname: rtnode1 depends_on: - mongocfg1 extra_hosts: - "snode1:10.0.2.107" - "snode2:10.0.2.108" - "snode3:10.0.2.109" - "cfgnode1:10.0.2.107" - "rtnode1:10.0.2.107" command: mongos --configdb mongors1conf/cfgnode1:27018 --port 27017 -- bind_ip 0.0.0.0 ports: - "27017:27017" expose: - "27017" volumes: - /etc/localtime:/etc/localtime:ro 

Узел 2:

version: '3' services: mongosn1: container_name: mongo image: mongo hostname: snode2 extra_hosts: - "snode1:10.0.2.107" - "snode2:10.0.2.108" - "snode3:10.0.2.109" - "cfgnode1:10.0.2.107" - "rtnode1:10.0.2.107" command: mongod --shardsvr --replSet mongors2 --dbpath /data/db --port 27017 --smallfiles ports: - "27017:27017" volumes: - /mnt/work/db/mongo/data/shard2:/data/db - /etc/localtime:/etc/localtime:ro  

Узел 3:

version: '3' services: mongosn1: container_name: mongo image: mongo hostname: snode3 extra_hosts: - "snode1:10.0.2.107" - "snode2:10.0.2.108" - "snode3:10.0.2.109" - "cfgnode1:10.0.2.107" - "rtnode1:10.0.2.107" command: mongod --shardsvr --replSet mongors3 --dbpath /data/db --port 27017 --smallfiles ports: - "27017:27017" volumes: - /mnt/work/db/mongo/data/shard3:/data/db - /etc/localtime:/etc/localtime:ro  
0
Может быть, этот вопрос предназначен для получения лучших ответов на сайтах stackOverflow или dba Alfabravo 5 лет назад 1
@ Alfabravo Да, я разместил это на SO изначально, и кто-то там предложил мне опубликовать это здесь. Думаю, я хеджирую свои ставки. Pumices 5 лет назад 0

0 ответов на вопрос

Похожие вопросы