
В современных реалиях объёмы данных постоянно растут, и появляются всё более жёсткие требования к производительности. Тут традиционный PostgreSQL сталкивается с фундаментальной проблемой: отсутствием нативной поддержки горизонтального масштабирования.
Сегодня мы, команда платформы данных в Yandex Cloud, хотим рассказать о SPQR — нашем опенсорс‑инструменте, который создавался как ответ на «боль» шардирования и эксплуатации крупных OLTP‑систем. Под катом — история о том, что стало отправной точкой для его создания, какие задачи он помогает решать, на чём основано наше решение и что позволяет ему быть довольно простым в эксплуатации.
Почему шардирование для PostgreSQL — это боль
PostgreSQL — отличная база данных: популярная, расширяемая. Однако у неё есть фундаментальное ограничение — «из коробки» она не поддерживает горизонтальное масштабирование. Многие сервисы рано или поздно достигают пределов одного экземпляра Postgres, после чего начинается «танец с бубном». При достижении одной базой данных объёма в несколько терабайт и с нагрузкой более 100 000 запросов в секунду (QPS) вертикальное масштабирование перестаёт быть эффективным.
Типичный подход к горизонтальному масштабированию — разделение таблиц по ключам и установка рядом с приложением (или приложениями) специального координатора, который знает, на какой шард направить запрос. Однако у такого подхода есть несколько серьёзных проблем:
Сложные миграции. Вернуться из монолита к кластерам и обратно без простоя почти невозможно.
Не хватает готовых инструментов. Vitess отлично работает с MySQL, но попытки привнести его в Postgres оказались слишком трудоёмкими. К этому времени многие компании (в том числе Яндекс) писали собственные мини‑фреймворки для роутинга. В целом это странная ситуация: у MySQL есть готовое решение, а у Postgres нет.
Проблемы с балансировкой и переносом данных. Без автоматизации дежурным приходилось ночью переносить «горячие» ключи вручную, чтобы избежать переполнения или перегрузки отдельных шардов. Шардов может быть сотни, и любая ошибка грозит отказом.
Метаданные не масштабируются. При хранении сведений о каждом ключе метаданные быстро разрастаются и перестают помещаться в один экземпляр Postgres, становясь новым узким местом системы.
Инженеры из Data Platform Yandex Cloud решили, что мириться с этими недостатками нельзя. Так появилась система SPQR (Stateless Postgres Query Router) — опенсорс‑решение для горизонтального масштабирования Postgres, оптимизированное под OLTP‑нагрузки и плавные миграции.
Как работает SPQR
Мы не сразу пришли к текущему дизайну SPQR. Сначала были эксперименты с FDW‑подходом (Foreign Data Wrapper) — классическим способом связать несколько PostgreSQL‑инстансов через внешние таблицы. Это выглядело естественным: минимум внешнего кода, можно использовать стандартный планировщик запросов. Но довольно быстро выяснилось, что при большом числе шардов и высоком QPS такая схема даёт слишком большие накладные расходы.
Следующим шагом стала попытка реализовать CustomNode‑based sharding — расширение на C, которое встраивалось в планировщик Postgres. Производительность улучшилась, но не было ясно, что делать с апгрейдом мажорных версий PostgreSQL. В итоге мы решили написать proof‑of‑concept proxy‑решения — и у нас получилось!
Роутер вместо кастомных драйверов
Главная идея SPQR — поставить между приложением и шардами лёгкий прокси‑роутер. Приложения подключаются к нему по обычному протоколу PostgreSQL, «не догадываясь», что работают не с базой данных, а с Golang‑приложением. Такой подход позволяет на уровне роутера перенаправлять запросы, распределять их между репликами, не модифицируя код приложения.

Роутер анализирует первый запрос в транзакции и решает, на какой шард отправить транзакцию целиком. SPQR поддерживает как одноколоночные шард‑ключи, так и композитные ключи. При необходимости разработчик может указать ключ явно в SQL‑комментарии, например:
INSERT INTO orders(id, data) VALUES (10, '...') /*__spqr__sharding_key: 1, 100*/;
Если подходящего ключа в запросе нет, можно настроить default shard — роутер отправит транзакцию на него по умолчанию.
Координатор и QDB
Один роутер неизбежно стал бы узким местом и единой точкой отказа, поэтому система SPQR изначально спроектирована так, что можно запускать сколько угодно роутеров параллельно.

