Поузловое обновление версии компонента 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, необходимо:

  1. Внести информацию в конфигурационный файл 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.
...
  1. Произвести запуск playbook rolling_upgrade.yml ручным способом или с помощью Jenkins (описано ниже).

  2. Запустить 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 прервется с ошибкой Не выбраны хосты.