Как обновить общее приложение, работающее на отказоустойчивом кластере Windows - PullRequest
0 голосов
/ 23 сентября 2018

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

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

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

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

1 Ответ

0 голосов
/ 28 сентября 2018

У нас есть кластеризованные службы 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', но для узлов, которые были активны некоторое время назад.

...