Построение отказоустойчивого кластера 1С Предприятие 8.3. Требования назначения функциональности. MythBusters

от автора

Одна из завершающих публикаций цикла «В облако на работу:… Рецепты от Капитана» в ходе которых был собран полнофункциональный рабочий контур 1С в сети на отечественной Ред ОС. С веб-серверами, доменной авторизацией, архивированием и прочая прочая… На закуску разбираемся с отказоустойчивостью. В этой публикации для серверов 1С, заодно попробуем подобно сериалу «Разрушители легенд» подтвердить или опровергнуть пару устойчивых мифов о требованиях назначения функциональности.

В начале июля, в чрезвычайно жаркое время, под вечер,
один молодой человек вышел из своей каморки,
которую нанимал от жильцов в С — м переулке,
на улицу и медленно, как бы в нерешимости, отправился к К — ну мосту.
На улице жара стояла страшная, к тому же духота, толкотня,
всюду известка, леса, кирпич, пыль и та особенная летняя вонь,
столь известная каждому петербуржцу, не имеющему возможности нанять дачу,
— всё это разом неприятно потрясло и без того уже расстроенные нервы юноши. 

©Ф. М. Достоевский. Преступление и наказание

 

Впрочем о чем это я… Давайте вернемся к 1С.
В прошлой, достаточно объемной статье мы собрали отказоустойчивый кластер PostgreSQL, в этой соберем отказоустойчивый кластер из двух серверов 1С.
Это на порядок проще и к тому же можно делать в графическом интерфейсе, что приятно глазу.
Не стоило бы тревожить клавиатуру и отвлекать почтенную публику из-за таких несложных действий.
Занимает это с учетом записи видео и принтскринов минут 15.
Однако хотелось бы, чтобы чтобы такие сервисы, как журнал регистрации и полнотекстового поиска, не мотались, как институтка на гусарском балу, а были в меру доступности привязаны к определенному серверу.С этого момента и начинаются недопонимания или как красиво говорила Фелин Херманс — замешательство (см. публикацию Гостья из будущего. Обзор книги Фелин Херманс «Ум программиста. Как понять и осмыслить любой код»)
То есть статья будет не о том как собрать отказоустойчивый кластер 1С Предприятие 8.3, в ней мы разберем несколько утверждений сказанных с высоких трибун технических конференций о требованиях назначения функциональности.

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

«Главная проблема цитат в интернете в том,
что люди сразу верят в их подлинность»
В. И. Ленин
этого не говорил

 

Хотя описание, достаточно внятное, есть на ИТС

Еще лучше, найти на том же ИТС описание текстовых файлов настроек и посмотреть как и что в них изменяется при изменении в консоли администрирования.
Это даст с одной стороны более глубокое понимание процесса, а с другой, отличный инструмент для управления кластером со стороны DevOps, например уверенное отключение регламентных заданий, если это контур разработки.

В благословенные времена, когда семинары проходили не онлайн, а в конференц-холлах, обязательно на галерке сидел технически продвинутый человек, который рвал на себе волосы показывая пальцем в докладчика и тихим шепотом советуя так не делать.
Причем количество волос на голове этого человека намекало, на скольки конференциях он уже побывал.

Мне в этом отношении комфортнее, я по другую сторону монитора и я не собираюсь ни в кого кидать помидоры.
Скорее дать метод, которым желающие смогут проверить справедливость любого утверждения о настройках кластера 1С, ведь это обычный текстовый файл и понять как было/стало можно любой утилитой сравнения файлов.
Проверим его например на пересоздании кластера.
Все эксперименты, которые описаны в публикации не надо воспроизводить на рабочих серверах!

Для клиентских соединений применяется более сложная логика, подробнее на ИТС — 2.2.7.3.3. Назначение рабочих процессов!

Скопируем файл списка кластеров srvribrg.lst с рабочего сервера, остановим сервис 1С, удалим все файлы из рабочего каталога центрального сервера и запустим сервис 1С.
Создастся новый кластер с новым GUID
Это можно увидеть в сравнив файлы

Принцип вы поняли, только нам будет нужен файл реестра кластера 1CV8Clst.lst из каталога reg_<номер_порта_кластера> в данном случае reg_1541

Тем кто не любит много букв

В этой публикации рассмотрим построение отказоустойчивого кластера 1С и требования назначения функциональности.

Кто не любит читать вообще, может посмотреть видео.

youtube
rutube
vk.video

Остальные, добро пожаловать.

Кто прочитает до конца, получит бонус: Скрипт обновления платформы 1С на рабочих серверах с сохранением настроек и т.п.

Постановка задачи

Поскольку настройка серверов получилась уже достаточно сложная, то удостоверимся, что все включилось и работает, для контура который не запускался три месяца это очень актуально.
Спасибо коллегам из компании ©Serverspace, что они не удалили весь контур.

