TGViewer
ТехнофITнес | Никита Ульшин ТехнофITнес | Никита Ульшин @tech_fit · 262 subscribers
Post #26 332
Шардирование Postgres в Notion

Я вообще неровно дышу к теме шардирования с тех пор, как мы на работе запилили cookbook по шардированию на стороне клиента. Уже тогда я прочитал кучу статей на эту тему, но всё равно продолжаю открывать для себя новые любопытные нюансы.

В сегодняшней статье инженеры из Notion рассказывают, как они шардировали свой Postgres и что из этого получилось.

⭐️ Интересные идеи

➡️ Шардирование было вопросом времени, но решение приняли, когда VACUUM начал стабильно зависать. Сам по себе диск — не проблема, но это могло привести к достижению предела идентификаторов транзакций, что заблокировало бы все записи в БД.

➡️ От решений типа Citus отказались, потому что логика кластеризации непрозрачна, и им хотелось иметь больше контроля над процессом шардирования.

➡️ Шардирование решили делать на стороне клиента (приложения). Для этого нужно было ответить на три вопроса: какие данные будут шардироваться? Каким образом их разделить? Сколько нужно шардов и как их организовать?

➡️ Вся модель Notion крутится вокруг блока (block), поэтому шардировать они решили все таблицы, достижимые по связям от таблицы блоков. Это позволяло хранить связанные сущности на одном физическом шарде и избежать кроссшардовых запросов.

➡️ В качестве partition key выбрали workspace id (идентификатор рабочего пространства), поскольку в их структуре данных блок относится строго к одному воркспейсу.

➡️ Для миграции на шарды использовали двойную запись через журнал изменений: дублировали запись и в монолитную БД, и в лог, откуда переправляли её в шард. По сути, реализовали свою логическую репликацию, потому что обычная не справилась с шагом создания изначального снепшота.

Перед релизом реализовали стратегию двойного чтения: читали и из старой базы, и из шарда, затем сравнивали результат и записывали несовпадения. Это ухудшило отзывчивость API на время, но дало уверенность в том, что с данными всё в порядке.

Приятного чтения!

#systemdesign@tech_fit #databases@tech_fit
➖➖➖➖➖➖➖➖➖➖➖
// Понравился пост? Ставь 💛
// И обязательно подпишись на канал, чтобы не пропустить новые статьи
Notion Herding elephants: lessons learned from sharding Postgres at Notion With an effort to make Notion faster and more reliable for years to come — we migrated Notion’s PostgreSQL monolith into a horizontally-partitioned database fleet.
  • 🔥 5
  • ⚡ 3
  • 👍 3
More from @tech_fit
  1. Oct 13, 2025Почему Uber переехал с Postgres на MySQL Интересная статья о том, какие проблемы в Postgre…
  2. Oct 6, 2025Паттерн Bulkhead Продолжаю читать статьи про паттерны отказоустойчивых приложений. На очер…
  3. Oct 1, 2025Как сервера договариваются друг с другом: алгоритм распределённого консенсуса Raft Распред…
  4. Sep 29, 2025Микросервисы не подходят стартапам Интересная статья, которая в очередной раз напоминает о…
  5. Aug 25, 2025Сколько партиций в Kafka мне нужно? Партиции — это одна из важнейших частей Kafka. С их по…
  6. Aug 18, 2025Роадмап архитектора Как вы знаете, иногда я тут делюсь не обзорчиками, а вполне прикладным…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →