Как обновить общее приложение, работающее на отказоустойчивом кластере Windows

Я хочу использовать для своего приложения общую роль службы отказоустойчивого кластера Windows. и я пытаюсь выяснить, как выполнить обновления.

Я читал, что есть возможность выполнить обновление с учетом кластера, IE: передать кластеру MSI \ installer и позволить ему отвечать за обновление всех узлов.

Кто-нибудь, кто использовал эту функцию, может:

  1. Можете описать, как он это сделал?
  2. Существуют ли какие-то особые требования для его включения?
  3. Это рекомендуется?

1 ответ

Мы сгруппировали службы Windows, которые используют .NET стек. На данный момент каждая роль кластера размещается только на двух узлах. Процесс развертывания и обновления выполняется через Ansible, Следующие фрагменты относятся только к части обновления.


Для развертывания сервиса используются Nuget пакеты. Используемый .nuspec представлен ниже. Таким образом, пакеты представляют собой .zip архив, который содержит весь контент в корне.

<?xml version="1.0"?>
<package>

  <metadata>
    <id>$Id$</id>

    <version>$Version$</version>
    <authors>$Authors$</authors>

    <description> $Description$ </description>
    <releaseNotes>$ReleaseNotes$</releaseNotes>
  </metadata>

  <files>
    <file src="$PackageInput$" target=" "/>
  </files>

</package>

Описанную ниже роль можно использовать для составных ролей кластера, когда одна роль кластера содержит несколько ресурсов.

- name: 'Copy the cluster_role.ps1 to all hosts'
  win_copy:
    src : 'cluster_role.ps1'
    dest: 'cluster_role.ps1'

Эта задача необходима для копирования на все хосты PowerShell скрипт, который необходим для обнаружения узла-владельца и для перемещения роли между узлами.

param([String]$ClusterRoleName, [String]$ExcludeNode)

# Task: Define the owner node
if ($ClusterRoleName -ne [string]::Empty -and $ExcludeNode -eq [string]::Empty)
{
    Get-ClusterResource -Name $ClusterRoleName | Format-List -Property OwnerNode
    exit
}

# Task: Move the cluster role
if ($ClusterRoleName -ne [string]::Empty -and $ExcludeNode -ne [string]::Empty)
{
    Move-ClusterGroup $ClusterRoleName (Get-ClusterNode | Where-Object { $_.State -eq 'Up' -and $_.Name -ne $ExcludeNode })
    exit
}

- name: 'Define the owner node'
  win_shell: 'cluster_role.ps1 -ClusterRoleName {{ cluster_role }}'
  register: owner_node
  run_once: True
  when: 'cluster_role is defined'


- name: 'Define the owner node metadata'
  set_fact:
    owner_node_host: '{{ owner_node.stdout.split(":")[1] | trim }}.{{ windows_domain }}'
    owner_node_name: '{{ owner_node.stdout.split(":")[1] | trim }}'
  run_once: True
  when: 'cluster_role is defined'

Эти задачи необходимы для обнаружения узла-владельца. Первая задача возвращает узел владельца, например: s001srv000, Вторая задача создает две переменные следующих типов:

owner_node_host  : s001srv.domain.net
owner_node_name: s001srv000 

- name: 'Apply the application roles on the inactive nodes'
  include_role:
    name: '{{ item }}'
  when  : 'cluster_role is defined and (cluster_sets is defined or cluster_full is defined) and owner_node_host != inventory_hostname'
  with_items: '{{ dependencies }}'

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


- pause:
    prompt : 'A manual failover must be manually performed'
    minutes: 30
  run_once : True
  when: 'cluster_full is defined and environment_type == "prod"'


- name: 'Move the cluster role'
  win_shell: 'cluster_role.ps1 -ClusterRoleName {{ cluster_role }} -ExcludeNode {{ owner_node_name }}'
  run_once : True
  when: 'cluster_move is defined or cluster_full is defined'

Эти задачи необходимы для управления процессом обновления. Если текущая среда - STG, то обновление будет выполняться автоматически, в противном случае происходит ручное переключение при сбое в момент паузы.


- name: 'Apply the application roles on the nodes which were active a moment ago'
  include_role:
    name: '{{ item }}'                                                                                                  
  when  : 'cluster_role is defined and cluster_full is defined and owner_node_host == inventory_hostname'

Эти задачи такие же, как 'Apply the application roles on the inactive nodes', но для узлов, которые были активны минуту назад.

Другие вопросы по тегам