Правила шардирования хранятся в памяти каждого роутера, но синхронизируются через отдельный сервис — координатор. Координатор записывает метаданные в небольшую базу QDB (внутри работает кластер etcd) и раздаёт актуальные правила всем роутерам.

Благодаря этому можно динамически добавлять и удалять роутеры, не беспокоясь о рассогласованности конфигурации.
Решение проблемы балансировки
Одна из главных трудностей при шардировании — неравномерная нагрузка. Когда один шард перегружен, а другие простаивают, администраторам приходилось переставлять данные вручную. SPQR предоставляет балансировщик, который делает это автоматически.

Вместо того чтобы полностью копировать данные с одного шарда на другой, как предлагают многие решения на основе логической репликации, координатор SPQR делает ε‑split: «отрезает» от перегруженного диапазона маленький «кусочек» (ε) и переносит его без долгих блокировок. Этот процесс повторяется до тех пор, пока нагрузка не выровняется. Подход с ε‑split минимизирует время, в течение которого мигрируемый диапазон находится в режиме read‑only, и позволяет переносить данные даже на сильно загруженных кластерах.
Балансировщик реализован как часть координатора и расширение pg_comment_stats для шардов. Он следит за метриками шардов и по заданным стратегиям решает, когда и какие диапазоны переносить. Если на шарде выполняется транзакция, затрагивающая перевозимый диапазон, координатор дождётся её завершения и только потом заблокирует кусок и перевезёт его.
Работа с транзакциями и кросс-шардовые запросы
Прежде всего система SPQR рассчитана на single‑shard OLTP‑сценарии, поэтому кросс‑шардовые запросы поддерживаются только в ограниченном объёме. Разрешены, например, SELECT * FROM… без WHERE и DDL‑команды (CREATE TABLE и пр.) — такие запросы выполняются по принципу best effort и могут вернуть несогласованный срез данных. В продакшене этот режим отключён по умолчанию, но его можно включить, установив в конфигурации query_routing.default_route_behaviour = BLOCK.
В планах — поддержать более богатые кросс‑шардовые запросы, но это долгосрочная задача.
Для транзакций на нескольких шардах SPQR поддерживает двухфазный коммит. Специальный комментарий в запросе _spqr_commit_strategy определяет стратегию фиксации: 1pc (однофазная фиксация без координации) или 2pc (двухфазная фиксация).
В режиме 2pc изменения на всех шардах применяются атомарно, но важно понимать, что двухфазный коммит не обеспечивает полной изоляции — это принципиальное ограничение всех СУБД, использующих 2pc. То есть в межшардовых транзакциях возможны аномалии из‑за отсутствия глобального уровня snapshot isolation.
В планах — добавить поддержку CSN (Commit Sequence Number), чтобы обеспечить глобально согласованный порядок транзакций и тем самым устранить часть аномалий, присущих двухфазной фиксации.
Отказоустойчивость и интеграция без модификации СУБД
Без состояния — максимум надёжности. SPQR не хранит состояние: все правила маршрутизации лежат в QDB, поэтому число роутеров не ограничено. Это позволяет запускать сотни экземпляров роутеров одновременно, обеспечивая горизонтальную масштабируемость и отказоустойчивость.
Умная маршрутизация и отказоустойчивость шардов. Для каждого шарда можно указать несколько серверов. SPQR автоматически распределяет read‑only‑запросы по репликам и при недоступности любого из них перенаправляет трафик. Кроме того, предусмотрен режим dedicated read‑only router: в нём SPQR отвечает true на SHOW transaction_read_only и принимает только запросы на чтение — аналогично обычной реплике PostgreSQL.
Интеграция без кастомных драйверов. Приложения подключаются к SPQR по стандартному PostgreSQL‑протоколу, никаких модификаций или специальных библиотек не требуется. Для администрирования предусмотрен отдельный порт: через psql можно выполнять служебные команды вроде SHOW shards; или SHOW clients; для мониторинга состояния кластера.
Простая эксплуатация. SPQR поддерживает все типы аутентификации PostgreSQL (trust, md5, scram, ldap, gss) и имеет готовый quickstart: кластер можно запустить через Docker за пару минут. Достаточно скачать образ роутера и задать конфигурацию шардов — и полноценный тестовый шардинг‑кластер готов к работе.
Отличия от других решений
При разработке SPQR мы сформулировали несколько принципов, которые отличают систему от большинства инструментов шардирования PostgreSQL:
Использование проверенных HA‑кластеров как строительных блоков. Для каждого шарда подходят Patroni, Stolon, PgConsul или управляемые облачные сервисы. SPQR не изобретает собственную репликацию и опирается на уже существующие решения высокой доступности.
Без простоя при миграциях. Монолитная база становится первым шардом, затем добавляются новые узлы, и данные переносятся без остановки сервиса. Тем же механизмом можно «схлопнуть» шарды обратно в монолит.
Лёгкая установка. Dev‑кластеры должны подниматься на ноутбуке за минуты, а не часы. Для этих целей есть готовый Docker‑образ.
Оптимизация под OLTP. SPQR добавляет к запросу всего ~ 1–2 мс накладных расходов, что приемлемо для кратких транзакций.
Перенос данных небольшими диапазонами. Данные можно «переливать» между шардами пропорционально нагрузке. Большие диапазоны ключей автоматически разбиваются на маленькие, чтобы минимизировать время блокировок при переносе данных.
Без головной боли с лицензией. SPQR использует открытую лицензию PostgreSQL.
Кому подходит SPQR
Система SPQR рассчитана преимущественно на OLTP‑нагрузки. Она особенно эффективна, когда большинство транзакций укладывается в рамки одного шарда. Вот её основные сценарии использования:
Электронная коммерция и финтех. Интернет‑магазин можно разделить по customer_id или product_category и обрабатывать десятки тысяч заказов в секунду.
Контент‑платформы. Блоги, новостные порталы и CMS‑разработки часто шардируются по author_id или типу контента, при этом комментарии и связанный контент остаются на одном шарде.
Хранилища микросервисов. Каждый микросервис получает свой логический шард, но физически всеми данными управляет единый роутер — это упрощает архитектуру хранения без множества отдельных баз данных.
Пользовательские сервисы, IoT, high‑traffic OLTP. SPQR обеспечивает низкие задержки, поддерживает до 100 000 запросов в секунду и терабайты данных, поэтому подходит для сервисов с большим потоком коротких транзакций (онлайн‑игры, платёжные системы, телеметрия IoT и тому подобное).
При этом SPQR не пытается заменить полноценные распределённые СУБД (такие, как YDB или CockroachDB): если вам нужны строго консистентные кросс‑шардовые транзакции или сложные аналитические запросы, лучше обратить внимание на HTAP‑решения. Но если ваша нагрузка хорошо шардируется, а переписывать приложение или городить собственный роутинг не хочется, SPQR станет удобным решением.
Текущий статус проекта и планы
SPQR развивается как открытый проект на GitHub под лицензией PostgreSQL Global Development Group. Код можно свободно использовать и модифицировать без ограничений (никакого AGPL). Команда Data Platform уже использует SPQR в проде. А ещё нашим инструментом пользуются Яндекс ID, Яндекс Пэй и Едадил.
Из наших планов на будущее:
дальнейшее развитие балансировщика и метрик мониторинга;
поддержка более богатых кросс‑шардовых запросов;
развитие административного API и инструментов наблюдения за кластером.
SPQR развивается не только внутри Yandex Cloud — в проект уже активно вносят вклад внешние контрибьюторы. У нас есть несколько внешних коммитеров, которые добавляют полноценные фичи среднего масштаба — из последнего, например, поддержку default shard. Команда рада любой обратной связи: код полностью открытый и независимый — никаких enterprise features за paywall. Будем рады вашим комментариям, пул‑реквестам и звёздочкам в репозитории. А также заглядывайте на трансляцию нашего Open Source Jam — поговорим о PostgreSQL и не только.
SPQR — попытка сделать PostgreSQL по‑настоящему масштабируемым без компромиссов.
Лёгкий роутер на Go распределяет нагрузку по шардам, координатор следит за целостностью правил, а балансировщик переносит данные микропорциями, избегая долгих блокировок. Несмотря на ограничения — транзакции в основном внутри одного шарда и пока ограниченную поддержку cross‑shard‑запросов — проект уже успешно работает в продакшене и доказывает, что шардированный Postgres может быть одновременно простым и надёжным.
В отличие от «настоящих» распределённых СУБД, система SPQR не пытается во что бы то ни стало обеспечить глобальные ACID‑гарантии. Её цель — сохранить привычный Postgres и дать ему возможность расти горизонтально, без отказа от знакомых инструментов и контроля над данными.
Комментарии (35)

