Работа с многоузловыми кластерами 1С:Предприятия часто сопровождается сложностями в настройке программного лицензирования. Особенно остро это проявляется при попытке реализовать отказоустойчивость на лицензиях уровня ПРОФ. В данной статье мы разберем причины возникновения типовых ошибок в технологическом журнале (ТЖ) и выстроим оптимальную стратегию конфигурации серверного кластера.
Рассмотрим ситуацию, когда в ТЖ появляется запись: Ошибка программного лицензирования. Файл программной лицензии не предусматривает возможность запуска клиентских приложений 1С:Предприятия или внешних соединений. При этом система указывает на конкретный файл .lic, который является лицензией на сервер.
Проанализируем механизм поиска лицензии платформой. Когда менеджер кластера rmngr или рабочий процесс rphost инициирует проверку лицензии, он сканирует все файлы в каталоге C:\ProgramData\1C\licenses. Платформа поочередно открывает каждый файл с расширением .lic. Если первым в списке оказывается файл серверной лицензии, система фиксирует в логах, что он не подходит для запуска клиента. Это не всегда означает ошибку — если следом за этим сообщением нет записи о критическом отказе, значит, система просто перешла к следующему файлу и успешно нашла клиентскую лицензию.
Разберем более серьезную ошибку: Ошибка программного лицензирования. Неверный формат файла программного лицензирования File=src\CryptoGeneralHelpers.cpp. Часто она сопровождается системным сообщением WSACancelBlockingCall (код 10004).
Выясним причину этой взаимосвязи. Ошибка WSACancelBlockingCall указывает на прерывание блокирующей операции сокета. В контексте лицензирования это происходит по следующим причинам:
Посмотрим на специфическую ошибку кластера: Первичный вызов сервиса пришел в пассивный сервис. Активный сервис на менеджере.... Это прямое следствие работы отказоустойчивого кластера.
В кластере с несколькими центральными серверами службы работают по принципу «один активный — остальные пассивные». Если из-за сетевых проблем или высокой нагрузки менеджеры кластера теряют связь друг с другом, возникает ситуация «Split-brain», когда клиент пытается получить лицензию у сервера, который перешел в пассивный режим. Для лицензий ПРОФ это часто решается только через ТребованияНазначенияФункциональности или полный перезапуск службы Agent 1C:Enterprise на всех узлах.
Для минимизации проблем с распределением лицензий в кластере рекомендуется выделить один из серверов под роль Сервера лицензирования. Рассмотрим, как это сделать без покупки дополнительных серверных лицензий:
Сервис выберем значение Сервис лицензирования.Назначать для выбранного сервера и Не назначать для всех остальных узлов кластера.Важно: При использовании лицензий ПРОФ серверные лицензии лучше оставлять локально на каждом физическом сервере, а на выделенный сервер лицензирования переносить только многопользовательские клиентские лицензии.
Проанализируем параметры перезапуска рабочих процессов в свойствах кластера. Установка интервала перезапуска может помочь при утечках памяти, но не решит проблемы с лицензированием напрямую.
Рекомендуемые параметры для стабильной работы:
86400 секунд (раз в сутки). Это позволит системе плавно завершать старые процессы rphost и переводить соединения на новые, очищая накопленные ошибки.600 секунд. Это дает активным пользователям время завершить транзакции.Иногда ошибки, похожие на лицензионные, возникают внутри прикладного решения. Например, при выполнении фоновых заданий может сработать проверка сложности пароля или динамическое обновление. Рассмотрим пример кода, который инициирует периодические проверки на сервере:
Процедура ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры) Экспорт
Параметры.Вставить("КонфигурацияБазыДанныхИзмененаДинамически",
КонфигурацияБазыДанныхИзмененаДинамически
Или Справочники.ВерсииРасширений.РасширенияИзмененыДинамически);
// Вызов служебных процедур для контроля сессий
ПользователиСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЦентрМониторинга") Тогда
МодульЦентрМониторингаСлужебный = ОбщегоНазначения.ОбщийМодуль("ЦентрМониторингаСлужебный");
МодульЦентрМониторингаСлужебный.ПриВыполненииСтандартныхПериодическихПроверокНаСервере(Параметры.ЦентрМониторинга);
КонецЕсли;
КонецПроцедуры
Если в момент выполнения этой процедуры сервер 1С теряет связь с DBMS (СУБД) из-за блокировок или сетевых проблем, в ТЖ могут посыпаться ошибки об «отказе в подключении» (10061), которые часто путают с проблемами лицензирования.
Для поддержания стабильности системы выполним следующие шаги:
.oldlic являются архивными копиями. Их следует переместить в отдельную папку вне каталога 1C/licenses, чтобы платформа не тратила ресурсы на их сканирование.rmngr.exe, rphost.exe и папку с лицензиями в исключения антивирусного ПО на всех серверах кластера.КоличествоИБНаПроцесс и требования назначения функциональности, чтобы снизить на него нагрузку.