Раздел 39 · Neo4j и графовые базы

Масштабирование, кластеры и применения

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Книжный клуб помещается в песочницу браузера. Социальная сеть на сто миллионов человек не помещается и на один сервер без подготовки. В этом уроке обзор без глубоких деталей: как Neo4j растёт вверх и вширь, что даёт кластер, почему граф так трудно поделить между серверами и где графовые базы работают в жизни. С похожими вопросами для документной базы мы встречались в уроке про шардирование MongoDB.

Сначала вверх

Первый и самый дешёвый шаг это вертикальное масштабирование: больше памяти и быстрее диски на одном сервере. Для Neo4j особенно важна память. Сервер держит часто нужные куски хранилища в кэше страниц. Если весь граф помещается туда, обход по связям почти не касается диска и работает очень быстро. Поэтому первый вопрос при росте нагрузки звучит так: «помещается ли граф в память?».

Community Edition умеет только этот путь: один сервер, одна пользовательская база.

Кластер: копии для надёжности и чтения

Enterprise Edition умеет собирать серверы в кластер. У каждой базы в кластере есть копии двух ролей:

  • primary. Участвуют в записи. Одна из них в каждый момент назначена писателем: она принимает запись и не подтверждает фиксацию, пока большинство primary не получили данные. Чтобы пережить отказ одного сервера и продолжать запись, нужно минимум три primary.
  • secondary. Получают изменения асинхронно и обслуживают чтение. Их добавляют, когда чтений много, а записей мало.

Драйвер с адресом neo4j:// из урока про драйверы знает о ролях: запись он отправит писателю, чтение распределит по копиям. А чтобы приложение после записи гарантированно прочитало своё же изменение даже с отстающей копии, драйвер передаёт закладку о последней транзакции.

Важная мысль: кластер копирует граф целиком на каждый сервер. Он добавляет надёжность и пропускную способность для чтения, но не позволяет хранить граф больше, чем помещается на одну машину.

Почему граф трудно шардировать

Шардирование делит данные между серверами: каждый хранит свою часть. Документной базе это даётся проще: документ самодостаточен, его можно целиком положить на один сервер. С графом сложнее: главное в нём связи, а связь между узлами на разных серверах превращает каждый шаг обхода в сетевой запрос.

Проверим на клубе. Допустим, мы разложили участников по серверам по городу: москвичи на один, казанцы на другой, пермяки на третий. Сколько знакомств пересекало бы границу серверов?

MATCH (a:Person)-[k:KNOWS]->(b:Person),
      (a)-[:LIVES_IN]->(ca:City),
      (b)-[:LIVES_IN]->(cb:City)
RETURN ca.name = cb.name AS sameServer, count(k) AS friendships
ORDER BY sameServer;
+--------------------------+
| sameServer | friendships |
+--------------------------+
| FALSE      | 4           |
| TRUE       | 5           |
+--------------------------+

2 rows

Даже в десятке человек часть знакомств пересекает границы. Каждый такой шаг в обходе «друзья друзей» стал бы походом по сети. Хорошее разбиение графа это отдельная трудная задача: нужно резать так, чтобы между частями было как можно меньше связей. Поэтому графовые базы долго масштабировались в основном вверх и копиями.

У Neo4j есть два ответа. Составные базы позволяют одним запросом обращаться к нескольким отдельным базам, когда данные сами делятся на части, например по странам. А специальная редакция Infinigraph умеет раскладывать данные по серверам автоматически. Обе возможности есть только в платных редакциях.

Облако

Если поддерживать серверы не хочется, есть AuraDB: Neo4j как облачный сервис. Сервер, обновления, резервные копии и кластер для платных тарифов делают за тебя, а подключаешься ты тем же драйвером по адресу вида neo4j+s://..., где +s значит шифрованное соединение. Для экспериментов у AuraDB есть бесплатный тариф.

Где графы работают в жизни

Задачи из второго урока встречаются в реальных системах:

  • банки и страхование: поиск колец мошенников через общие телефоны, адреса и устройства;
  • рекомендации: товары, фильмы, люди, которых ты можешь знать;
  • логистика и сети: маршруты, цепочки поставок, анализ того, что сломается при отказе узла сети;
  • графы знаний: справочники лекарств, каталоги, корпоративные базы знаний рядом с языковыми моделями;
  • управление доступом: права через вложенные группы и роли.

Общее у всех: вопросы про связи на несколько шагов и данные, где связей не меньше, чем записей.

Попробуй сам

Запрос рисует знакомства, которые пересекали бы границу серверов при раскладке по городам. Это те связи, которые сделали бы обход дорогим.

Придумай другую раскладку, например «верхняя половина клуба на один сервер, нижняя на другой», и посчитай для неё пересекающие связи, указав имена участников списком в WHERE.

Проверь себя

Задание

Дальше

Последний урок раздела про честное сравнение. В следующем уроке посмотрим на другие графовые базы и разберём признаки задач, где граф не нужен вовсе.

домашка

Домашка