По какой сущности шардировать
Недавно у коллег возникла необходимость шардировать большую pg базу, и для этого нужно определиться с сущностью, по которой надо шардировать. И задумался, можно ли придумать базовый универсальный алгоритм, как отправную точку, от которой можно рассуждать
Для простоты представим, что модель данных системы представлена в виде одного дерева
Исходное состояние: всё лежит в одном шарде, никаких кроссшардовых операций. Все прекрасно, кроме момента, что объем данных бесконечно растет
---
И далее начинаем спускаться по дереву сущностей, начиная от корня, примеряя каждую сущность как кандидата на шардирование
Корень — корневые сущности максимально независимы => будет минимальное количество кроссшардовых операций. При этом общий объем сущности (корневая сущность + все ее дочерние) скорее всего может бесконечно расти
Берем сущность на уровень ниже — получаем сущность, экземпляры который более зависимы друг от друга, при этом вероятность разрастания до бесконечности становится ниже
И с каждым понижением уровня мы получаем все более зависимые сущности, но которые все сильнее ограничены в объеме
И задача заключается в том, чтобы поймать баланс, когда сущности настолько независимы, чтобы не требовали (или почти не требовали) кросс-шардовых операций, при этом были достаточно ограничены в объеме
---
Один из успешных примеров с работы:
queue — определенная очередь обработки обращений в поддержку
ticket — конкретное обращение
article — сообщение в рамках обращения
queue — две очереди максимально независимы друг от друга, но могут расти бесконечно и неравномерно — тикетов может появится сколько угодно, и где-то их много, где-то мало
ticket — два тикета все еще достаточно независимы (это два отдельных обращения в поддержку), при этом два тикета могут участвовать в какой-то общей выборке (например, выборка открытых тикетов, на которых нет исполнителя). А вот максимальный объем тикета уже становится ограничен
article — два сообщения уже сильно зависимы (часто выбираются вместе), а объем сильно ограничен, и он гарантированно небольшой
Overall, что мы видим:
queue vs ticket — чуть чуть теряем в независимости, при этом сильно выигрываем, что сущность становится ограничена в объеме
ticket vs article — сильно проигрываем в независимости, при этом чуть чуть выигрываем в максимальном размере сущности
Такими рассуждениями, ticket выглядит максимально привлекательным кандидатом для шардирования
Post #179
10.1K
- 👍 37
- 🤔 10
- 💅 2