Я экспериментирую с использованием 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