Как Notion шардировал PostgreSQL
https://www.notion.so/blog/sharding-postgres-at-notionКоротко:
. Шардирование – техника разбивания одного инстанса БД на множетсво (шардов) с разделением данных между ними для распределения нагрузки
. Самая большая сложность – выбрать алгоритм деления данных по шардам так, чтобы 1 запрос затрагивал только 1 шард (в идеале)
. Notion решил шардировать по workspace id, потому что по факту, если человек что-то делает, то делает только в рамках одного workspace id
. Для них оптимальный размер 1 таблицы – 500Gb, а одного инстанса – 10 Tb (это на заметку про возможности PSQL)
. Они разделили все на 32 базы по 15 схем в каждой (480 схем). Это удобно, потому что 480 делиться без остатка на множество чисел, что позволяет пропорционально увеличивать объем небольшими шагами (например, добавлять по 4 базы за раз)
. Выбрали стратегию миграции через audit log – создаетеся отдельная таблица, в которую пишут операции записи, а потом отдельный скрипт подхватывает эти записи из таблицы и применяет их к нужным инстансам шардов
. Далее у них был отдельный скрипт для проверки валидности данных, одной из его функции был Dark read (в проде при чтении данных, читаем из старой и новой базы и сверяем одинаковость данных)
. Идентификатором в таблицах это композитный ключ из id сущности и id workspace, но гораздо проще было бы сделать 1 id, в котором совместить оба этих столбца
Все мощной прокачки 💪
Статья на Medium