2015-06-20 4 views
1

Мы начали с одного монгоба, но у нас нет одной коллекции, выросшей до ~ 300 ГБ. Коллекция содержит объекты, у которых есть поле даты. Но в основном нам просто нужно запросить более поздние объекты, а затем исторические раз. Поэтому мой вопрос: возможно ли очертить эту коллекцию на одном сервере полем даты? Явным образом я хотел бы очертить более свежие объекты на один узел и более старые объекты на другой узел. Вместо равномерного распределения всех объектов на n осколках.MongoDB shard по дате на одной машине

И есть ли учебник о том, как можно очертить существующую единую базу данных (без каких-либо наборов реплик) в осколочном кластере?

+0

... подразумевая, что в какой-то момент «старые» данные будут переноситься с одного сервера на другой? –

+0

Зачем вам это нужно? Вам все равно потребуется указатель на указанное поле даты, если вам нужно получить доступ к более старым значениям ** и **, вы уменьшили бы объем полезной ОЗУ, наложив ненужные накладные расходы. Если вам ** действительно ** не нужны старые данные, просто удалите его или (если вы хотите сохранить драгоценную память, но сохраните старые данные) переместите ее в коллекцию с меньшим количеством индексов –

+0

@Markus W Mahlberg обычная поведение заключается в том, что в индексе используются только индексы. поэтому, поскольку мы обычно запрашиваем новые данные, новый индекс находится в ram. да, когда есть запрос на широкий диапазон, у нас есть конкурс ресурсов, но это происходит, возможно, два раза в неделю. – KIC

ответ

1

Технически вам не нужно очертить свой контент и просто нужно индексировать свое поле. Да, вы можете создать индекс на поле даты и будет соблюден, который вы можете увидеть, посетив план запроса db.collection.explain («executionStats»)

Однако Выбор ключа осколка очень важно. Есть несколько вещей, которые следует учитывать при выборе осколок ключа

- Write scaling (high cardinality, Randomization) 
- Query Isolation. (read) 

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

http://docs.mongodb.org/manual/core/sharding-shard-key/ Содержимое из приведенной выше ссылки .. «MongoDB генерирует ObjectId значения при создании документа для получения уникального идентификатора для объекта. Тем не менее, наиболее значимые биты данных в этом значении представляет собой метку времени, что означает, что они увеличиваются в регулярном и предсказуемом шаблоне.Хотя это значение имеет высокую мощность, при использовании любой даты или другого монотонно увеличивающегося числа в качестве ключа осколка все операции вставки будут хранить данные в один кусок, и, следовательно, единый осколок. В результате емкость записи этого осколка определит эффективную емкость записи кластера ».

+0

У нас есть указатель на поле даты, но он скоро не подходит для использования в ram. Но 90% запросов - это более свежие данные, и только несколько запросов проходят через широкий исторический диапазон. sharding также должен разбить индекс, и поскольку «исторический» узел не будет часто запрашивать запросы, узел не будет удерживать индекс в ram навсегда и освободить ресурсы для более позднего узла (надеюсь). – KIC

+0

Я сомневаюсь, что в осколочном кластере в ОЗУ будет загружена только часть индекса. Индексы всегда находятся в ОЗУ, независимо от того, к какому шагу относится ваш запрос. Почему бы вам не сделать ни одну из этих двух вещей. 1) используйте горизонтальное масштабирование и увеличивайте количество машин (что, я думаю, не может помочь в случае временного поля) 2) подумайте об удалении старых и избыточных записей. –

1

Из вашего описания это звучит так, как будто вам может не понадобиться оштукатурить, а скорее просто разделить большую коллекцию на более мелкие, по дате. Таким образом, живая коллекция содержит только последние данные, а старые данные периодически перемещаются в свою собственную коллекцию архивов. Это будет работать, если вы не будете запрашивать новые и старые данные вместе.

+0

Это будет план b, но поскольку у нас есть запросы по всем диапазонам (только не очень часто), это не самый предпочтительный способ. – KIC

Смежные вопросы