Кассандра или 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, чтобы справиться с объемом записи. Разделение по идентификатору устройства может быть хорошим способом справиться с объемом записи. Если вас интересует близость событий, то может быть более уместным использование шардинга по широте / долготе.
Джек