KoreanGuy
24.11.2025 13:20Классное имя. Senatus Populus Que Romanus

Kalashmatik
24.11.2025 13:20Скрытый текст

Изобрели умный haproxy/pgbouncer получается...

denchickkk Автор
24.11.2025 13:20Изобрели умный haproxy/pgbouncer получается...
И да, и нет. Если совсем упрощать, то разница примерно такая:
pgbouncer работает на уровне TCP-соединений. Он просто решает, куда прокинуть коннект, и на этом его "интеллект” заканчивается. Ничего про шардирование там нет.
SPQR Router, наоборот, работает на уровне SQL. Он парсит запрос, понимает, к какой таблице он относится, в какой колонке искать ключ шардирования, какие таблицы референсные, какие распределенные, и уже после этого выбирает, на какой шард отправить конкретный запрос. Вокруг этого и построена вся логика.

Debrainer
24.11.2025 13:20Почему не использован citus, который именно с этим ушел далеко вперёд?
Но там есть возможность не только построчного шардирования но и потабличного. Будете ли двигаться тоже в том направлении?

msvn
24.11.2025 13:20Мы не можем использовать Citus из-за лицензионных ограничений. Что касается потабличного шардирования, то такая возможность уже косвенно присутствует в виде https://docs.pg-sharding.tech/sharding/reference_tables#reference-tables