#Статус и состояние сервиса etcd
systemctl status etcd.service —no-pager -l
ENDPOINTS=red8-cln01.test.loc:2379,red-srv.test.loc:2379,red8-srv.test.loc:2379
etcdctl —write-out=table —endpoints=$ENDPOINTS endpoint status

#Статус и состояние сервиса vip-manager
systemctl status vip-manager.service —no-pager -l

#Статус и состояние сервиса patroni
systemctl status patroni.service —no-pager -l
/usr/local/bin/patronictl —config-file /etc/patroni/patroni.yml topology cluster-1c

#Статус и состояние сервиса сервера 1С
systemctl status srv1cv8-8.3.24.1467@default —no-pager -l

Контроллер домена, сервер Windows 2012 R2, домен AD уровня Windows 2012. dc.test.loc
Рабочая станция Windows 10. win-cln01.test.loc
Рабочая станция РедОС 8. red8-cln01.test.loc
Сервер 1С РедОС 8 настроенный. red8-srv.test.loc
Сервер 1С РедОС 8 настраиваемый. red-srv.test.loc
Postgres 16 от PostgresPro
1С Предприятие 64-х 8.3.24.1467
все в домене test.loc. 
Имя домена *.local не рекомендуют коллеги РедОС.
все по железу 4ГБ RAM 50ГБ SSD 2 Ядра CPU
все развернуто в облаке из оригинальных iso образов производителей для чистоты эксперимента.

Исходное состояние — два независимых локальных кластера на двух серверах 1С

На раз-два-три

  1. Выбираем один серверов, который будет образцом, удаляем у второго сервера 1С собственный кластер
  2. Добавляем его в кластер соседа
  3. Устанавливаем флажок «Центральный сервер» в свойствах добавленного сервера
  4. Устанавливаем уровень отказоустойчивости в свойствах кластера
  5. Настраиваем требования назначения функциональности
  6. Не забываем в строке соединения базы(баз) 1С прописать оба сервера через запятую без пробелов.

Целевое состояние — отказоустойчивый кластер с балансировкой нагрузки на двух серверах 1С

Далее переходим к проверке некоторых утверждений aka ©MythBusters.

Самое распространенное из них
№1 Требования назначения функциональности применятся при перезагрузке сервера 1С


Сохраняем исходный файл 1CV8Clst.lst
Назначаем журнал регистрации на один сервер, полнотекстового поиска на другой.
Сохраняем файл еще раз в другой каталог
Сравниваем и видим что заполнилась секция с настройками требований назначения функциональности.
Перезагружаемся в любом порядке и видим что файл настроек кластера не поменялся.
Как и расположение сервисов, легко увидеть их подкаталоги внутри каталога ИБ.

Зато его меняет применение требований назначения функциональности в свойствах кластера.
Видно, что примененные требования попали совсем в другую секцию файла.

И уже после этого указанные сервисы расходятся по назначенным серверам.
Итог: утверждение №1 это миф

 

№2 Требования назначения функциональности применяются по алфавитному упорядочиванию серверов 1С


Часть последователей этого утверждения знает, видело на ИТС фразу:
Обход серверов и требований выполняется в порядке следования этих объектов в консоли кластера.
но искренне верит, что сервера в консоли кластера 1С упорядочены по алфавиту.
Возможно потому, что сервера упорядочены в правой панели просмотра консоли администрирования.
Даже не надо заглядывать в файл 1CV8Clst.lst чтобы убедится, что сервера в консоли упорядочиваются в порядке добавления.
Достаточно удалить идущий первым по алфавиту и добавить его заново, теперь он будет вторым.
Соответственно и требования назначения функциональности с него будут обработаны позже.

В нашем примере, если мы создали требование назначения функциональности для журнала регистрации с типом требования «Назначать» на обоих серверах, то если они оба доступны, оно сработает для верхнего в консоли администрирования, а не в алфавитном порядке.
Если верхний сервер недоступен, то менеджер кластера применит требование назначения функциональности со следующего по порядку.
Главное, чтобы оно там было с типом требования «Назначать».
Если его нет больше ни на одном сервере или оно есть с типом требования «Авто», то мы получим ошибку вида «Сервис недоступен» 

Итог: утверждение №2 это миф

 

Как разновидность утверждения №2 встречается №3 Для типа требования «Назначать» имеет значение свойство «Приоритет»


При разборе предыдущего примера мы увидели, что это не так и на ИТС буквами по белому написано:
Обход серверов и требований выполняется в порядке следования этих объектов в консоли кластера.
Сложно поверить, но это действительно так. Это не ошибка платформы, а действительно логика ее разработчиков

