Эту статью мы подготовили на основе вебинара «Managed PostgreSQL: запускаем 1С в облаке и ускоряем работу базы данных».

Как запустить 1С в облаке на Yandex Managed Service for PostgreSQL и ускорить базу данных
Разбираем, как разместить 1С в Yandex Cloud без своих серверов и штатного администратора баз данных: из каких слоёв состоит архитектура, чем сборка PostgreSQL для 1С отличается от обычной и как найти запрос, из-за которого база упёрлась в процессор.
- 1С в Yandex Cloud раскладывается на три слоя: приложения, серверы и данные, которые размещаются в Yandex Cloud, Yandex Compute Cloud и Yandex Managed Service for PostgreSQL соответственно.
- Есть два варианта публикации 1С: внутренний контур (через VPN и внутреннюю сеть) и публикация через веб с дополнительным слоем защиты (балансировщик нагрузки и Yandex Smart Web Security).
- Развёртывание 1С в облаке можно осуществить двумя путями: обратиться к партнёру Yandex Cloud или сделать всё самостоятельно по инструкциям из документации.
- У переноса 1С в облако пять важных причин: снижение затрат на оборудование и эксплуатацию, возможность масштабирования по требованию, защищённая платформа, кастомизация и интеграции с другими приложениями.
- Специализированная редакция PostgreSQL для 1С в Yandex Cloud включает весь необходимый набор расширений и позволяет легко развернуть кластер.
- В Yandex Cloud доступно восстановление базы данных на произвольный момент времени и хранение бэкапов до трёх лет.
- Диагностика производительности в Yandex Managed Service for PostgreSQL помогает выявлять и устранять проблемы с производительностью базы данных, предоставляя верхнеуровневый обзор по pg_stat_activity, слепки pg_stat_activity на любой момент времени и агрегированную статистику по запросам.
- Существуют два режима диагностики: стандартный (собирает статистику по сессиям и запросам) и расширенный (собирает дополнительно планы запросов и статистику по планам).
PostgreSQL давно стал стандартной базой для 1С, но без администратора её сложно настроить и обслуживать, а нанимать такого специалиста дорого. В нашем материале мы соединили два направления: сначала разобрали, как устроена 1С в облаке и какие задачи закрывает управляемая база данных, а потом на реальном кластере показали, как диагностика помогает дойти от «всё тормозит» до конкретного запроса и индекса.
Из чего состоит 1С и где в облаке живёт каждый слой
1С — многокомпонентная система, и в Yandex Cloud она раскладывается на три слоя.
|
Слой |
Что в нём |
Где размещается в облаке |
|
Приложения |
Тонкий, толстый, мобильный и веб-клиенты «1С:Предприятия» |
Все клиентские приложения можно захостить в Yandex Cloud |
|
Серверы |
Веб-сервер, сервер приложений 1С и сервер лицензий |
Одна или несколько виртуальных машин Yandex Compute Cloud |
|
Данные |
База данных 1С |
Управляемый кластер Yandex Managed Service for PostgreSQL |
Главная техническая ценность такого размещения — управляемая база: надёжное и быстрое хранение данных с восстановлением по требованию. Всё, что платформа «1С:Предприятие» умеет в части архитектуры, в облаке доступно точно так же — базовая инфраструктура 1С не меняется.

1C — это трёхзвенная архитектура
Как выглядит целевая схема размещения
Надёжность строится на зонах доступности. Сейчас у Yandex Cloud четыре зоны доступности, и приложение можно разнести по нескольким из них, а не держать на единственном сервере. Для отказоустойчивости достаточно двух или трёх зон.
На целевой схеме три горизонтальных слоя:
- защита и балансировка нагрузки перед веб-приложением;
- сами приложения 1С: веб-сервер, сервер приложений, сервер лицензий;
- управляемая база данных.