denchickkk Автор
24.11.2025 13:20Мы очень хотели бы использовать citus, но из-за ограничения лицензии не можем. Из всех облачных провайдеров citus доступен только в Azure.

XelaVopelk
24.11.2025 13:20Как мне видится, тот факт, что активная нода координатора в citus-кластере только одна, это может стать проблемой.

vlad4kr7
24.11.2025 13:20Но довольно быстро выяснилось, что при большом числе шардов и высоком QPS такая схема даёт слишком большие накладные расходы.
Можно узнать подробнее? "большом числе", это сколько шардов, в чем накладные расходы? Это связано с SELECT или не только?

denchickkk Автор
24.11.2025 13:20Точных цифр, к сожалению, не осталось. Это было около 6 лет назад, и все артефакты канули в лету после переездов gitlab -> bitbucket -> bitbucket -> arcadia. Даже код в итоге не сохранился, не то что артефакты.
Спросил у коллег, может кто-нибудь вспомнит или найдет. Если что, я добавлю инфу в тред.

Sleuthhound
24.11.2025 13:20>у MySQL есть готовое решение, а у Postgres нет.
И у MySQL его нету, по факту Vitess имеет некоторые неявные ограничения, а количество специалистов по нему (те кто реально поддерживал промышленный Vitess) стремиться к нулю. Так что я считаю, что для MySQL тоже нет решения.
Есть кстате ProxySQL который с 3-й версии научился проксировать PostgreSQL, то есть по сути можно что-то сделать на нем. Но как оно работает я не проверял.

