+7 495 230 03 03 8 800 222 50 03
DevOps

Настройка зеркалирования MS SQL 2019

В данной инструкции рассмотрим возможности MS SQL Server по обеспечению отказоустойчивости баз данных. Основными технологиями для этого являются зеркалирование (mirroring), а также создание групп высокой доступности AlwaysOn. Но группы высокой доступности требуют приобретение лицензий редакции Enterprise, что во многих случаях экономически нецелесообразно. Остановимся подробней на возможностях зеркалирования и его настройке.

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

Режимы зеркалирования

В Microsoft SQL Server на текущий момент есть три режима зеркалирования:

Асинхронный

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

Синхронный без автоматического восстановления

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

Синхронный с автоматическим восстановлением

Для работы в синхронном режиме с автоматическим восстановлением требуется три сервера: главный (principal), зеркальный (mirror) и свидетель (witness). Основное отличие от предыдущего режима в наличии третьего сервера-свидетеля, который обеспечивает кворум и автоматическое переключение в случае отказа главного сервера без стороннего вмешательства.

Настройка серверов

Мы будем настраивать зеркалирование в синхронном режиме без автоматического восстановления, что потребует развертывания только одного дополнительного сервера. Версия MS SQL Server 2019 на главном и зеркальном серверах должна быть одинаковая. Начинаем с создания сертификатов. На обоих серверах создаём локальный каталог, в нашем примере он находится по пути C:\certs

На главном сервере выполняем запрос по созданию сертификата. Пароль указываем свой:

USE MASTER
GO
IF NOT EXISTS (
	SELECT 1 FROM sys.symmetric_keys 
	WHERE name = '##MS_DatabaseMasterKey##'
)
	CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'пароль'
GO
IF NOT EXISTS (
	SELECT 1 FROM sys.databases 
	WHERE [is_master_key_encrypted_by_server] = 1
)
	ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
GO
IF NOT EXISTS (
	SELECT 1 FROM sys.certificates 
	WHERE name = 'MainServer'
)
	CREATE CERTIFICATE MainServer
	WITH SUBJECT = 'Main Server Certificate', 
	START_DATE = '01/01/2024',
	EXPIRY_DATE = '01/01/2030';
GO
BACKUP CERTIFICATE MainServer
TO FILE = 'C:\certs\MainServer.cer'

Затем на зеркальном сервере создадим сертификат по аналогии:

USE MASTER
GO
IF NOT EXISTS (
	SELECT 1 FROM sys.symmetric_keys 
	WHERE name = '##MS_DatabaseMasterKey##'
)
	CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'пароль'
GO
IF NOT EXISTS (
	SELECT 1 FROM sys.databases 
	WHERE [is_master_key_encrypted_by_server] = 1
)
	ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY 
GO
IF NOT EXISTS (
	SELECT 1 FROM sys.certificates 
	WHERE name = 'MirrorServer'
)
	CREATE CERTIFICATE MirrorServer
	WITH SUBJECT = 'Mirror Server Certificate',
	START_DATE = '01/01/2024',
	EXPIRY_DATE = '01/01/2030';
GO
BACKUP CERTIFICATE MirrorServer
TO FILE = 'C:\certs\MirrorServer.cer'

Копируем созданные сертификаты на оба сервера в папку C:\Certs. Cоздаем на каждой стороне точку прослушивания DBMirrorEndPoint, слушающей порт TCP 5022. Данный порт должен быть открыт на сетевых экранах. На основном сервере:

USE MASTER
GO
IF NOT EXISTS (
SELECT * FROM sys.endpoints WHERE type = 4
)
CREATE ENDPOINT DBMirrorEndPoint
STATE = STARTED AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE MainServer, 
ENCRYPTION = REQUIRED, 
ROLE = ALL
)

И на зеркальном:

USE MASTER
GO
IF NOT EXISTS (
SELECT * FROM sys.endpoints WHERE type = 4
)
CREATE ENDPOINT DBMirrorEndPoint
STATE = STARTED AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE MirrorServer, 
ENCRYPTION = REQUIRED, 
ROLE = ALL
)

Создаем пользователей SQL сервера и назначаем права для возможности подключения. На главном сервере:

 
USE MASTER
GO
IF NOT EXISTS (
	SELECT 1 FROM sys.syslogins WHERE name = 'MirrorServerUser'
)
	CREATE LOGIN MirrorServerUser WITH PASSWORD = 'пароль'
IF NOT EXISTS (
	SELECT 1 FROM sys.sysusers WHERE name = 'MirrorServerUser'
)
	CREATE USER MirrorServerUser;
IF NOT EXISTS (
	SELECT 1 FROM sys.certificates WHERE name = 'MirrorDBCertPub'
)
	CREATE CERTIFICATE MirrorDBCertPub 
	AUTHORIZATION MirrorServerUser
	FROM FILE = 'C:\certs\MirrorServer.cer'
	GRANT CONNECT ON ENDPOINT::DBMirrorEndPoint 
	TO MirrorServerUser