Итог: утверждение №3 это миф

В этом месте обычно резонный вопрос: Зачем тогда вообще свойство «Приоритет»?

Для типа требования «Авто»

В итоге мы приходим к правильному пути конфигурирования требований назначения функциональности

Для того чтобы сервис назначался на один из серверов при его доступности, вне зависимости от расположения в консоли кластера и обеспечивалась отказоустойчивость решения, то есть при недоступности этого сервера, назначался на следующий,

надо тип требования установить в «Авто», а приоритет в более высокое значение,

чем на остальных серверах, где так же тип требования установить в «Авто».

 

Тем, кто дочитал до конца, обещанный скрипт обновления платформы 1С на РедОС и совместимых с ним.
Использование программы: $PROGNAME параметр1 параметр2
Первый параметр это номер обновляемой версии 1С, если 0 то чистая установка
Второй параметр это номер новой версии 1С»
Файл установки 1С должен находиться в одном каталоге со скриптом
Если указан номер обновляемой версии 1С, то должен существовать каталог установки
Что он умеет.

  • Распаковать архив установки
  • Сохранить файлы старых служб с возможными нетиповыми настройками
  • Установить новую версию платформы 1С
  • Удалить старую версию платформы 1С
  • Заменить версию платформы в веб публикациях
  • Запустить службы

Если непонятно запишу видео

На гитхаб выкладывать пока не планирую, хочу сделать версию на 1С: Исполнителе.
Это кошерно, интересно хватит ли у него возможностей, для этого надо его выучить)

скрипт обновления платформы 1С на РедОС и совместимых с ним

#!/bin/bash

PROGNAME=»$(basename «$0″)»

usage() {
    echo -e «Использование программы: $PROGNAME параметр1 параметр2 \nПервый параметр это номер обновляемой версии 1С, если 0 то чистая установка \nВторой параметр это номер новой версии 1С»
    echo -e «Файл установки 1С должен находиться в одном каталоге со скриптом \nЕсли указан номер обновляемой версии 1С, то должен существовать каталог установки»
    echo «Пример: $PROGNAME 0 8.3.24.1586»
    echo «Пример: $PROGNAME 8.3.23.1586 8.3.24.1586»
    return
}
replace_version() {
    perl -i»*_${current_date}.bak» -pE «s/${old_version}/${new_version}/i» ${bak_dir}/${1}
    return
}
http_replace_version() {

    file_found=$(grep -ci «${old_version}» ${1})
    if [[ ${file_found} -gt 0 ]]; then
        echo «Изменяется версия в файле веб публикации ${1}»
        regular_exp=»s/${old_version}/${new_version}/gi»
        perl -i»*_$(date +’%Y%m%d_%H%M%S’).bak» -pE «${regular_exp}» ${1}
    fi
    return
}
if [[ «$(id -u)» -ne 0 ]]; then
    echo «Скрипт должен быть запущен с правами администратора»
    exit 1
fi