Целевая схема 1C в Yandex Cloud
Внутренний контур или публикация через веб: как открыть доступ к 1С
Вариантов публикации несколько:
- Внутренний контур. 1С находится в закрытом периметре, доступ идёт через VPN и внутреннюю сеть. Пользователи работают так же, как если бы сервер стоял в инфраструктуре компании.
- Публикация через веб. Вариант сложнее и нужен, когда доступ к 1С требуется внешним контрагентам. Появляется дополнительный слой защиты периметра: во-первых, балансировщик нагрузки Yandex Application Load Balancer, во-вторых, Yandex Smart Web Security, который объединяет защиту от DDoS и WAF и блокирует вредоносный трафик и ботов. В остальном схема та же: кластер 1С и управляемая база данных.
Доступ пользователей тоже можно организовать по-разному: через браузер, через тонкий или толстый клиент.
Два пути к развёртыванию: партнёр или самостоятельно
Разместить свою конфигурацию — «Управление торговлей», «Бухгалтерию» или ERP — можно двумя способами:
- Обратиться к нам: клиентский архитектор, аккаунт-менеджер или служба поддержки посоветуют партнёра Yandex Cloud, который настроит инсталляцию полностью под вас. Это партнёр одновременно и 1С, и Yandex Cloud, он может взять на себя весь комплекс работ.
- Сделать всё самостоятельно по инструкциям из документации. Если в процессе возникнут вопросы, инженеры поддержки подскажут.