GO

И на зеркале:

USE MASTER
GO
IF NOT EXISTS (
	SELECT 1 FROM sys.syslogins WHERE name = 'MainServerUser'
)
	CREATE LOGIN MainServerUser WITH PASSWORD = 'пароль'
IF NOT EXISTS (
	SELECT 1 FROM sys.sysusers WHERE name = 'MainlServerUser'
)
	CREATE USER MainServerUser;
IF NOT EXISTS (
	SELECT 1 FROM sys.certificates WHERE name = 'MainDBCertPub'
)
	CREATE CERTIFICATE MainDBCertPub 
	AUTHORIZATION MainServerUser
	FROM FILE = 'C:\certs\MainServer.cer'
	GRANT CONNECT ON ENDPOINT::DBMirrorEndPoint 
	TO MainServerUser
GO

На этом начальную настройку серверов можно считать законченной.

Создание зеркала базы данных

Зеркалируемая база данных должна иметь модель восстановления FULL. Обращаем внимание, что при использовании данной модели все транзакции пишутся в журнал, что приводит к существенному его увеличению. Чтобы не допустить переполнения места на дисках с журналами транзакций, необходимо настроить регулярное резервное копирование журналов помимо полных бэкапов самой БД, после чего журнал можно усечь.

В нашем примере будем использовать базу mirror_test. Делаем полный бэкап базы данных плюс бэкап лога транзакций:

BACKUP DATABASE [mirror_test] 
TO DISK = N'\\backup_share\mirror_test.bak' WITH FORMAT, 
INIT, NAME = N'mirror_test-Full',STATS = 10

BACKUP LOG [mirror_test]  
TO DISK = N'\\backup_share\mirror_test.trn'

Восстанавливаем бэкап в режиме NORECOVERY на зеркальном сервере, указав актуальные пути к файлам бэкапа и расположения БД:

RESTORE DATABASE [mirror_test] 
FROM  DISK = N'\\backup_share\mirror_test.bak' WITH  FILE = 1,  
NORECOVERY,  NOUNLOAD,  STATS = 10,
MOVE N'mirror_test' 
TO N'S:\SQL_Bases\mirror_test.mdf',
MOVE N'mirror_test_log' 
TO N'E:\SQL_Log\mirror_test_log.ldf'

RESTORE LOG [mirror_test] 
FROM  DISK = N'\\backup_share\mirror_test.trn' WITH  FILE = 1,  
NORECOVERY,  NOUNLOAD,  STATS = 10

Настраиваем репликацию тестовой БД через ранее созданные точки прослушивания. Выполняем на зеркальном сервере подключение:

ALTER DATABASE mirror_test SET PARTNER = 'TCP://MAINSERVER_IP:5022'

Затем на главном:

ALTER DATABASE mirror_test SET PARTNER = 'TCP://MIRRORSERVER_IP:5022'


Зеркалирование настроено. В случае возникновения ошибок на этом этапе наиболее вероятно, что бэкап журналов сильно отстает от актуального состояния рабочей базы. Выполните повторный бэкап журнала и его восстановление на зеркале в режиме NORECOVERY. После этого повторите попытку подключения. Рассмотрим полезные команды в случае возникновения сбоев на главном сервере. Если необходимо переключить главную реплику:

ALTER DATABASE mirror_test SET PARTNER FAILOVER

Если повредилась основная база, то пробуем принудительную активацию зеркала с возможной потерей транзакций:

ALTER DATABASE mirror_test SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS

После этого зеркальная база становится главной, а основной сервер после запуска автоматически станет зеркальным, ожидающим разрешения продолжить сеанс зеркалирования. Для этого нужно выполнить:

ALTER DATABASE mirror_test SET PARTNER RESUME

Также технологию зеркалирования можно использовать для выполнения переезда крупных баз на новый сервер практически без простоя и технологического окна. Для этого только необходимо обеспечить доступность порта 5022 через интернет либо VPN туннель.

Нужна помощь? Администрирование MS SQL для 1С мы осуществляем в рамках услуги аренда сервера.

Дата публикации: 1 марта 2024
Не нашли ответа на свой вопрос?

Смотрите также

Обсуждение материала

Содержание

Заказать звонок

Оставьте свои данные для того, чтобы специалист с вами связался.

*нажимая на кнопку, Вы даете согласие на обработку персональных данных
Быстрое внедрение включает:
На сервере установлено следующее ПО (доступно при подключении по протоколу RDP):
Также настроено:
Перед внедрением клиент предоставляет информацию о пользователях (логины и пароли). После завершения работ, клиенту высылается инструкция и ярлык для подключения.
Индивидуальное внедрение по ТЗ клиента обсуждается отдельно.