denchickkk Автор
24.11.2025 13:20Я тоже, если честно, не встречал людей, которые сопровождали Vitess в проде. Я даже не уверен в курсе ли в YouTube, что они все еще используют Vitess (https://vitess.io/ -> who uses Vitess).
Всегда думал, что это скорее особенность моей небольшой эпсилон-окрестности, где MySQL не слишком популярен.
В общем, согласен, это все очень странно.

alexfilus
24.11.2025 13:20Есть ли возможность горячего добавления/вывода шардов? Не планируете ли заопенсорсить Шарпей?

denchickkk Автор
24.11.2025 13:20Про Шарпей, к сожалению, ничего конкретного сказать не могу, ведь мы его не разрабатываем (хотя при создании SPQR действительно ориентировались на некоторые идеи из него, да и вообще MDB появился из Почты).
Насчёт горячего/холодного добавления или вывода шардов - не знаю, что именно ты вкладываешь в эти термины, поэтому просто опишу, как это устроено в SPQR.
Добавление нового шарда:
Разворачиваешь новый PostgreSQL-кластер. Поднимаешь сам инстанс, создаешь нужных пользователей и базы.
Как SPQR узнает о новом шарде? Варианта два: прописать новый шард в конфиге роутера, или вызвать в SPQR Admin Console команду ADD SHARD (WIP). Что выбрать - зависит от вашего способа деплоя.
Переносишь данные на новый шард. Если роутер смог подключиться к шарду, то нужно перенести данные: `SYNC REFERENCE TABLE` - если у тебя есть референсные таблицы, их надо синхронизировать; `REDISTRIBUTE KEY RANGE` - перенос данных шардированных таблиц.
Удаление шарда:
По сути то же самое, но в обратном порядке: переносишь данные с шарда с помощью REDISTRIBUTE, убираешь шард из конфига или DROP SHARD, удаляешь кластер.
Downtime
Во время redistribute: чтения не блочатся вообще, записи - практически без даунтайма (приложению может не повести попасть с изменением данных на перевозимый диапазон).

alexfilus
24.11.2025 13:20В общем да, я имел в виду сценарий добавления шардов с автоматическим решардингом, и отключения шардов для обновления.
Условно я даю команду распределить всю инфу с 1 шарда, обновляю, возвращаю его, переливаю туда данные со 2 шарда, обновляю 2 шард и так далее, все по порядку, без простоя.

eee
24.11.2025 13:20Я не сильно разбираюсь в кросс-шардовых запросах, но что вернётся, если я заселекчу данные, которые хранятся в разных шардах? Как будет выполняться сортировка, если запрошу ORDER BY?

denchickkk Автор
24.11.2025 13:20По умолчанию SPQR запрещает выполнение запросов без ключа шардирования, которые могут затронуть несколько шардов. Это сделано намеренно, чтобы защитить пользователя от неожиданных проблем с производительностью и консистентностью.
Если попробуете выполнить что-то вроде
SELECT * FROM users; -- без WHERE по ключу шардирования, то явно получите ошибку. Это поведение управляется настройкой qrouter.default_router_behaviour.Чтобы явно отправить запрос на все шарды (а не только на какой-то конкретный или на какую-то часть), есть хинт scatter_query:
SELECT * FROM users /* __spqr__scatter_query: true */;Что произойдёт дальше:
SPQR отправит запрос на все шарды параллельно
Роутер получит результаты от каждого шарда независимо
Результаты будут объединены и возвращены клиенту
Про ORDER BY, LIMIT, агрегатные функции и так далее. Прямо сейчас тут нет никакой логики обработки результата. Вот простой пример:
SELECT * FROM users LIMIT 1; -- возвращается столько пользователей, сколько шардов.Мы очень хотим что-то тут улучшить и поддержать, но пока изо всех сил держимся от написания кода, потому что никто из сообщства SPQR не просил об этом.
пользуясь случаем, если эта фича кажется вам интересной, можно спросить о ней в нашем чате в телеграм или создать issue на https://github.com/pg-sharding/spqr/issues
Вообще, есть еще много хинтов и настроек, которые управляют роутингом запросов. Подробнее можно почитать тут https://docs.pg-sharding.tech/routing/hints.

Sleuthhound
24.11.2025 13:20>> SELECT * FROM users LIMIT 1; -- возвращается столько пользователей, сколько шардов.
Это конечно неожиданное поведение. Хотя если явно говорите, что во всех запросах должен быть ключ шардирования, то вроде как логично что результат будет такой, НО все равно не логично.

denchickkk Автор
24.11.2025 13:20Хотя если явно говорите, что во всех запросах должен быть ключ шардирования, то вроде как логично что результат будет такой
Есть несколько ситуаций, когда мы можем обойтись без ключа шардирования в запросе. Например, референсные таблицы.

Sleuthhound
24.11.2025 13:20Если изначально таблица была на 1 шарде, а потом мы сказали роутеру что она стала референсной, то на другие шарды она заедет сама или все же ручками нужно ее копировать во все шарды?
А что будет если сделать UPDATE/DELETE/INSERT по этой таблице? Она по всем шардам бахнет запросы? Это я про поддержание таблицы в консистентном состоянии на всех шардах.

XelaVopelk
24.11.2025 13:20А что будет если сделать UPDATE/DELETE/INSERT по этой таблице? Она по всем шардам бахнет запросы?
по референсной таблице да. В т.ч. можно в режиме 2pc сделать.

denchickkk Автор
24.11.2025 13:20Если изначально таблица была на 1 шарде, а потом мы сказали роутеру что она стала референсной, то на другие шарды она заедет сама или все же ручками нужно ее копировать во все шарды?
Для этого есть команда SYNC REFERENCE TABLE x. Роутер выберет случайный шард и с него скопирует таблицу на новый.

gsl23
24.11.2025 13:20отсутствия глобального уровня snapshot isolation
Это все определеяет - ни консистентного бэкапа, ни нормальных транзакций на уровне БД. Получается все гарантированно только внутри одного шарда. Это, скорей, массив разрозненных БД , с роутингом, не совсем шардирование.

denchickkk Автор
24.11.2025 13:20Скорее, это набор независимых PostgreSQL-инстансов с умным/глупым роутингом запросов. SPQR не пытается быть полноценной распределённой СУБД с глобальными транзакциями и snapshot isolation - это отдельный, очень дорогой класс решений.
По нашему опыту, в типовых кейсах пользователей SPQR критичнее горизонтальное масштабирование чтения/запросов и изоляция шардов, а не глобальные транзакции.
Поддержка CSN у нас действительно в обсуждении, но пока не появилось реального сценария, где эта функциональность окупилась бы. Как только появится пользовательский запрос - будем двигаться в эту сторону.

dph
24.11.2025 13:20А в чем отличие от шардирования через Citus? Там, вроде бы, примерно те же возможности, но запросы на чтение между шардами развиты несколько лучше, хотя балансировка шардов сделана чуть менее автоматической.

denchickkk Автор
24.11.2025 13:20Первое что приходит в голову -- в слове SPQR 4 буквы, а в слове Citus 5 букв.
Второе что приходит в голову -- разработчики Citus они там, далеко. А разработчики SPQR тут, близко :)
И то, и то про шардирование, сделано архитектурно по-разному, результат примерно одинаковый. Если у вас есть чуть точнее вопрос, я смогу чуть точнее ответить :)

