Кассандра или MongoDB для нашего приложения на основе местоположения

Мы рассматриваем использование системы баз данных NoSQL для большого проекта. В настоящее время мы немного читали о MongoDB и Cassandra, хотя у нас нет абсолютно никакого опыта с ними. Мы очень хорошо разбираемся в традиционных реляционных базах данных, таких как MySQL и Microsoft SQL, но NoSQL (хранилище ключей / значений) является для нас новой парадигмой.

Итак, какую базу данных NoSQL вы, ребята, рекомендуете для нашего использования?

Мы делаем тяжелые записи и чтения. В основном у нас есть десятки тысяч устройств, которые сообщают:

device_id (int), широта (десятичная), долгота (десятичная), дата / время (datetime), заголовок char(2), скорость (int)

Каждую минуту. Таким образом, в пиковые периоды нам необходимо обрабатывать сотни записей в секунду.

Кроме того, у нас также есть пользователи, которые запрашивают эту информацию в форме, передают мне все сообщения от device_id 1234 за последний день или последнюю неделю. Кроме того, пользователи делают другие запросы, например, дают мне все сообщения от device_1234, где скорость больше 50, а дата сегодня.

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

Документ или значение в MongoDB или Cassandra для нас может выглядеть следующим образом:

{
   device_id: 1234,
   location: [-118.12719739973545, 33.859012351859946],
   datetime: 1282274060,
   heading: "N",
   speed: 34
}

Какую систему вы, ребята, рекомендуете? Большое спасибо

5 ответов

Решение

MongoDB имеет встроенную поддержку геопространственных индексов: http://www.mongodb.org/display/DOCS/Geospatial+Indexing

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

db.devices.find({location: {$near: [-118.12719739973545, 33.859012351859946]}}).limit(10)

У меня есть сообщение о приложении, основанном на местоположении, с использованием MongoDB, как и то, что вы описали. MongoDB, с его сильной поддержкой запросов и индексов, может сделать его лучшим выбором для вас. Как и в Cassandra, MongoDB имеет разделение и репликацию для масштабирования операций чтения и записи. Их базовая архитектура сильно отличается.

Хотя вы не упомянули какие-либо запросы на основе местоположения, если вас интересуют такие запросы, как "дать мне все устройства в радиусе r от местоположения l и между моментами времени t1 и t2", вы найдете геопространственный запрос и индексацию MongoDB чрезвычайно полезным.

Перейти с mongodb для поиска географического местоположения. В версии 2.4 улучшены основные гео-функции. Многие крупные сайты используют его для поиска геолокации.

Вы можете рассмотреть возможность использования ElasticSearch. ES сохраняет JSON исходного документа вместе со всеми проиндексированными полями. JSON может быть создан в любых переменных / аргументах любого современного языка. В Java можно даже отключить это и сохранить данные постоянного хранения Java в поле. После поиска, просто выполните цикл и создайте экземпляр коллекции исходных типов объектов.

Использование поиска Elastics дает вам индексы Trie для высокоскоростных индексов числового диапазона, очевидно, вы получаете полнотекстовый поиск по каждому виду и запросы с географическими ограничивающими рамками, все в фильтрах И или ИЛИ. Поиск по дате также является нативным (хотя обработка дат в Java - отстой, поэтому я переключился на БОЛЬШИЕ INT представления временных меток для представления дат)

НРАВИТСЯ некоторые прошлые и, возможно, настоящие решения NoSQL, географическая индексация и запросы являются частью любого запроса, и никаких дополнительных шагов не требуется. IE, одно из решений MongoDB в недавнем прошлом требовало геопространственного поиска для сбора соответствующих идентификаторов документов, затем вы использовали эти идентификаторы в другом запросе и искали в них другие критерии. В действительности, это то, что происходит во всех решениях в любом случае, но это гораздо быстрее и кэшируется в ElasticSearch.

Я проделал некоторую работу с mongodb и геопространственными данными, но не в масштабе, упомянутом выше. Геопространственный поиск очень быстрый, намного больше, чем MySQL.

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

Джек

Другие вопросы по тегам