Поузловое обновление версии компонента SMBX на кластере без недоступности#
Предварительно рекомендуется создать архивную копию кластера. Сценарий создания архивной копии описан в разделе Работа с кластером.
Важно: По умолчанию при обновлении режим шифрования будет сменен на disc_only. Если переход на disc_only не требуется, то необходимо присвоить параметру switch_to_disk_only_enc_mode значение false
ВАЖНО! При использовании MessagePlugin не рекомендуется использовать настройку TIMESTAMP_HEADERS_MODE отличную от OFF при использовании протокола AMQP, так как AMQP сообщения по спецификации являются неизменяемыми (immutable) и изменение сообщение (в данном случае добавление заголовка) перед отправкой на клиент может вызвать проблемы при больших нагрузках. Например:
2024-06-04 14:21:16.250 [Thread-3 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$6@4012d5bc)] WARN org.apache.activemq.artemis.core.server - AMQ222215: Global Address Size has negative and inconsistent value as -64
2024-06-04 14:21:16.250 [Thread-3 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$6@4012d5bc)] WARN org.apache.activemq.artemis.core.server - AMQ222214: Destination test-bridge has an inconsistent and negative address size=-64.
2024-06-04 14:21:18.263 [Thread-2 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$6@4012d5bc)] WARN org.apache.activemq.artemis.core.server - AMQ222215: Global Address Size has negative and inconsistent value as -64
WARN o.a.q.jms.provider.amqp.AmqpConsumer - Error on transform: class java.util.ArrayList cannot be cast to class org.apache.qpid.proton.amqp.messaging.Section (java.util.ArrayList is in module java.base of loader 'bootstrap'; org.apache.qpid.proton.amqp.messaging.Section is in unnamed module of loader 'app')
В процессе обновления происходит чтение топологии кластера для дальнейшей проверки вхождения брокера в топологию (после его обновления).
Перед обновлением версии SMBX в кластере происходит предварительное чтение топологии кластера (в память текущей задачи SMBX попадают данные о количестве и конфигурации брокеров в данном кластере).
После этого запускается поузловое обновление кластера.
При этом после обновления каждого брокера кластера (осуществляется обновление версии SMBX и перезапуск работы брокера) производится проверка, что каждый обновленный брокер восстановил работу в кластере. Таким образом происходит проверка соответствия первичной топологии кластера.
Если после обновления брокер не запускается — происходит прерываение работы процесса на проверке вхождения в топологию. После чего необходимо либо восстановить архивную копию кластера, либо проанализировать логи, исправить ошибки конфигурирования и перезапустить процесс обновления кластера.
По умолчанию для сценария поузлового обновления версии SMB применяются параметры:
rolling_upgrade:
distr: artemis.zip # путь до приложения относительно /files
installdir: path/to/artemis/.new_release # временная директория для новых бинарных файлов
check_cluster_join: true # Проверка восстановления топологии кластера. По умолчанию осуществляется проверка вхождения брокера в топологию кластера
wait_for_cluster_join: 120 # время (в секундах) на ожидание восстановления топологии кластера (падает с ошибкой при превышении)
switch_to_disk_only_enc_mode: true # Принудительное переключение режима шифрования на disk_only
При необходимости изменения параметров по умолчанию требуется до начала процедуры обновления внести данные параметры в файл vars.yml и придать им нужные значения.
Перед запуском обновления на версию 2.3.0 необходимо проверить в vars.yml наличие параметров artemis.cluster_password и password_encoder_cli_path:
password_encoder_cli_path: encryptor-cli-2.4.0-fatjar.jar # утилита для шифрования паролей
artemis:
cluster_password: PLACEHOLDER
Важно:
Для добавления новых (одного из) протоколов CORE/AMQP/MQTT/STOMP, а также для применения значения параметра address_full_policy = PAGE, необходимо:
Внести информацию в конфигурационный файл vars.yml:
...
artemis:
protocols: CORE,AMQP,MQTT # доступные протоколы при подключении к data_port через запятую (доступны CORE/AMQP/MQTT/STOMP). Значения по умолчанию: CORE,AMQP,MQTT
...
artemis_queues:
defaults: # дефолтные значение конфигурации очереди
address_full_policy: PAGE # PAGE / DROP / FAIL / BLOCK. PAGE - is default for persistent cluster.
# If the value is PAGE then further messages will be paged to disk.
# If the value is DROP then further messages will be silently dropped.
# If the value is FAIL then the messages will be dropped and the client message producers will receive an exception.
# If the value is BLOCK then client message producers will block when they try and send further messages.
...
Произвести запуск playbook rolling_upgrade.yml ручным способом или с помощью Jenkins (описано ниже).
Запустить Jenkins job artemis_custom playbook artemis.yml, используя tag broker_update. Важно: данный тег необходимо использовать либо с тегом
restart, либо с тегамиstopиstartодновременно.
Ручной способ#
На сервере, с которого производилась установка, выполнить команду:
ansible-playbook -i inventories/<ID>/inventory rolling_upgrade.yml --ask-vault-pass
, где ID — имя созданного inventory.
С помощью Jenkins#
Наименование задания Jenkins: artemis_custom.
Параметры запуска:
job_config_renew— параметр, использующийся для перенастройки задания Jenkins. Меняет значения по умолчанию всех параметров, обновляет список inventory. Сохраняет предыдущее состояние параметров inventories_repo, inventories_branch, inventories_path. Обновляет список тегов для всех playbooks. По умолчанию не указывается;inventory— выбратьinventory, для которого необходимо произвести последовательное обновление;nexusUrl— полный путь до дистрибутива (можно указать несколько через запятую);playbook— указать значение rolling_upgrade.yml;tags— список tags для запуска:install_all_hosts— запуск задания Jenkins на всех хостах из указанного inventory;only_on_host— выбрать необходимые хосты.
emailTo— список адресов электронной почты для отправки технических писем с логами;custom_vault_password— указывается, если нужен ручной ввод пароля для Ansible Vault;jenkins_slave— выбор Slave Jenkins;jdk_tool— указать Jenkins Tool с нужной версией JDK;ansible_branch— ветка скриптов развертывания (в настройках Jenkins Job указать ${ansible_branch});ansible_version— версия используемого ansible, например ansible29;nexus_user_cred— Jenkins Username With Password Credential ID для выкачивания дистрибутива устанавливаемого компонента из Nexus. Чтобы получить username и password для Nexus из SecMan, надо заполнить поле secman_url и это поле в формате:
JenkinsCredID|SecManPath:SecManKeys|SecManParams
Здесь:
JenkinsCredID - Jenkins Vault App Role Credential ID c реквизитами для подключения к SecMan;
SecManPath - Путь к секретам в SecMan;
SecManKeys - Имена полей для username и password в SecMan через запятую;
SecManParams - Параметры для подключения к SecMan через точку с запятой. Могут быть пропущены вместе с |, если параметры по умолчанию;vault_cred— Jenkins secret file credential ID со строкой для расшифровки паролей ansible vault (можно несколько через запятую). Чтобы получить ansible vault password из SecMan, надо заполнить поле secman_url и это поле в формате:
JenkinsCredID|SecManPath:SecManKey|SecManParams
Здесь:
JenkinsCredID - Jenkins Vault App Role Credential ID с реквизитами для подключения к SecMan;
SecManPath - Путь к секрету в SecMan;
SecManKey - Имя поля для ansible vault password в SecMan;
SecManParams - Параметры для подключения к SecMan, через точку с запятой. Могут быть пропущены вместе с |, если параметры по умолчанию (в качестве пароля можно использовать не строку, а файл в base64 формате и секрет в SecMan с именем, оканчивающимся на „Base64“, например myVaultBase64);server_ssh_cred— ID credential типа ssh key для подключения к серверам. При задании параметра secman_url - полный путь в HashiCorp Vault, например {ID credential типа vault app role для получение секретов из HashiCorp Vault}|/<путь до>/ssh:{пользователь},{ключ},{passphrase} (в качестве ключа можно использовать не строку, а файл в base64 формате с ключом секрета, заканчивающимся на Base64, например myPrivateKeyBase64);secman_url— URL для подключения к HashiCorp Vault;ssl_verify— проверяем, являются ли сертификаты HashiCorp Vault/Nexus доверенными;inventories_repo— репозиторий с inventory (ssh://);inventories_branch— ветка репозитория;inventories_path— путь до inventories от корня репозитория.
Если не выбран ни один из параметров only_on_host, install_all_hosts выполнение задания Jenkins прервется с ошибкой Не выбраны хосты.