Как обновить общее приложение, работающее на отказоустойчивом кластере Windows
Я хочу использовать для своего приложения общую роль службы отказоустойчивого кластера Windows. и я пытаюсь выяснить, как выполнить обновления.
Я читал, что есть возможность выполнить обновление с учетом кластера, IE: передать кластеру MSI \ installer и позволить ему отвечать за обновление всех узлов.
Кто-нибудь, кто использовал эту функцию, может:
- Можете описать, как он это сделал?
- Существуют ли какие-то особые требования для его включения?
- Это рекомендуется?
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'
, но для узлов, которые были активны минуту назад.