Рассмотрим ситуацию, близкую к критической: имеется переписанная база 1С:Розница с более чем 200 узлами распределенной информационной базы (РИБ). Узлы разделены на два центра (примерно по 100 магазинов в каждом). Проблема заключается в том, что штатный обмен между двумя центрами идет нестабильно и крайне долго — от 10 до 12 часов. При этом каждый центр обменивается со своими периферийными узлами достаточно быстро. Проанализируем причины такого поведения и разберем по шагам эффективные методы решения этой сложной инфраструктурной задачи.
Прежде чем приступать к реструктуризации базы, выясним причины, по которым два мощных центральных узла не могут быстро синхронизировать данные. Длительный обмен часто обусловлен комплексом проблем на разных уровнях архитектуры:
Разберем идею с разделением потоков данных. Создание нескольких независимых планов обмена (например, группировка магазинов по 5-10 штук в отдельные пулы) — это полностью рабочая практика для высоконагруженных систем.
Разделение данных позволяет настроить параллельные фоновые задания по выгрузке и загрузке сообщений. Если дисковая подсистема и процессоры серверов обладают достаточным запасом производительности, многопоточный обмен между центрами сократит общее время в несколько раз.
Важное условие: пулы обмена не должны пересекаться по общим изменяемым данным (например, централизованным справочникам, которые часто редактируются), иначе при параллельной загрузке возникнут взаимные блокировки (Deadlocks) на уровне СУБД. Рекомендуется один поток выделить под нормативно-справочную информацию (НСИ), а остальные — строго под документы конкретных магазинов.
Проанализируем альтернативный архитектурный подход. Вместо того чтобы заставлять два рабочих центра, нагруженных пользователями, обмениваться между собой гигантскими массивами данных, мы можем вынести процесс обмена в отдельную среду.
Перевод на такую схему можно осуществлять плавно: переносить актуальную НСИ и текущие остатки по одному узлу, постепенно отключая их от старых центров и подключая к новой ЦБ.
Частая проблема при чтении объемных XML-файлов обмена — нехватка оперативной памяти и длительные удержания транзакций. Обязательно посмотрим на настройки узлов обмена.
Ключевая настройка для таких объемов — параметр КоличествоЭлементовВТранзакции. Если база пытается записать весь пакет обмена (десятки тысяч объектов) за одну транзакцию, это блокирует таблицы SQL. Дробление транзакций (например, по 500–1000 элементов) позволяет регулярно фиксировать изменения в БД, снижая нагрузку на систему и позволяя параллельным процессам получать доступ к таблицам.
В распределенных базах на 200+ узлов таблицы регистрации изменений имеют свойство накапливать мусор. Для ускорения выгрузки выполним следующие шаги:
Исторически в 1С:Розница чеки ККМ обязательно передавались в центр для аналитики и оформления возвратов. Сегодня, при наличии онлайн-касс и ОФД, хранить каждый чек в центральной тяжелой базе нецелесообразно.
Рассмотрим современный подход:
Чеки и данные продаж занимают львиную долю трафика. Создайте отдельное легковесное хранилище (например, базу на базе 1С с доступом через HTTP-сервисы или внешнюю SQL-таблицу) исключительно для чеков. Периферийные узлы будут отправлять туда данные о продажах напрямую с помощью легковесных JSON или XML пакетов через REST API, минуя тяжелый механизм РИБ.
В самой РИБ на точках должны мигрировать только актуальные цены, остатки, дисконтные системы (лучше вынести на отдельный сервер лояльности) и документы движения за текущий период. Это радикально сократит объем передаваемых данных и время обмена между двумя центральными узлами упадет с 10-12 часов до 20-30 минут.