#Проверить число аргументов
#если не 2 то вывести справку
if (($# != 2)); then
    usage
    exit 1
fi
old_version=$1
new_version=$2
current_date=$(date +’%Y%m%d_%H%M%S’)
echo ‘Проверяется существование архива/файла установки’
#если архив то разархивировать
new_archive=$(echo server64_${new_version//./_}.zip)
new_file=$(ls -1 *-${new_version}-*.run 2>/dev/null)
if [[! -f ${new_archive} ]] && [[! -f ${new_file} ]]; then
    echo «Не обнаружен файл установки или архива новой версии 1C $new_archive»
    exit 1
elif [[ -f ${new_archive} ]] && [[! -f ${new_file} ]]; then
    unzip -o ${new_archive} *-${new_version}-*.run
fi
new_file=$(ls -1 *-${new_version}-*.run)
if [[! -f ${new_file} ]]; then
    echo «Не обнаружен файл установки новой версии 1C $new_file»
    exit 1
fi

if [[ «${old_version}» != «0» ]]; then
    echo ‘Старая версия не 0, проверяется существование каталога установки’
    if [[! -f /opt/1cv8/x86_64/${old_version}/uninstaller-full ]]; then
        echo «Не обнаружен каталог обновляемой версии 1C $old_version»
        exit 1
    fi
fi

if [[ «${old_version}» != «0» ]]; then
    echo ‘Сохраняются файлы старых служб с возможными нетиповыми настройками’
    bak_dir=./bak_${current_date}
    if [[! -d ${bak_dir} ]]; then
        mkdir ${bak_dir}
        cp /opt/1cv8/x86_64/${old_version}/srv1cv8-${old_version}@.service ${bak_dir}/srv1cv8-${new_version}@.service
        cp /opt/1cv8/x86_64/${old_version}/ras-${old_version}.service ${bak_dir}/ras-${new_version}.service
    fi

    replace_version «srv1cv8-${new_version}@.service»
    replace_version «ras-${new_version}.service»

    echo ‘Останавливается старая версия платформы 1С’
    old_service_1=/etc/systemd/system/srv1cv8-${old_version}@.service
    old_service_2=/etc/systemd/system/multi-user.target.wants/srv1cv8-${old_version}@default.service
    old_service_3=/etc/systemd/system/srv1cv8-${old_version}@default.service
    if [[ -f ${old_service_1} ]]; then
        systemctl stop srv1cv8-${old_version}@default.service
        systemctl disable srv1cv8-${old_version}@default.service
        systemctl daemon-reload
        systemctl reset-failed srv1cv8-*
    fi
    if [[ -f ${old_service_1} ]]; then
        rm ${old_service_1}
    fi
    if [[ -f ${old_service_2} ]]; then
        rm ${old_service_2}
    fi
    if [[ -f ${old_service_3} ]]; then
        rm ${old_service_3}
    fi
    echo ‘Останавливается старая версия RAS’
    old_service_1=/etc/systemd/system/ras-${old_version}.service
    old_service_2=/etc/systemd/system/multi-user.target.wants/ras-${old_version}.service
    if [[ -f ${old_service_1} ]]; then
        systemctl stop ras-${old_version}.service
        systemctl disable ras-${old_version}.service
        systemctl daemon-reload
        systemctl reset-failed ras-*
    fi
    if [[ -f ${old_service_1} ]]; then
        rm ${old_service_1}
    fi
    if [[ -f ${old_service_2} ]]; then
        rm ${old_service_2}
    fi
fi
echo ‘Производится установка новой версии платформы 1С’
./${new_file} —mode unattended —enable-components «server,ws,server_admin,additional_admin_functions,liberica_jre,ru»

echo ‘Проверяется, что новвая версия установилась’
new_service=/opt/1cv8/x86_64/${new_version}/srv1cv8-${new_version}@.service
if [[! -f ${new_service} ]]; then
    echo «Некорректно установилась новая версия 1C $new_archive»
    exit 1
fi
if [[ «${old_version}» != «0» ]]; then
    echo ‘Удаляется старая версия платформы 1С’
    /opt/1cv8/x86_64/${old_version}/uninstaller-full —mode unattended
    if [[ -f ${bak_dir}/srv1cv8-${new_version}@.service ]]; then
        echo ‘Сохраняется файл новой службы 1C и копируется старый файл службы в новый каталог’
        mv /opt/1cv8/x86_64/${new_version}/srv1cv8-${new_version}@.service ${bak_dir}/srv1cv8-${new_version}@.service.new
        cp ${bak_dir}/srv1cv8-${new_version}@.service /opt/1cv8/x86_64/${new_version}/srv1cv8-${new_version}@.service
    fi
    if [[ -f ${bak_dir}/ras-${new_version}.service ]]; then
        echo ‘Сохраняется файл новой службы RAS и копируется старый файл службы в новый каталог’
        mv /opt/1cv8/x86_64/${new_version}/ras-${new_version}.service ${bak_dir}/ras-${new_version}.service.new
        cp ${bak_dir}/ras-${new_version}.service /opt/1cv8/x86_64/${new_version}/ras-${new_version}.service
    fi

fi
echo ‘Запускаются службы 1С’
systemctl link /opt/1cv8/x86_64/${new_version}/srv1cv8-${new_version}@.service
systemctl enable srv1cv8-${new_version}@default —now

systemctl link /opt/1cv8/x86_64/${new_version}/ras-${new_version}.service
systemctl enable ras-${new_version}.service —now

sleep 30

systemctl status srv1cv8-${new_version}@default —no-pager -l
systemctl status ras-${new_version}.service —no-pager -l

if [[ «${old_version}» != «0» ]]; then
    if [[ -d ‘/etc/httpd’ ]]; then
        readarray -d » -t find_files < <(find /etc/httpd -name ‘*.conf’ -size +1c -type f -print0)
        for i in ${find_files[*]}; do http_replace_version $i; done

        echo ‘Перезапускается веб сервер’
        systemctl restart httpd
    fi
fi
 

Планы на будущее:

Осталась положить вишенку на торт — провести нагрузочное тестирование и определиться с быстродействием сервера.
Это финал любого порядочного внедрения.

Благодарности:

Благодарю компанию ©Serverspace за предоставленное оборудование, без поддержки собрать такой пингвинариум мне было бы негде.

Желающие знают, где меня искать, время за пределами рабочего.

Статья продолжает серию публикаций:

Серия «Рецепты от Капитана» на всякий случай

 


ссылка на оригинал статьи https://habr.com/ru/articles/851598/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *