MongoDB не использует доступную память - PullRequest
0 голосов
/ 27 ноября 2018

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

Настройка

В настоящее время в моем кластере 4 машины, и все они имеют одинаковые спецификации (2 x 8-ядерный 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 ТБ памяти, но с накладными расходами, контейнерами Docker и т. Д. Я не ожидал, что весь набор данных поместится в памяти, но он должен был быть близким.Однако, когда я смотрю на узлы, каждый из них использует где-то от 100 до 150 ГБ памяти.Так что мне это кажется неправильным, я думал, что Монго поместит столько памяти в память.Я не установил никаких ограничений на ресурсы для mongo или docker.

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

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

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

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

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

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

Узел 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...