andreylartsev
24.11.2025 13:201) поясните пожалуйста все же про миграции, как ваше решение их упрощает?
2) как решается задача с lookup таблицам содержимое которых на всех шардах должно быть идентичным?
3) как решается задача с запросами в которых нет ключа шардирования?

denchickkk Автор
24.11.2025 13:201) Проблема: была система с одним кластером PostgreSQL, как из нее сделать 4, 8, 16 и далее кластеров PostgreSQL? Шаг 1: начни ходить не непрямую в Postgres, а через прокси. Шаг 2: развези данные с одного шарда на другие с помощью REDISTRIBUTE KEY RANGE команды. Перевоз без даунтайма, приложение и пользователи этого перевоза никак не заметят. Если потом понадобится еще шардов добавить -- можно легко добавить и снова перенести данные.
2) Вам нужны Справочные таблицы.
3) Магию пока не изобрели, ответ зависит от того, а какой это запрос. Есть несколько ситуаций, когда мы можем выполнить запрос без ключа шардирования.
Ситуация 1. Мы это называем виртуальные запросы. Запросы, которые может выполнить роутер, не передавая их на Postgres. Примеры:
SELECT true; SELECT pg_is_in_recovery(); SELECT now() -- и многие другие, надеюсь идея понятнаСитуация 2. Ключ шардирования передали ранее в транзакции. Пример.
BEGIN; -- начинаем транзакцию SET application_name="smth"; -- в начале может идти какой-то набор запросов, которые мы сохраняем в памяти роутера, в них нет ключа шардирования SELECT * FROM users WHERE id=123; -- запрос, в котором есть ключ шардиования. С этого момента запрос выполняется на каком-то конкретном шарде/наборе шардов SELECT * FROM taxes; -- а дальше уже не важно есть ли в запросах ключ шардирования, роутер передаст это на шард как есть COMMIT;Ситуация 3. Запрос к референсной таблице. Реф таблица -- это таблица, копия которой есть на каждом шарде. Пример:
SELECT * from taxes; -- роутер знает эту таблицу, знает что она референсная, отправляет на случайный шардСитуация 4. Не всегда в запросе/таблице может быть ключ шардирования, но иногда бывает что приложение как-то логически может знать о ключе. И тогда оно может подсказать роутеру в специальном хинте-комментарии этот ключ. Пример:
INSERT INTO test(id, age) VALUES (10, 16) /*__spqr__sharding_key: 30*/;В общем виде, такие комментарии мы называем routing hints, их много, они разные.
Что происходит, если роутер не смог понять куда отправить запрос? Он явно возвращает ошибку приложению.
fo_otman
Вроде делали ведь уже про это доклад на Highload++.
denchickkk Автор
Много времени прошло с тех пор, много проблем мы поправили, много фичей добавили. Но вот текстом что-то про SPQR пишем в первый раз :)