Как стать автором
Обновить
161.7
Serverspace
IT-инфраструктура | Удвоение платежа по коду HABR

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

Уровень сложностиСредний
Время на прочтение13 мин
Количество просмотров4.3K
Одна из завершающих публикаций цикла «В облако на работу:… Рецепты от Капитана» в ходе которых был собран полнофункциональный рабочий контур 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 за предоставленное оборудование, без поддержки собрать такой пингвинариум мне было бы негде.



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



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





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





 

Теги:
Хабы:
+1
Комментарии2

Публикации

Информация

Сайт
serverspace.ru
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия
Представитель
Danial Fedorov

Истории