Вадим Шашенко, 2ГИС
DESCRIPTION
HighLoad++ 2013TRANSCRIPT
Дорожная сеть в графовой базеданных Neo4jВадим Шашенко
2gis.ru @rnd2gis
Создание карты 2
Для конечных продуктов
→
3
Карта4
С дорожным графом 5
Проверка графа на связность• Существование маршрута между двумя любыми вершинами
• Алгоритм требует обхода всех вершин и всех ребер
• Параметризация проверки (тип транспорта, время)
6
Геометрия дорожной сети 7
Граф дорожной сети
→
8
Фрагмент реального графа 9
Побольше10
Еще побольше 11
Всё вместеВсё покрытие 2ГИС
• 85 городов России (все с нас. более 300 тыс.)
• 3 города Казахстана
• 2 города Украины
• 1 город Италии и Кипра
Ждем новые города с плотной дорожной сетью
12
Характеристики графа• 2.3 млн вершин
• 5.5 млн ребер
• 9 млн атрибутов
Это стартовые данные
13
Проблема
На нашей старой системе проверка связности на Москве:
• Без параметров – 30 минут
• С параметрами – 4-6 часов
14
Проблема
Данных много
Хочется:
• Меньше ожидание пользователя
• Больше rps
Поэтому нам нужна быстрая обработка графа
15
Задача
• Геометрия дорожной сети в реляционной БД
• Проверка на связность
• Делать это быстро
• Частые запуски проверок
• Часто меняющийся граф
16
Решение задачи
VS
17
Решения на RDBMS• Закачать весь граф в память (pgRouting)
• Быстрый обход графа
• Ограничены памятью
• Геометрия в БД меняется
18
Решения на RDBMS• Закачать весь граф в память (pgRouting)
• Быстрый обход графа
• Ограничены памятью
• Геометрия в БД меняется
• Работать в таблице ребер (рекурсивный поиск ребра в таблице)
• Не ограничены памятью
• Очень медленный обход графа
19
Обход графа в таблице 20
Решения на RDBMS• Закачать весь граф в память (pgRouting)
• Быстрый обход графа
• Ограничены памятью
• Геометрия в БД меняется
• Работать в таблице ребер (рекурсивный поиск ребра в таблице)
• Очень медленный обход графа
• Не ограничены памятью
Наша старая система - схожий с RDBMS принцип - 30 минут
21
Решения на NoSQL – графовая базаданных Neo4j
• Загрузили все наши данные
• Потестировали алгоритмы обхода графа
22
Решения на NoSQL – графовая базаданных Neo4j
• Загрузили все наши данные
• Потестировали алгоритмы обхода графа
• Обход графа поиском в глубину – 1 мин
• Проверка связности графа на Москве – 15 секунд
• Проверка связности всего графа – 10 мин
• Не зависит от количества данных в хранилище
23
Проверка на связность Москвы 24
Обход графа RDBMS vs Neo4j
VS
25
Обзор Neo4j• Естественная работа с математическим графом
• Вершины, ребра, атрибуты
• Язык запросов cypher
• Индексы на значения атрибутов
• ACID
• REST API. Веб-админка
• Расширения-плагины
• Open source. Java.
26
Почему именно Neo4j• Самая популярная из графовых баз данных
• Богатый функционал
• Активная разработка
• Живое сообщество
• Готовые сторонние расширения: пространственный индекс, разные
алгоритмы на графе, импортер из csv.
• Коннекторы из множества языков программирования
27
Недостатки Neo4j• Нет горизонтального масштабирования
• Удаление из бд не освобождает место на диске (требуется рестарт)
28
Архитектура нашего решения 29
Возможные оптимизации• Разбиение на подграфы
• Иерархичность
30
Мы довольны• Будем продолжать использовать
• Будем наблюдать за поведением с ростом данных
31
Итог
Есть много данных, которые можно представить графом?
Нужна быстрая работа графовых алгоритмов?
Стоит попробовать Neo4j.
32