Шардирование Postgres в Notion
Я вообще неровно дышу к теме шардирования с тех пор, как мы на работе запилили cookbook по шардированию на стороне клиента. Уже тогда я прочитал кучу статей на эту тему, но всё равно продолжаю открывать для себя новые любопытные нюансы.
В сегодняшней статье инженеры из Notion рассказывают, как они шардировали свой Postgres и что из этого получилось.
⭐️ Интересные идеи
➡️ Шардирование было вопросом времени, но решение приняли, когда VACUUM начал стабильно зависать. Сам по себе диск — не проблема, но это могло привести к достижению предела идентификаторов транзакций, что заблокировало бы все записи в БД.
➡️ От решений типа Citus отказались, потому что логика кластеризации непрозрачна, и им хотелось иметь больше контроля над процессом шардирования.
➡️ Шардирование решили делать на стороне клиента (приложения). Для этого нужно было ответить на три вопроса: какие данные будут шардироваться? Каким образом их разделить? Сколько нужно шардов и как их организовать?
➡️ Вся модель Notion крутится вокруг блока (block), поэтому шардировать они решили все таблицы, достижимые по связям от таблицы блоков. Это позволяло хранить связанные сущности на одном физическом шарде и избежать кроссшардовых запросов.
➡️ В качестве partition key выбрали workspace id (идентификатор рабочего пространства), поскольку в их структуре данных блок относится строго к одному воркспейсу.
➡️ Для миграции на шарды использовали двойную запись через журнал изменений: дублировали запись и в монолитную БД, и в лог, откуда переправляли её в шард. По сути, реализовали свою логическую репликацию, потому что обычная не справилась с шагом создания изначального снепшота.
Перед релизом реализовали стратегию двойного чтения: читали и из старой базы, и из шарда, затем сравнивали результат и записывали несовпадения. Это ухудшило отзывчивость API на время, но дало уверенность в том, что с данными всё в порядке.
Приятного чтения!
#systemdesign@tech_fit #databases@tech_fit
➖➖➖➖➖➖➖➖➖➖➖
// Понравился пост? Ставь 💛
// И обязательно подпишись на канал, чтобы не пропустить новые статьи
Post #26
332