Развертывание группы доступности Always On с внутренним сетевым балансировщиком
- Подготовьте облако к работе
- Создайте сетевую инфраструктуру
- Создайте внутренний сетевой балансировщик
- Подготовьте виртуальные машины для группы доступности
- Подготовьте образы Windows Server
- Создайте файл с учетными данными администратора
- Создайте виртуальные машины
- Перенесите свои лицензии для Windows Server
- Установите и настройте Active Directory
- Создайте пользователей и группы в Active Directory
- Установите и настройте SQL Server
- Создайте Windows Server Failover Cluster
- Настройте Always On
- Протестируйте группу доступности
- Как удалить созданные ресурсы
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
Сценарий описывает развертывание в Yandex Cloud группы доступности Always On с балансировкой нагрузки между узлами с помощью внутреннего сетевого балансировщика. Несколько подсетей будут объединены в одну общую подсеть путем настройки сетевых интерфейсов. Благодаря этому не потребуется использование Multisubnet Failover
Чтобы создать и настроить группу доступности Always On с внутренним сетевым балансировщиком:
- Подготовьте облако к работе.
- Создайте сетевую инфраструктуру.
- Создайте внутренний сетевой балансировщик.
- Подготовьте виртуальные машины для группы доступности.
- Протестируйте группу доступности.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Примечание
Проверьте, что в платежном аккаунте указаны пользовательские данные, необходимые для выполнения требований лицензионной политики Microsoft. Без этих данных вы не сможете запустить продукт.
Необходимые платные ресурсы
В стоимость поддержки группы доступности входят:
- плата за постоянно запущенную виртуальную машину (см. тарифы Yandex Compute Cloud);
- плата за использование сетевого балансировщика (см. тарифы Yandex Network Load Balancer);
- плата за использование динамического или статического публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud).
Вы можете воспользоваться перемещением лицензий и использовать собственную лицензию SQL Server в Yandex Cloud.
Создайте сетевую инфраструктуру
Подготовьте сетевую инфраструктуру для размещения группы доступности.
-
Создайте сеть с именем
ya-network
:Консоль управленияBashPowerShell- Откройте раздел Virtual Private Cloud в каталоге, где требуется создать облачную сеть.
- Нажмите кнопку Создать сеть.
- Задайте имя сети:
ya-network
. - Нажмите кнопку Создать сеть.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.yc vpc network create --name ya-network
Установите интерфейс командной строки Yandex Cloud, чтобы использовать команды CLI в PowerShell.
yc vpc network create --name ya-network
-
Создайте подсети, в которых будут размещаться виртуальные машины и сетевой балансировщик:
- Три подсети для размещения ВМ SQLServer:
ya-sqlserver-rc1a
,ya-sqlserver-rc1b
иya-sqlserver-rc1d
. К каждой подсети будет привязана таблица маршрутизацииmssql
. - Подсеть
ya-ilb-rc1a
для сетевого балансировщика. - Подсеть
ya-ad-rc1a
для Active Directory.
Консоль управленияBashPowerShell- Откройте раздел Virtual Private Cloud в каталоге, где требуется создать подсети.
- Выберите сеть
ya-network
. - Нажмите кнопку
Добавить подсеть. - Заполните форму: введите имя подсети
ya-sqlserver-rc1a
, выберите зону доступностиru-central1-a
из выпадающего списка. - Введите CIDR подсети: IP-адрес и маску подсети:
192.168.1.0/28
. - Нажмите кнопку Создать подсеть.
Повторите шаги для подсетей со следующими именами и CIDR:
ya-sqlserver-rc1b
в зоне доступностиru-central1-b
—192.168.1.16/28
;ya-sqlserver-rc1d
в зоне доступностиru-central1-d
—192.168.1.32/28
;ya-ilb-rc1a
в зоне доступностиru-central1-a
—192.168.1.48/28
;ya-ad-rc1a
в зоне доступностиru-central1-a
—10.0.0.0/28
.
yc vpc subnet create \ --name ya-sqlserver-rc1a \ --zone ru-central1-a \ --range 192.168.1.0/28 \ --network-name ya-network
yc vpc subnet create \ --name ya-sqlserver-rc1b \ --zone ru-central1-b \ --range 192.168.1.16/28 \ --network-name ya-network
yc vpc subnet create \ --name ya-sqlserver-rc1d \ --zone ru-central1-d \ --range 192.168.1.32/28 \ --network-name ya-network
yc vpc subnet create \ --name ya-ilb-rc1a \ --zone ru-central1-a \ --range 192.168.1.48/28 \ --network-name ya-network
yc vpc subnet create \ --name ya-ad-rc1a \ --zone ru-central1-a \ --range 10.0.0.0/28 \ --network-name ya-network
yc vpc subnet create ` --name ya-sqlserver-rc1a ` --zone ru-central1-a ` --range 192.168.1.0/28 ` --network-name ya-network
yc vpc subnet create ` --name ya-sqlserver-rc1b ` --zone ru-central1-b ` --range 192.168.1.16/28 ` --network-name ya-network
yc vpc subnet create ` --name ya-sqlserver-rc1d ` --zone ru-central1-d ` --range 192.168.1.32/28 ` --network-name ya-network
yc vpc subnet create ` --name ya-ilb-rc1a ` --zone ru-central1-a ` --range 192.168.1.48/28 ` --network-name ya-network
yc vpc subnet create ` --name ya-ad-rc1a ` --zone ru-central1-a ` --range 10.0.0.0/28 ` --network-name ya-network
- Три подсети для размещения ВМ SQLServer:
Создайте внутренний сетевой балансировщик
yc load-balancer network-load-balancer create \
--name ya-loadbalancer \
--type internal
yc load-balancer network-load-balancer create `
--name ya-loadbalancer `
--type internal
Создайте обработчик
Получите идентификатор подсети:
yc vpc subnet get --name ya-ilb-rc1a
Создайте обработчик, указав идентификатор подсети:
yc load-balancer network-load-balancer add-listener \
--name ya-loadbalancer \
--listener name=ya-listener,port=1433,target-port=14333,protocol=tcp,internal-address=192.168.1.62,internal-subnet-id=<идентификатор_подсети>
$inlbSubnet = yc vpc subnet get `
--name ya-ilb-rc1a `
--format json | ConvertFrom-Json
yc load-balancer network-load-balancer add-listener `
--name ya-loadbalancer `
--listener name=ya-listener,port=1433,target-port=14333,protocol=tcp,internal-address=192.168.1.62,internal-subnet-id=$($inlbSubnet.id)
Создайте и подключите целевую группу к балансировщику
yc load-balancer target-group create \
--name ya-tg \
--target address=192.168.1.3,subnet-name=ya-sqlserver-rc1a \
--target address=192.168.1.19,subnet-name=ya-sqlserver-rc1b \
--target address=192.168.1.35,subnet-name=ya-sqlserver-rc1d
Скопируйте из ответа идентификатор целевой группы и выполните команду:
yc load-balancer network-load-balancer attach-target-group \
--name ya-loadbalancer \
--target-group target-group-id=<идентификатор_целевой_группы>,healthcheck-name=listener,healthcheck-tcp-port=59999
yc load-balancer target-group create `
--name ya-tg `
--target address=192.168.1.3,subnet-name=ya-sqlserver-rc1a `
--target address=192.168.1.19,subnet-name=ya-sqlserver-rc1b `
--target address=192.168.1.35,subnet-name=ya-sqlserver-rc1d
$TargetGroup = yc load-balancer target-group get `
--name ya-tg `
--format json | ConvertFrom-Json
yc load-balancer network-load-balancer attach-target-group `
--name ya-loadbalancer `
--target-group target-group-id=$($TargetGroup.id),healthcheck-name=listener,healthcheck-tcp-port=59999
Подготовьте виртуальные машины для группы доступности
Подготовьте образы Windows Server
Перед созданием ВМ подготовьте свой образ Windows Server, чтобы использовать его в Yandex Cloud со своей собственной лицензией.
Создайте файл с учетными данными администратора
Создайте файл setpass
со скриптом для установки пароля локальной учетной записи администратора. Этот скрипт будет выполняться при создании виртуальных машин через CLI.
Внимание
Файл setpass
должен быть в кодировке UTF-8.
touch ~/setpass
echo '#ps1' >> ~/setpass
echo 'Get-LocalUser | Where-Object SID -like *-500 | Set-LocalUser -Password (ConvertTo-SecureString "YaQWErty123" -AsPlainText -Force)' >> ~/setpass
cd
ni ~/setpass
echo '#ps1' >> ~/setpass
echo 'Get-LocalUser | Where-Object SID -like *-500 | Set-LocalUser -Password (ConvertTo-SecureString "YaQWErty123" -AsPlainText -Force)' >> ~/setpass
Важно
Указанный пароль используется только для тестирования. Используйте собственный сложный пароль при развертывании кластера для работы в продуктовом окружении.
Пароль должен соответствовать требованиям к сложности
Подробные рекомендации по защите Active Directory читайте на сайте разработчика
Создайте виртуальные машины
ВМ нужно создавать на выделенных хостах. Получить идентификатор выделенного хоста можно с помощью Yandex Cloud CLI, выполнив команду yc compute host-group list-hosts
(подробнее о команде см. в справочнике).
Создайте ВМ для бастионного хоста
Создайте бастионный хост с ОС Windows Server 2022 Datacenter с публичным IP-адресом для доступа к остальным ВМ:
yc compute instance create \
--name ya-jump1 \
--hostname ya-jump1 \
--zone ru-central1-a \
--memory 4 \
--cores 2 \
--metadata-from-file user-data=setpass \
--create-boot-disk \
type=network-ssd,size=50,image-id=<идентификатор_образа_с_Windows> \
--network-interface \
subnet-name=ya-ad-rc1a,nat-ip-version=ipv4 \
--host-id <идентификатор_выделенного_хоста> \
--async
yc compute instance create `
--name ya-jump1 `
--hostname ya-jump1 `
--zone ru-central1-a `
--memory 4 `
--cores 2 `
--metadata-from-file user-data=setpass `
--create-boot-disk `
type=network-ssd,size=50,image-id=<идентификатор_образа_с_Windows> `
--network-interface `
subnet-name=ya-ad-rc1a,nat-ip-version=ipv4 `
--host-id <идентификатор_выделенного_хоста> `
--async
Создайте ВМ для Active Directory
yc compute instance create \
--name ya-ad \
--hostname ya-ad \
--zone ru-central1-a \
--memory 6 \
--cores 2 \
--metadata-from-file user-data=setpass \
--create-boot-disk \
type=network-ssd,size=50,image-id=<идентификатор_образа_с_Windows> \
--network-interface \
subnet-name=ya-ad-rc1a,ipv4-address=10.0.0.3 \
--host-id <идентификатор_выделенного_хоста> \
--async
yc compute instance create `
--name ya-ad `
--hostname ya-ad `
--zone ru-central1-a `
--memory 6 `
--cores 2 `
--metadata-from-file user-data=setpass `
--create-boot-disk `
type=network-ssd,size=50,image-id=<идентификатор_образа_с_Windows> `
--network-interface `
subnet-name=ya-ad-rc1a,ipv4-address=10.0.0.3 `
--host-id <идентификатор_выделенного_хоста> `
--async
Создайте ВМ для серверов SQL Server
Создайте три виртуальных машины с ОС Windows Server 2022 Datacenter для серверов SQL Server:
yc compute instance create \
--name ya-mssql1 \
--hostname ya-mssql1 \
--zone ru-central1-a \
--memory 16 \
--cores 4 \
--metadata-from-file user-data=setpass \
--create-boot-disk \
type=network-ssd,size=50,image-id=<идентификатор_образа_с_Windows> \
--create-disk \
type=network-ssd,size=200 \
--network-interface \
subnet-name=ya-sqlserver-rc1a,ipv4-address=192.168.1.3 \
--host-id <идентификатор_выделенного_хоста> \
--async
yc compute instance create \
--name ya-mssql2 \
--hostname ya-mssql2 \
--zone ru-central1-b \
--memory 16 \
--cores 4 \
--metadata-from-file user-data=setpass \
--create-boot-disk \
type=network-ssd,size=50,image-id=<идентификатор_образа_с_Windows> \
--create-disk \
type=network-ssd,size=200 \
--network-interface \
subnet-name=ya-sqlserver-rc1b,ipv4-address=192.168.1.19 \
--host-id <идентификатор_выделенного_хоста> \
--async
yc compute instance create \
--name ya-mssql3 \
--hostname ya-mssql3 \
--zone ru-central1-d \
--memory 16 \
--cores 4 \
--metadata-from-file user-data=setpass \
--create-boot-disk \
type=network-ssd,size=50,image-id=<идентификатор_образа_с_Windows> \
--create-disk \
type=network-ssd,size=200 \
--network-interface \
subnet-name=ya-sqlserver-rc1d,ipv4-address=192.168.1.35 \
--host-id <идентификатор_выделенного_хоста> \
--async
yc compute instance create `
--name ya-mssql1 `
--hostname ya-mssql1 `
--zone ru-central1-a `
--memory 16 `
--cores 4 `
--metadata-from-file user-data=setpass `
--create-boot-disk `
type=network-ssd,size=50,image-id=<идентификатор_образа_с_Windows> `
--create-disk `
type=network-ssd,size=200 `
--network-interface `
subnet-name=ya-sqlserver-rc1a,ipv4-address=192.168.1.3 `
--host-id <идентификатор_выделенного_хоста> `
--async
yc compute instance create `
--name ya-mssql2 `
--hostname ya-mssql2 `
--zone ru-central1-b `
--memory 16 `
--cores 4 `
--metadata-from-file user-data=setpass `
--create-boot-disk `
type=network-ssd,size=50,image-id=<идентификатор_образа_с_Windows> `
--create-disk `
type=network-ssd,size=200 `
--network-interface `
subnet-name=ya-sqlserver-rc1b,ipv4-address=192.168.1.19 `
--host-id <идентификатор_выделенного_хоста> `
--async
yc compute instance create `
--name ya-mssql3 `
--hostname ya-mssql3 `
--zone ru-central1-d `
--memory 16 `
--cores 4 `
--metadata-from-file user-data=setpass `
--create-boot-disk `
type=network-ssd,size=50,image-id=<идентификатор_образа_с_Windows> `
--create-disk `
type=network-ssd,size=200 `
--network-interface `
subnet-name=ya-sqlserver-rc1d,ipv4-address=192.168.1.35 `
--host-id <идентификатор_выделенного_хоста> `
--async
Перенесите свои лицензии для Windows Server
Подключитесь к каждой созданной ВМ и активируйте на ней свою лицензию для Windows Server.
Установите и настройте Active Directory
-
Подключитесь к ВМ
ya-jump1
с помощью RDP. Используйте логинAdministrator
и ваш пароль. -
С ВМ
ya-jump1
подключитесь к ВМya-ad
с помощью RDP и той же учетной записи. -
На ВМ
ya-ad
запустите PowerShell и установите необходимые роли сервера:PowerShellInstall-WindowsFeature AD-Domain-Services -IncludeManagementTools
-
Создайте лес Active Directory:
PowerShellInstall-ADDSForest ` -DomainName 'yantoso.net' ` -Force:$true ` -SafeModeAdministratorPassword ` ('YaP@ssw0rd!11' | ConvertTo-SecureString -AsPlainText -Force)
После этого ВМ перезапустится.
-
Снова подключитесь к ВМ
ya-ad
. -
Переименуйте сайт и добавьте в него созданные подсети:
PowerShellGet-ADReplicationSite 'Default-First-Site-Name' | Rename-ADObject -NewName 'ru-central1' New-ADReplicationSubnet -Name '10.0.0.0/28' -Site 'ru-central1' New-ADReplicationSubnet -Name '192.168.1.0/28' -Site 'ru-central1' New-ADReplicationSubnet -Name '192.168.1.16/28' -Site 'ru-central1' New-ADReplicationSubnet -Name '192.168.1.32/28' -Site 'ru-central1' New-ADReplicationSubnet -Name '192.168.1.48/28' -Site 'ru-central1'
-
Укажите Forwarder для DNS-сервера:
PowerShellSet-DnsServerForwarder '10.0.0.2'
-
Укажите адреса DNS-сервера:
PowerShellGet-NetAdapter | Set-DnsClientServerAddress -ServerAddresses "10.0.0.3,127.0.0.1"
Создайте пользователей и группы в Active Directory
-
Подключитесь к ВМ
ya-jump1
с помощью RDP. Используйте логинAdministrator
и ваш пароль. -
С ВМ
ya-jump1
подключитесь к ВМya-ad
с помощью RDP и той же учетной записи. -
На ВМ
ya-ad
запустите PowerShell и создайте сервисную учетную записьmssql-svc
:PowerShellNew-ADUser ` -Name mssql-svc ` -AccountPassword ('YaQWErty123' | ConvertTo-SecureString -AsPlainText -Force) ` -CannotChangePassword $true ` -PasswordNeverExpires $true ` -Enabled $true
-
Создайте группы для доступа к резервным копиям и серверам баз данных:
PowerShellNew-AdGroup mssql-admins-grp -GroupScope:Global New-AdGroup mssql-backups-grp -GroupScope:Global
-
Добавьте учетную запись
Administrator
во все группы. В группуmssql-backups-grp
добавьте сервисную учетную записьmssql-svc
:PowerShellAdd-ADGroupMember mssql-admins-grp -Members Administrator Add-ADGroupMember mssql-backups-grp -Members Administrator Add-ADGroupMember mssql-backups-grp -Members mssql-svc
-
Задайте SPN
сервисной учетной записи:PowerShellsetspn -A MSSQLSvc/ya-mssql1.yantoso.net:1433 yantoso\mssql-svc setspn -A MSSQLSvc/ya-mssql1.yantoso.net yantoso\mssql-svc setspn -A MSSQLSvc/ya-mssql2.yantoso.net:1433 yantoso\mssql-svc setspn -A MSSQLSvc/ya-mssql2.yantoso.net yantoso\mssql-svc setspn -A MSSQLSvc/ya-mssql3.yantoso.net:1433 yantoso\mssql-svc setspn -A MSSQLSvc/ya-mssql3.yantoso.net yantoso\mssql-svc
Установите и настройте SQL Server
Установите SQL Server на серверы баз данных:
-
Настройте на ВМ с серверами БД доступ в интернет:
BashPowerShellyc compute instance add-one-to-one-nat <идентификатор_ВМ_ya-mssql1> --network-interface-index 0 yc compute instance add-one-to-one-nat <идентификатор_ВМ_ya-mssql2> --network-interface-index 0 yc compute instance add-one-to-one-nat <идентификатор_ВМ_ya-mssql3> --network-interface-index 0
yc compute instance add-one-to-one-nat <идентификатор_ВМ_ya-mssql1> --network-interface-index 0 yc compute instance add-one-to-one-nat <идентификатор_ВМ_ya-mssql2> --network-interface-index 0 yc compute instance add-one-to-one-nat <идентификатор_ВМ_ya-mssql3> --network-interface-index 0
-
Запустите RDP и подключитесь к ВМ
ya-mssql1
с учетной записьюAdministrator
и вашим паролем. Для подключения используйте публичный IP-адрес ВМ. -
Запустите PowerShell и установите роль:
PowerShellInstall-WindowsFeature Failover-Clustering -IncludeManagementTools
-
Снова подключитесь к ВМ
ya-mssql1
и запустите PowerShell. -
Инициализируйте и отформатируйте второй логический диск:
PowerShellGet-Disk | ` Where-Object PartitionStyle -Eq "RAW" | ` Initialize-Disk -PassThru -PartitionStyle:GPT | ` New-Partition -DriveLetter 'X' -UseMaximumSize | ` Format-Volume ` -FileSystem:NTFS ` -AllocationUnitSize:64KB ` -Force ` -ShortFileNameSupport $false ` -Confirm:$false
Появится запрос подтверждения форматирования диска. Нажмите кнопку Format disk. Нажмите кнопку Start. После завершения форматирования нажмите кнопку OK.
-
Подготовьте папки для дистрибутива, резервного копирования, хранения баз данных, логов и временных файлов:
PowerShellmkdir C:\dist mkdir X:\BACKUP mkdir X:\DB mkdir X:\DBLOG mkdir X:\TEMPDB mkdir X:\TEMPDBLOG
-
Загрузите в папку
C:\dist
англоязычный образ SQL Server 2022 из интернета. -
Установите модуль SqlServer:
PowerShellInstall-Module -Name SqlServer
-
При запросе подтверждения установки введите
Y
. -
Импортируйте команды модуля SqlServer для PowerShell:
PowerShellImport-Module SQLServer
-
Укажите адрес DNS-сервера:
PowerShellGet-NetAdapter | Set-DnsClientServerAddress -ServerAddresses "10.0.0.3"
Подготовьте данные для доступа к домену:
PowerShell$domain_credential = ` New-Object System.Management.Automation.PSCredential ( 'yantoso\Administrator', ` ('YaQWErty123' | ConvertTo-SecureString -AsPlainText -Force))
Добавьте сервер БД в домен:
PowerShellAdd-Computer -DomainCredential $domain_credential -DomainName 'yantoso.net' -Restart -Force
ВМ автоматически перезапустится.
-
После перезапуска снова подключитесь к ВМ с логином
yantoso\Administrator
, откройте PowerShell. -
Настройте необходимые права служебной учетной записи:
PowerShell& secedit /export /cfg sec_conf_export.ini /areas user_rights $secConfig = Get-Content sec_conf_export.ini | Select-Object -SkipLast 3 $versionSection = Get-Content sec_conf_export.ini | Select-Object -Last 3 $SID = Get-WmiObject ` -Class Win32_UserAccount ` -Filter "name='mssql-svc' and domain='yantoso'" | ` Select-Object -ExpandProperty SID $isSeManageVolumePrivilegeDefined = $secConfig | ` Select-String SeManageVolumePrivilege if ($isSeManageVolumePrivilegeDefined) { $secConfig = $secConfig -replace '^SeManageVolumePrivilege .+', "`$0,*$SID" } else { $secConfig = $secConfig + "SeManageVolumePrivilege = *$SID" } $isSeLockMemoryPrivilegeDefined = $secConfig | ` Select-String SeLockMemoryPrivilege if ($isSeLockMemoryPrivilegeDefined) { $secConfig = $secConfig -replace '^SeLockMemoryPrivilege .+', "`$0,*$SID" } else { $secConfig = $secConfig + "SeLockMemoryPrivilege = *$SID" } $secConfig = $secConfig + $versionSection $secConfig | Set-Content sec_conf_import.ini secedit /configure /db secedit.sdb /cfg sec_conf_import.ini /areas user_rights Remove-Item sec_conf_import.ini Remove-Item sec_conf_export.ini
-
Настройте файрвол:
PowerShellNew-NetFirewallRule ` -Group "MSSQL" ` -DisplayName "SQL Server Default" ` -Name "MSSQLServer-In-TCP" ` -LocalPort 1433 ` -Action "Allow" ` -Protocol "TCP" New-NetFirewallRule ` -Group "MSSQL" ` -DisplayName "SQL Server AAG Custom" ` -Name "MSSQLAAG-In-TCP" ` -LocalPort 14333 ` -Action "Allow" ` -Protocol "TCP" New-NetFirewallRule ` -Group "MSSQL" ` -DisplayName "MSSQL HADR Default" ` -Name "MSSQLHADR-In-TCP" ` -LocalPort 5022 ` -Action "Allow" ` -Protocol "TCP" New-NetFirewallRule ` -Group "MSSQL" ` -DisplayName "MSSQL NLB Probe" ` -Name "MSSQLAAG-NLB-In-TCP" ` -LocalPort 59999 ` -Action "Allow" ` -Protocol "TCP"
-
Установите SQL Server. Смонтируйте образ, выполните установку и отсоедините образ:
PowerShellMount-DiskImage -ImagePath C:\dist\<имя_образа_SQL_Server>.iso
& D:\setup.exe /QUIET /INDICATEPROGRESS /IACCEPTSQLSERVERLICENSETERMS ` /ACTION=INSTALL /FEATURES=SQLENGINE /INSTANCENAME=MSSQLSERVER ` /SQLSVCACCOUNT="yantoso\mssql-svc" /SQLSVCPASSWORD="YaQWErty123" ` /SQLSYSADMINACCOUNTS="yantoso\mssql-admins-grp" /UpdateEnabled=FALSE ` /SQLBACKUPDIR="X:\BACKUP" /SQLTEMPDBDIR="X:\TEMPDB" /SQLTEMPDBLOGDIR="X:\TEMPDBLOG" ` /SQLUSERDBDIR="X:\DB" /SQLUSERDBLOGDIR="X:\DBLOG"
Dismount-DiskImage -ImagePath C:\dist\<имя_образа_MSSQL_Server>.iso
-
Повторите шаги 2-16 для ВМ
ya-mssql2
иya-mssql3
. -
Отключите у ВМ доступ в интернет:
BashPowerShellyc compute instance remove-one-to-one-nat <идентификатор_ВМ_ya-mssql1> --network-interface-index 0 yc compute instance remove-one-to-one-nat <идентификатор_ВМ_ya-mssql2> --network-interface-index 0 yc compute instance remove-one-to-one-nat <идентификатор_ВМ_ya-mssql3> --network-interface-index 0
yc compute instance remove-one-to-one-nat <идентификатор_ВМ_ya-mssql1> --network-interface-index 0 yc compute instance remove-one-to-one-nat <идентификатор_ВМ_ya-mssql2> --network-interface-index 0 yc compute instance remove-one-to-one-nat <идентификатор_ВМ_ya-mssql3> --network-interface-index 0
-
Подключитесь к ВМ
ya-jump1
с помощью RDP. Используйте логинAdministrator
и ваш пароль. -
С ВМ
ya-jump1
подключитесь к ВМya-mssql1
с помощью RDP и той же учетной записи. Настройте статический адрес со своей маской подсети:$IPAddress = Get-NetAdapter | Get-NetIPAddress -AddressFamily IPv4 | Select-Object -ExpandProperty IPAddress $InterfaceName = Get-NetAdapter | Select-Object -ExpandProperty Name $Gateway = Get-NetIPConfiguration | Select-Object -ExpandProperty IPv4DefaultGateway | Select-Object -ExpandProperty NextHop netsh interface ip set address $InterfaceName static $IPAddress 255.255.255.192 $Gateway
-
Повторите шаги 19-20 для ВМ
ya-mssql2
иya-mssql3
. -
Для работы группы доступности Always On требуется настроенный Windows Server Failover Cluster. Для его создания необходимо протестировать серверы БД. На любой из ВМ кластера выполните:
PowerShellTest-Cluster -Node 'ya-mssql1.yantoso.net' Test-Cluster -Node 'ya-mssql2.yantoso.net' Test-Cluster -Node 'ya-mssql3.yantoso.net'
Создайте Windows Server Failover Cluster
-
Подключитесь к ВМ
ya-jump1
с помощью RDP. Используйте логинAdministrator
и ваш пароль. -
С ВМ
ya-jump1
подключитесь к ВМya-mssql1
с помощью RDP и учетной записиyantoso\Administrator
. -
Создайте кластер из трех серверов БД:
PowerShellNew-Cluster ` -Name 'wsfc' ` -Node 'ya-mssql1.yantoso.net','ya-mssql2.yantoso.net','ya-mssql3.yantoso.net' ` -NoStorage ` -StaticAddress 192.168.1.4 Test-Cluster Get-ClusterResource -Name 'Cluster IP Address' | ` Stop-ClusterResource Get-ClusterResource -Name 'Cluster IP Address' | ` Set-ClusterParameter -Multiple ` @{ "Address"="169.254.1.1"; "SubnetMask"="255.255.255.255"; "OverrideAddressMatch"=1; "EnableDhcp"=0 } Get-ClusterResource -Name 'Cluster Name' | Start-ClusterResource -Wait 60
-
Включите на всех ВМ TCP/IP и добавьте порт
14333
для получения трафика:PowerShell[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") [reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement") $nodes = @('ya-mssql1.yantoso.net','ya-mssql2.yantoso.net','ya-mssql3.yantoso.net') foreach ($node in $nodes) { $smo = [Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer]::new($node) $np = $smo.GetSmoObject("ManagedComputer[@Name=`'$node`']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='NP']") $tcp = $smo.GetSmoObject("ManagedComputer[@Name=`'$node`']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp']") $ipall = $smo.GetSmoObject("ManagedComputer[@Name=`'$node`']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp']/IPAddress[@Name='IPAll']") if (-not $ipall.IPAddressProperties['TcpPort'].Value -ne '1433,14333') { $ipall.IPAddressProperties['TcpPort'].Value = '1433,14333' $tcp.Alter() $altered = $true } if (-not $tcp.IsEnabled) { $tcp.IsEnabled = $true $tcp.Alter() $altered = $true } if (-not $np.IsEnabled) { $np.IsEnabled = $true $np.Alter() $altered = $true } if ($altered) { Get-Service -Name 'MSSQLSERVER' -ComputerName $node | Restart-Service -Force Start-Sleep -Seconds 60 } }
-
Назначьте служебному пользователю
mssql-svc
разрешения на управление серверами:PowerShellAdd-SqlLogin -Path "SQLSERVER:\SQL\ya-mssql1\Default" ` -LoginName "yantoso\mssql-svc" ` -LoginType "WindowsUser" ` -Enable ` -GrantConnectSql Add-SqlLogin -Path "SQLSERVER:\SQL\ya-mssql2\Default" ` -LoginName "yantoso\mssql-svc" ` -LoginType "WindowsUser" ` -Enable ` -GrantConnectSql Add-SqlLogin -Path "SQLSERVER:\SQL\ya-mssql3\Default" ` -LoginName "yantoso\mssql-svc" ` -LoginType "WindowsUser" ` -Enable ` -GrantConnectSql $mssql1 = Get-Item "SQLSERVER:\SQL\ya-mssql1.yantoso.net\Default" $mssql1.Roles['sysadmin'].AddMember('yantoso\mssql-svc') $mssql1.Roles['sysadmin'].Alter() $mssql2 = Get-Item "SQLSERVER:\SQL\ya-mssql2.yantoso.net\Default" $mssql2.Roles['sysadmin'].AddMember('yantoso\mssql-svc') $mssql2.Roles['sysadmin'].Alter() $mssql3 = Get-Item "SQLSERVER:\SQL\ya-mssql3.yantoso.net\Default" $mssql3.Roles['sysadmin'].AddMember('yantoso\mssql-svc') $mssql3.Roles['sysadmin'].Alter()
Настройте Always On
-
По очереди подключитесь к каждому серверу и включите SqlAlwaysOn:
- Подключитесь к узлу кластера Windows Server Failover Cluster (WSFC), на котором размещен экземпляр SQL Server.
- В меню Start выберите All programs → Microsoft SQL Server → Configuration Tools → SQL Server Configuration Manager.
- В SQL Server Configuration Manager, нажмите правой кнопкой мыши на экземпляр SQL Server, для которого требуется включить Always On Availability Groups, и выберите Properties.
- Перейдите на вкладку Always On High Availability.
- Включите опцию Enable Always On Availability Groups и перезагрузите службу экземпляра SQL Server.
-
Создайте и запустите эндпоинты HADR
:PowerShellNew-SqlHADREndpoint -Port 5022 -Owner sa ` -Encryption Supported -EncryptionAlgorithm Aes ` -Name AlwaysonEndpoint ` -Path "SQLSERVER:\SQL\ya-mssql1.yantoso.net\Default" Set-SqlHADREndpoint -Path "SQLSERVER:\SQL\ya-mssql1.yantoso.net\Default\Endpoints\AlwaysonEndpoint" -State Started New-SqlHADREndpoint -Port 5022 -Owner sa ` -Encryption Supported -EncryptionAlgorithm Aes ` -Name AlwaysonEndpoint ` -Path "SQLSERVER:\SQL\ya-mssql2.yantoso.net\Default" Set-SqlHADREndpoint -Path "SQLSERVER:\SQL\ya-mssql2.yantoso.net\Default\Endpoints\AlwaysonEndpoint" -State Started New-SqlHADREndpoint -Port 5022 -Owner sa ` -Encryption Supported -EncryptionAlgorithm Aes ` -Name AlwaysonEndpoint ` -Path "SQLSERVER:\SQL\ya-mssql3.yantoso.net\Default" Set-SqlHADREndpoint -Path "SQLSERVER:\SQL\ya-mssql3.yantoso.net\Default\Endpoints\AlwaysonEndpoint" -State Started
-
Создайте переменные с параметрами реплик. Основной репликой будет выступать
ya-mssql1
, второй и третьей —ya-mssql2
иya-mssql3
.PowerShell$PrimaryReplica = New-SqlAvailabilityReplica ` -Name ya-mssql1 ` -EndpointUrl "TCP://ya-mssql1.yantoso.net:5022" ` -FailoverMode "Automatic" ` -AvailabilityMode "SynchronousCommit" ` -AsTemplate -Version 13 $SecondaryReplica = New-SqlAvailabilityReplica ` -Name ya-mssql2 ` -EndpointUrl "TCP://ya-mssql2.yantoso.net:5022" ` -FailoverMode "Automatic" ` -AvailabilityMode "SynchronousCommit" ` -AsTemplate -Version 13 $ThirdReplica = New-SqlAvailabilityReplica ` -Name ya-mssql3 ` -EndpointUrl "TCP://ya-mssql3.yantoso.net:5022" ` -FailoverMode "Automatic" ` -AvailabilityMode "SynchronousCommit" ` -AsTemplate -Version 13
-
Создайте из реплик группу доступности
MyAG
и добавьте туда первый сервер:PowerShellNew-SqlAvailabilityGroup ` -Name 'MyAG' ` -AvailabilityReplica @($PrimaryReplica, $SecondaryReplica, $ThirdReplica) ` -Path "SQLSERVER:\SQL\ya-mssql1.yantoso.net\Default"
-
Добавьте оставшиеся серверы в группу доступности:
PowerShellJoin-SqlAvailabilityGroup -Path "SQLSERVER:\SQL\ya-mssql2.yantoso.net\Default" -Name 'MyAG' Join-SqlAvailabilityGroup -Path "SQLSERVER:\SQL\ya-mssql3.yantoso.net\Default" -Name 'MyAG'
-
Создайте Listener
с IP-адресом192.168.1.62
, который принадлежит внутреннему сетевому балансировщику:PowerShell$NLBIPAddress = '192.168.1.62' Get-Cluster | ` Add-ClusterResource -Name 'MyAG Network Name' -Group 'MyAG' -ResourceType 'Network Name' Get-ClusterResource -Name 'MyAG Network Name' | ` Set-ClusterParameter -Multiple ` @{ Name = 'MyAGlistener' DnsName = 'MyAGlistener' } Get-Cluster | ` Add-ClusterResource -Name 'My AG listener IP Address' -Group 'MyAG' -ResourceType 'IP Address' Get-ClusterResource -Name 'My AG listener IP Address' | ` Set-ClusterParameter -Multiple ` @{ Address=$NLBIPAddress ProbePort=59999 SubnetMask="255.255.255.255" Network="Cluster Network 1" EnableDhcp=0 } Add-ClusterResourceDependency ` -Resource 'MyAG Network Name' ` -Provider 'My AG listener IP Address' Stop-ClusterResource 'MyAG' Add-ClusterResourceDependency ` -Resource 'MyAG' ` -Provider 'MyAG Network Name' Start-ClusterResource 'MyAG'
-
Назначьте порт
14333
обработчику:PowerShellSet-SqlAvailabilityGroupListener ` -Port 14333 ` -Path "SQLSERVER:\Sql\ya-mssql1.yantoso.net\Default\AvailabilityGroups\MyAG\AvailabilityGroupListeners\MyAGlistener"
-
Откройте порт
14333
на всех ВМ кластера:PowerShell$nodes = @('ya-mssql1.yantoso.net','ya-mssql2.yantoso.net','ya-mssql3.yantoso.net') foreach ($node in $nodes) { $smo = [Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer]::new($node) $tcp = $smo.GetSmoObject("ManagedComputer[@Name=`'$node`']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp']") $np = $smo.GetSmoObject("ManagedComputer[@Name=`'$node`']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='NP']") $ipall = $smo.GetSmoObject("ManagedComputer[@Name=`'$node`']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp']/IPAddress[@Name='IPAll']") if (-not $ipall.IPAddressProperties['TcpPort'].Value -ne '1433,14333') { $ipall.IPAddressProperties['TcpPort'].Value = '1433,14333' $tcp.Alter() $altered = $true } if (-not $tcp.IsEnabled) { $tcp.IsEnabled = $true $tcp.Alter() $altered = $true } if (-not $np.IsEnabled) { $np.IsEnabled = $true $np.Alter() $altered = $true } if ($altered) { Get-Service -Name 'MSSQLSERVER' -ComputerName $node | Restart-Service Start-Sleep -Seconds 60 } }
-
Создайте базу данных на сервере
ya-mssql1
:PowerShellInvoke-Sqlcmd -Query "CREATE DATABASE MyDatabase" -ServerInstance 'ya-mssql1.yantoso.net'
-
Задайте настройки доступа к папке с резервными копиями на сервере:
PowerShellNew-SMBShare -Name SQLBackup -Path "X:\BACKUP" -FullAccess "yantoso\mssql-backups-grp" $Acl = Get-Acl "X:\BACKUP" $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("yantoso\mssql-backups-grp","Read", "ContainerInherit, ObjectInherit", "None", "Allow") $Acl.AddAccessRule($AccessRule) $Acl | Set-Acl "X:\BACKUP"
-
Создайте резервную копию базы
MyDatabase
на ВМya-mssql1
:PowerShellBackup-SqlDatabase ` -Database "MyDatabase" -Initialize ` -BackupFile "MyDatabase.bak" ` -ServerInstance "ya-mssql1.yantoso.net" Backup-SqlDatabase ` -Database "MyDatabase" -Initialize ` -BackupFile "MyDatabase.log" ` -ServerInstance "ya-mssql1.yantoso.net" ` -BackupAction Log
-
Восстановите базу данных на сервере
ya-mssql2
из резервной копии:PowerShellRestore-SqlDatabase ` -Database "MyDatabase" ` -BackupFile "\\ya-mssql1.yantoso.net\SQLBackup\MyDatabase.bak" ` -Path "SQLSERVER:\SQL\ya-mssql2.yantoso.net\Default" ` -NORECOVERY Restore-SqlDatabase ` -Database "MyDatabase" ` -BackupFile "\\ya-mssql1.yantoso.net\SQLBackup\MyDatabase.log" ` -Path "SQLSERVER:\SQL\ya-mssql2.yantoso.net\Default" ` -RestoreAction Log ` -NORECOVERY
-
Восстановите базу данных на сервере
ya-mssql3
из резервной копии:PowerShellRestore-SqlDatabase ` -Database "MyDatabase" ` -BackupFile "\\ya-mssql1.yantoso.net\SQLBackup\MyDatabase.bak" ` -Path "SQLSERVER:\SQL\ya-mssql3.yantoso.net\Default" ` -NORECOVERY Restore-SqlDatabase ` -Database "MyDatabase" ` -BackupFile "\\ya-mssql1.yantoso.net\SQLBackup\MyDatabase.log" ` -Path "SQLSERVER:\SQL\ya-mssql3.yantoso.net\Default" ` -RestoreAction Log ` -NORECOVERY
-
Добавьте все базы данных в группу доступности:
PowerShellAdd-SqlAvailabilityDatabase ` -Path "SQLSERVER:\SQL\ya-mssql1.yantoso.net\Default\AvailabilityGroups\MyAG" ` -Database "MyDatabase" Add-SqlAvailabilityDatabase ` -Path "SQLSERVER:\SQL\ya-mssql2.yantoso.net\Default\AvailabilityGroups\MyAG" ` -Database "MyDatabase" Add-SqlAvailabilityDatabase ` -Path "SQLSERVER:\SQL\ya-mssql3.yantoso.net\Default\AvailabilityGroups\MyAG" ` -Database "MyDatabase"
Протестируйте группу доступности
Тестирование работы базы данных можно провести на любой из доменных ВМ. Для входа используйте учетную запись yantoso\Administrator
.
-
Создайте таблицу в реплицируемой БД
MyDatabase
:PowerShellInvoke-Sqlcmd -ServerInstance 'MyAGlistener.yantoso.net' -Query @" CREATE TABLE MyDatabase.dbo.test ( test_id INT IDENTITY(1,1) PRIMARY KEY, test_name VARCHAR(30) NOT NULL ); "@
-
Добавьте в таблицу БД новую строку:
PowerShellInvoke-Sqlcmd -ServerInstance 'MyAGlistener.yantoso.net' -Query @" INSERT INTO MyDatabase.dbo.test (test_name) VALUES ('one') "@
-
Проверьте, появилась ли строка в таблице:
PowerShellInvoke-Sqlcmd -ServerInstance 'MyAGlistener.yantoso.net' -Query @" SELECT * FROM MyDatabase.dbo.test; "@
Результат:
test_id test_name ------- --------- 1 one
-
Проверьте имя основной реплики БД:
PowerShellInvoke-Sqlcmd -Query "SELECT @@SERVERNAME" -ServerInstance 'MyAGlistener.yantoso.net'
Результат:
Column1 ------- YA-MSSQL1
-
Выполните аварийное переключение на вторую реплику:
PowerShellInvoke-Sqlcmd -Query "ALTER AVAILABILITY GROUP MyAg FAILOVER" -ServerInstance 'ya-mssql2.yantoso.net'
-
Снова проверьте имя основной реплики:
PowerShellInvoke-Sqlcmd -Query "SELECT @@SERVERNAME" -ServerInstance 'MyAGlistener.yantoso.net'
Результат:
Column1 ------- YA-MSSQL2
-
Добавьте еще одну строку в таблицу, чтобы проверить работу второй реплики на запись:
PowerShellInvoke-Sqlcmd -ServerInstance 'MyAGlistener.yantoso.net' -Query @" INSERT INTO MyDatabase.dbo.test (test_name) VALUES ('two') "@
-
Убедитесь, что строка добавлена:
PowerShellInvoke-Sqlcmd -ServerInstance 'MyAGlistener.yantoso.net' -Query "SELECT * FROM MyDatabase.dbo.test"
Результат:
test_id test_name ------- --------- 1 one 2 two
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы, удалите созданные виртуальные машины и балансировщик:
ya-jump1
;ya-ad
;ya-mssql1
;ya-mssql2
;ya-mssql3
;ya-loadbalancer
.