Разворачиваем 1С в облаке самостоятельно
Порядок действий при самостоятельном развёртывании выглядит так:
|
Шаг |
Что делаем |
На что обратить внимание |
|
Сетевой контур |
Создаём подсеть, в которой будет жить 1С |
Подойдёт дефолтная сеть, которая создаётся вместе с первой виртуальной машиной; при желании компоненты можно изолировать по отдельным подсетям |
|
Виртуальные машины |
Создаём одну или несколько ВМ под платформу «1С:Предприятие» |
Три роли: веб-сервер, сервер 1С и лицензионный сервер — на отдельных ВМ или на одной |
|
Кластер PostgreSQL |
Разворачиваем управляемый кластер в специализированной редакции для 1С |
Все нужные расширения уже включены; операционные вопросы мы берём на себя |
|
Информационная база |
Разворачиваем одну или несколько конфигураций |
Зависит от задач, которые решает 1С в компании |
|
Доступ пользователей |
Настраиваем веб, тонкий или толстый клиент |
Выбор зависит от того, как привыкли работать пользователи |
Сколько виртуальных машин нужно под 1С
Зависит от того, какую отказоустойчивость и масштабируемость вы хотите получить. Если система рассчитана на сотни пользователей, роли лучше развести по изолированным серверам. Если нагрузка — 30–50 пользователей, достаточно одного сервера средней мощности, на котором живут все три роли.
А зачем вообще переносить 1С в облако
Есть пять важных причин:
- Железо дорожает. Память подорожала в несколько раз, и покупка нового сервера — заметная статья расходов.
- Эксплуатация — это не только железо. Нужны инженеры, которые настраивают серверы, «1С:Предприятие» и базы данных. Держать такой штат может быть экономически нецелесообразно.
- Масштабирование по требованию. Когда нагрузка выросла, достаточно «подкрутить ползунки»: виртуальная машина или сервер баз данных станет мощнее без капитальных затрат. Когда нагрузка низкая, ресурсы можно сократить.
- Защищённая платформа. Контроль доступа и защита проработаны, решения сертифицированы.
- Кастомизация и интеграции. Если одной 1С недостаточно и нужны интеграции с другими приложениями или аналитикой, их можно развернуть рядом в облаке, например с помощью Yandex Data Transfer.
В сумме это снижает стоимость владения: если сравнить расходы на собственную инфраструктуру с виртуализированной в Yandex Cloud, для многих компаний облако окажется выгоднее.
PostgreSQL для 1С: отличия от стандартной сборки
Специализированная редакция PostgreSQL для 1С — одна из главных особенностей платформы Yandex Cloud. Яндекс — один из крупнейших мировых контрибьюторов в ядро PostgreSQL: у нас есть целое подразделение, которое разрабатывает патчи не для отдельных решений, а непосредственно для ядра. Эта экспертиза позволяет поддерживать редакцию для 1С, вкладываться в её развитие и делать новые патчи, которые повышают производительность 1С.
Редакция включает весь необходимый набор расширений: дополнительных действий не требуется, кластер готов в нужном виде буквально после нажатия нескольких кнопок.
Начать можно с одного хоста — например, для тестирования производительности или пробного размещения — а затем выбрать отказоустойчивую конфигурацию с двумя или тремя хостами в разных дата-центрах. Сайзинг доступен в любой момент: конфигурацию можно подогнать под текущую нагрузку.
Важно
Yandex Cloud не занимается лицензированием «1С:Предприятия». Лицензию нужно приобрести самостоятельно или иметь её до того, как вы начнёте размещать инфраструктуру 1С в облаке.
Бэкапы: восстановление на момент времени и хранение до трёх лет
«Из коробки» доступно восстановление на произвольный момент времени. Если администратор или пользователь случайно повредил данные или что-то удалил, базу можно вернуть к конкретному моменту.
Политика бэкапов гибкая: глубину хранения можно настроить до 60 дней. Если процессы комплаенса требуют большего, есть механизм LTR — бэкапы длительного хранения, которые лежат в Yandex Cloud до трёх лет, и из них тоже можно восстановиться.
Резервные копии хранятся во всех наших дата-центрах, поэтому что бы ни случилось с конкретным сервером или даже дата-центром, данные останутся доступны.
Just‑In‑Time — «точно в срок» — это технология компиляции запросов «на лету», которая преобразует интерпретируемый код запроса в машинный код непосредственно во время выполнения, чтобы ускорить его обработку.
Когда нужна диагностика производительности
Когда мы исследуем производительность базы данных, мы работаем в одной из трёх зон.
- Инцидент идёт прямо сейчас. Продакшен «горит»: распродажа, скидки, больше пользователей, что-то не работает. Нужно максимально быстро найти проблему и купировать её.
- Инцидент был какое-то время назад. Ночью что-то случилось и прошло само собой — или мы, не разбираясь, накинули ресурсов. Наутро хочется понять причину.
- Профилактический осмотр. Самое интересное направление: понимать, адекватна ли нагрузка, не потребляем ли мы больше ресурсов, чем нужно, не стал ли какой-то запрос есть больше CPU или выполняться дольше. Так инцидентов из первых двух категорий можно избегать: если деградация видна заранее, есть время починить запрос.
Почему диагностировать PostgreSQL руками сложно
В PostgreSQL, в отличие от некоторых других промышленных СУБД, статистики много, но она разбросана по разным местам, и нужно знать, где смотреть: pg_stat_activity, pg_locks и другие представления. Историчности они не хранят — чтобы понять, что было некоторое время назад, приходится периодически снимать слепки или довольствоваться агрегированными цифрами.
Дальше — расширения, о которых нужно узнать, поставить и как-то ими управлять: pg_stat_statements со статистикой по запросам, auto_explain, который записывает планы долгих запросов.
И наконец, нужны мониторинги и логи: частое снятие слепков, их хранение и удобный анализ. Всё это надо настроить заранее.
Диагностика производительности в Yandex Managed Service for PostgreSQL
Диагностика производительности закрывает большую часть этих задач.
- Верхнеуровневый обзор по
pg_stat_activityв разрезах по хостам, базам данных и пользователям: кто наиболее активен, какие виды блокировок встречаются, какие запросы чаще всего на них зависают. - Слепок
pg_stat_activityна любой момент времени с точностью до интервала сбора — например, какие запросы выполнялись позавчера в 03:12 и на чём они висели. - Агрегированная статистика по запросам: какие выполняются долго, сколько ресурсов едят, попадают ли в кеш, используют ли JIT.
Режимов два — стандартный и расширенный, оба бесплатные:
|
Режим |
Что собирает |
Особенности |
|
Стандартный |
Статистику по сессиям и запросам |
Базовый режим. Сама диагностика по умолчанию обычно выключена и включается в настройках кластера |
|
Расширенный |
Статистику по сессиям и запросам, а также планы запросов и статистику по планам |
Прямо в интерфейсе видно, что у запроса, например, три плана и один из них заметно хуже. Можно исследовать запрос на уровне узлов выполнения. Появился позже стандартного, поэтому включён не у всех. |
Переключение между режимами происходит без рестарта PostgreSQL, если диагностика уже включена, — экспериментировать безопасно.
Один из алгоритмов соединения таблиц (JOIN) в PostgreSQL и других СУБД. Название буквально означает «цикл внутри цикла».
Кейс № 1: продакшен «горит», CPU на 100%
Первый сценарий: идут продажи, руководитель пишет, что теряются заказы и деньги, по цепочке диагностики выясняется, что тормозит база, а в мониторинге у неё 100% утилизации CPU без остатка.
Демонстрационный кластер — PostgreSQL 18, два ядра и 8 ГБ оперативной памяти. Нагрузку мы дали через pgbench: лёгкие запросы шли в районе 50 транзакций в секунду, а тяжёлые выполнялись очень медленно — 0,2 транзакции в секунду.
|
Шаг |
Что увидели |
Что сделали |
|
Мониторинг за последний час |
CPU занят полностью; раньше такого не было — значит, что-то изменилось |
Пошли в диагностику производительности |
|
Разрез по сессиям |
Основное ожидание запросов — CPU, и чаще всего на нём замечен один конкретный запрос |
Перешли в статистику по запросам |
|
Статистика за последние 15 минут, сортировка по пользовательскому времени CPU |
Запрос выполнился всего 182 раза, но потребил «невообразимое» количество CPU. Второй по списку выполнился 35 тыс. раз и использовал CPU почти в 18 раз меньше |
Открыли план запроса |
|
История планов |
У запроса единственный план, и он плохой — возможно, после релиза |
Разобрали план |
План можно смотреть в виде графа, в классическом текстовом виде PostgreSQL или как JSON для внешнего аналитического инструмента. Классический текст оказался удобнее всего.
Что было в плане
PostgreSQL оценивал выполнение примерно в 110 тыс. условных единиц стоимости. Спускаясь по узлам к самому дорогому, мы нашли nested loop, на который приходилось 95% стоимости запроса.
Сам запрос простой: из таблицы событий events достать необработанные события в определённых категориях со скором больше 500 и подтянуть детали по пользователю из users. Логично сначала отобрать нужные события, а потом взять данные пользователей.
В плане всё было наоборот: цикл шёл по таблице users, для каждого пользователя по индексу доставались события, а уже потом их фильтровали по признаку обработки, скору и категории. Событий гораздо больше, чем пользователей, — отсюда и цена.
Какой индекс исправил ситуацию
Проверка индексов показала: индекс по скору есть, но он плохой, и планировщик его не выбирает. Нужен свой индекс на таблице events, в котором точно должна быть категория. Мы собрали его так:
- поля
category_idиscore— по ним идёт выборка, хотя скор не очень селективен; - условие
processed = false— вместо того чтобы класть низкоселективное поле в индекс, сделали частичный индекс только по необработанным событиям, потому что обработанные обычно нужны только аналитике; INCLUDE (user_id)— соединение с users идёт поuser_id, и чтобы не ходить за ним в таблицу, добавили поле в индекс.
Индекс создавался около минуты. Статистика по запросам собирается раз в минуту, поэтому мы ожидали увидеть новый план, который лучше предыдущего во всём.
Что изменилось
За пять минут у запроса появился второй план. На графике видно момент, когда старый план сменился новым — как раз когда создался индекс. Новый план выполнился уже гораздо больше раз и потребил гораздо меньше ресурсов: максимальное время упало с 14 787 мс до 510 мс. Те же index scan, но по нужному индексу и без цикла.
CPU при этом остался загружен на 100%: нагрузка действительно высокая, и в такой ситуации базу нужно масштабировать. Но с теми же ресурсами мы стали делать больше работы: лёгкие запросы дошли до 63–70 транзакций в секунду, а тяжёлые ускорились с 0,2 до 7,5 транзакции в секунду — примерно в 15 раз или больше.
Профилирование запросов помогает не всегда: иногда запросы приходится переписывать или всё-таки масштабировать базу.
Кейс № 2: ночной инцидент, который прошёл сам
Второй сценарий — разбор постфактум. Звонили около восьми вечера, на графиках в это время видны аномалии. Переходим к нужному окну: CPU в порядке, с диском и сетью проблем нет. Но среди аномалий видно, что один запрос выполнялся нетипично долго для нашей нагрузки — около 7–9 минут. Запоминаем время: 20:20.
Дальше — вкладка History в диагностике производительности, это слепки pg_stat_activity. Открываем 1 апреля, 20:20. Видим три запроса, два из них висят на блокировках: один пытался обновить заказ с конкретным идентификатором, второй делал SELECT ... FOR UPDATE, чтобы потом обновить. Держала их транзакция, которую кто-то из разработчиков забыл закрыть — что-то делал с заказами руками. На практике причина часто другая: длительный аналитический запрос или ночная очистка базы, которая неожиданно что-то блокирует.
В слепке три запроса, но на самом деле их могло быть много больше: блокировки бывают каскадными, а постфактум по pg_stat_activity этого уже не увидеть — исторической информации там нет. Именно поэтому важно, чтобы слепки снимались автоматически.
Сколько стоит включённая диагностика
Сбор статистики по запросам работает через хуки, которые выполняются до и после каждого пользовательского запроса, — это не бесплатно. С каждой версией PostgreSQL накладные расходы pg_stat_statements снижались, и на новых версиях — 16, 17, 18 — они минимальны, на 15-й чуть дороже.
|
Что измеряли |
Результат |
|
|
Порядка 2–3% |
|
Расширенная диагностика с планами на PostgreSQL 15, синтетическая нагрузка |
До 10% |
|
Расширенная диагностика на PostgreSQL 16, 17, 18 |
Разницы со стандартной в нагрузочных тестах не видно |
|
Оперативная память |
Несколько мегабайт, порядка 10 МБ; объём строго ограничен |
Внутри Яндекса диагностика производительности используется на тех же базах PostgreSQL, и даже на больших базах с реальной нагрузкой деградации мы не наблюдали.
Обычно о диагностике вспоминают, когда инцидент уже идёт, а она не включена, — и постфактум это не помогает. Поэтому включать её стоит заранее. Расширенный режим полезен, когда мало видеть дорогие запросы и хочется понимать, почему они дорогие: не всегда получится выполнить EXPLAIN ANALYZE в продакшене в нужный момент. Запрос с INSERT или UPDATE днём может работать нормально, а ночью — плохо, потому что после удаления данных изменился план. Если план ночью не записан, днём этого уже не отследить.
Как включить диагностику и какой интервал выбрать
Диагностика доступна на любых версиях. При создании или редактировании кластера есть блок «Диагностика производительности», обычно по умолчанию он выключен. В нём выбирают стандартный или расширенный режим и интервалы сбора. Мы советуем минимальные интервалы — 5 или 60 секунд: статистика получается гранулярнее, а на нагрузку это не влияет, интервал лишь определяет, как часто выполняются служебные запросы к базе.
В этой статье:
- Из чего состоит 1С и где в облаке живёт каждый слой
- Разворачиваем 1С в облаке самостоятельно
- А зачем вообще переносить 1С в облако
- PostgreSQL для 1С: отличия от стандартной сборки
- Когда нужна диагностика производительности
- Кейс № 1: продакшен «горит», CPU на 100%
- Кейс № 2: ночной инцидент, который прошёл сам

