Always On 가용성 그룹에 대한 읽기 확장 구성

적용 대상: SQL Server

Windows에서 읽기 배율 작업에 대한 SQL Server Always On 가용성 그룹을 구성할 수 있습니다. 가용성 그룹에 대한 아키텍처는 다음과 같은 두 종류가 있습니다:

  • 고가용성을 위한 아키텍처는 클러스터 관리자를 사용하여 향상 된 비즈니스 연속성을 제공하고 읽기 가능한 보조 복제본을 포함할 수 있습니다. 이 고가용성 아키텍처를 만들려면 Windows에서 가용성 그룹의 생성 및 구성을 참조하세요.
  • 아키텍처는 읽기 배율 작업만을 지원합니다.

이 문서에서는 읽기 배율 작업에 대한 클러스터 관리자 없이 가용성 그룹을 만드는 방법을 설명합니다. 이 아키텍처는 읽기 배율만을 제공합니다. 고가용성을 제공하지 않습니다.

참고

CLUSTER_TYPE = NONE인 가용성 그룹은 다양한 운영 체제 플랫폼에서 호스팅되는 복제본을 포함할 수 있습니다. 고가용성을 지원할 수 없습니다. Linux 운영 체제는 Linux에서 읽기 배율에 대한 SQL Server 가용성 그룹 구성을 참조하세요.

필수 구성 요소

가용성 그룹을 만들려면 먼저 다음을 수행해야 합니다:

  • 가용성 복제본을 호스트하는 모든 서버가 통신할 수 있도록 환경을 설정합니다.
  • SQL Server를 설치합니다. 자세한 내용은 SQL Server 설치를 참조합니다.

AlwaysOn 가용성 그룹을 사용하도록 설정하고 mssql-server 다시 시작

참고

다음 명령은 PowerShell 갤러리에 게시되는 sqlserver 모듈에서 cmdlet을 활용합니다. Install-Module 명령을 사용하여 이 모듈을 설치할 수 있습니다.

SQL Server 인스턴스를 호스트하는 각 복제본에서 AlwaysOn 가용성 그룹을 사용하도록 설정합니다. 그런 다음, SQL Server 서비스를 다시 시작합니다. 다음 명령을 실행하여 SQL Server 서비스를 사용하도록 설정한 다음, 다시 시작합니다:

Enable-SqlAlwaysOn -ServerInstance <server\instance> -Force

AlwaysOn_health 이벤트 세션을 사용하도록 설정

가용성 그룹 문제를 해결할 때 근본적인 원인 진단에 도움을 주려면 Always On 가용성 그룹 확장 이벤트(XEvents) 세션을 사용하도록 설정하여 줄 수 있습니다. 그렇게 하려면 SQL Server의 각 인스턴스에서 다음 명령을 실행합니다:

ALTER EVENT SESSION  AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
GO

이 XEvent 세션에 대한 자세한 내용은 Always On 가용성 그룹 확장 이벤트를 참조하세요.

데이터베이스 미러링 엔드포인트 인증

동기화가 제대로 작동하려면 읽기-배율 가용성 그룹에 관련된 복제본은 엔드포인트에 대한 인증이 필요합니다. 이러한 인증에 사용할 수 있는 두 가지 주요 시나리오는 다음 섹션에서 다룹니다.

서비스 계정

모든 보조 복제본이 동일한 도메인에 조인된 Active Directory 환경에서 SQL Server는 서비스 계정을 사용하여 인증할 수 있습니다. SQL Server 인스턴스 각각에서 서비스 계정에 대한 로그인을 명시적으로 만들어야 합니다:

CREATE LOGIN [<domain>\service account] FROM WINDOWS;

SQL 로그인 인증

보조 복제본이 Active Directory 도메인에 조인될 수 없는 환경에서 SQL 인증을 활용해야 합니다. 다음 Transact-SQL 스크립트는 dbm_login이라는 로그인과 dbm_user라는 사용자를 만듭니다. 강력한 암호로 스크립트를 업데이트합니다. 데이터베이스 미러링 엔드포인트 사용자를 만들려면 모든 SQL Server 인스턴스에서 다음 명령을 실행합니다:

CREATE LOGIN dbm_login WITH PASSWORD = '**<1Sample_Strong_Password!@#>**';
CREATE USER dbm_user FOR LOGIN dbm_login;

인증서 인증

SQL 인증으로 인증을 요구하는 보조 복제본을 사용하는 경우 미러링 엔드포인트 간의 인증을 위한 인증서를 사용합니다.

다음 Transact-SQL 스크립트는 마스터 키와 인증서를 만듭니다. 그런 다음, 인증서를 백업하고 프라이빗 키로 파일을 보호합니다. 강력한 암호로 스크립트를 업데이트합니다. 기본 SQL Server 인스턴스에서 스크립트를 실행하여 인증서를 만듭니다:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '**<Master_Key_Password>**';
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
BACKUP CERTIFICATE dbm_certificate
   TO FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\dbm_certificate.cer'
   WITH PRIVATE KEY (
       FILE = 'c:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\dbm_certificate.pvk',
       ENCRYPTION BY PASSWORD = '**<Private_Key_Password>**'
   );

이제 기본 SQL Server 복제본은 c:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\dbm_certificate.cer에 인증서, c:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\dbm_certificate.pvk에 프라이빗 키가 있습니다. 이러한 두 파일을 가용성 복제본을 호스트할 모든 서버의 동일한 위치로 복사합니다.

각 보조 복제본에서 SQL Server에 대한 서비스 계정에 인증서에 액세스할 권한이 있는지 확인합니다.

보조 서버에서 인증서 만들기

다음 Transact-SQL 스크립트는 기본 SQL Server 복제본에 대해 만든 백업을 사용하여 마스터 키와 인증서를 만듭니다. 이 명령은 사용자에게 인증서에 액세스할 권한도 부여합니다. 강력한 암호로 스크립트를 업데이트합니다. 해독 암호는 이전 단계에서 .pvk 파일을 만들 때 사용한 암호와 동일합니다. 인증서를 만들려면 모든 보조 복제본에서 다음 스크립트를 실행합니다:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '**<Master_Key_Password>**';
CREATE CERTIFICATE dbm_certificate
    AUTHORIZATION dbm_user
    FROM FILE = 'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\dbm_certificate.cer'
    WITH PRIVATE KEY (
        FILE = 'c:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\dbm_certificate.pvk',
        DECRYPTION BY PASSWORD = '**<Private_Key_Password>**'
    );

모든 복제본에서 데이터베이스 미러링 엔드포인트 만들기

데이터베이스 미러링 엔드포인트는 TCP(전송 제어 프로토콜)를 사용하여 데이터베이스 미러링 세션에 참여하거나 가용성 복제본을 호스트하는 서버 인스턴스 간에 메시지를 보내고 받습니다. 데이터베이스 미러링 엔드포인트는 고유의 TCP 포트 번호에서 수신합니다.

다음 Transact-SQL 스크립트는 가용성 그룹에 대해 수신하는 엔드포인트 Hadr_endpoint를 만듭니다. 엔드포인트를 시작하고 이전 단계에서 만든 SQL 로그인 또는 서비스 계정에 연결 권한을 부여합니다. 스크립트를 실행하기 전에 **< ... >** 사이의 값을 바꿉니다. 필요에 따라 IP 주소 LISTENER_IP = (0.0.0.0)을 포함할 수 있습니다. 수신기 IP 주소는 IPv4 주소여야 합니다. 또한 0.0.0.0을 사용할 수 있습니다.

모든 SQL Server 인스턴스에서 환경에 대한 다음 Transact-SQL 스크립트를 업데이트합니다:

CREATE ENDPOINT [Hadr_endpoint]
    AS TCP (LISTENER_PORT = **<5022>**)
    FOR DATABASE_MIRRORING (
        ROLE = ALL,
        AUTHENTICATION = CERTIFICATE dbm_certificate,
        ENCRYPTION = REQUIRED ALGORITHM AES
    );
ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [<service account or user>];

방화벽의 TCP 포트를 수신기 포트용으로 열어 두어야 합니다.

자세한 내용은 데이터베이스 미러링 엔드포인트(SQL Server)를 참조하세요.

가용성 그룹 만들기

가용성 그룹을 만듭니다. CLUSTER_TYPE = NONE을 설정합니다. 또한 각 복제본을 FAILOVER_MODE = NONE으로 설정합니다. 분석 또는 보고 워크로드를 실행하는 클라이언트 애플리케이션에서 보조 데이터베이스에 직접 연결할 수 있습니다. 읽기 전용 라우팅 목록을 만들 수도 있습니다. 주 복제본에 대한 연결은 읽기 연결 요청을 라운드 로빈 방식으로 라우팅 목록에서 각 보조 복제본으로 전달합니다.

다음 Transact-SQL 스크립트는 ag1이라는 가용성 그룹을 만듭니다. 스크립트는 SEEDING_MODE = AUTOMATIC으로 가용성 그룹 복제본을 구성합니다. 이렇게 설정하면 SQL Server에서 가용성 그룹에 추가된 후 각 보조 서버에 데이터베이스를 자동으로 만듭니다.

사용자 환경에 대해 다음 스크립트를 업데이트합니다. <node1><node2> 값을 복제본을 호스팅하는 SQL Server 인스턴스의 이름으로 바꿉니다. <5022> 값을 엔드포인트에 대해 설정한 포트로 바꿉니다. 주 SQL Server 복제본에서 다음 Transact-SQL 스크립트를 실행합니다:

CREATE AVAILABILITY GROUP [ag1]
    WITH (CLUSTER_TYPE = NONE)
    FOR REPLICA ON
        N'<node1>' WITH (
            ENDPOINT_URL = N'tcp://<node1>:<5022>',
		    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
		    FAILOVER_MODE = MANUAL,
		    SEEDING_MODE = AUTOMATIC,
                    SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
		    ),
        N'<node2>' WITH (
		    ENDPOINT_URL = N'tcp://<node2>:<5022>',
		    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
		    FAILOVER_MODE = MANUAL,
		    SEEDING_MODE = AUTOMATIC,
		    SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
		    );

ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;

가용성 그룹에 보조 SQL Server 인스턴스 조인

다음 Transact-SQL 스크립트는 ag1이라는 가용성 그룹에 서버를 조인합니다. 사용자 환경에 대해 스크립트를 업데이트합니다. 가용성 그룹을 조인하려면 각 보조 SQL Server 복제본에서 다음 Transact-SQL 스크립트를 실행합니다:

ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = NONE);

ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;

가용성 그룹에 데이터베이스 추가

가용성 그룹에 추가하는 데이터베이스는 전체 복구 모델이 있고 유효한 로그 백업이 있는지 확인합니다. 데이터베이스가 테스트 데이터베이스이거나 새로 만든 데이터베이스인 경우 데이터베이스 백업을 수행합니다. db1이라는 데이터베이스를 만들고 백업하려면 기본 SQL Server 인스턴스에서 다음 Transact-SQL 스크립트를 실행합니다:

CREATE DATABASE [db1];
ALTER DATABASE [db1] SET RECOVERY FULL;
BACKUP DATABASE [db1]
   TO DISK = N'c:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Backup\db1.bak';

db1이라는 데이터베이스를 ag1이라는 가용성 그룹에 추가하려면 기본 SQL Server 복제본에서 다음 Transact-SQL 스크립트를 실행합니다:

ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1];

데이터베이스가 보조 서버에 생성되었는지 확인

db1 데이터베이스가 생성되고 동기화되었는지 확인하려면 각 보조 SQL Server 복제본에서 다음 쿼리를 실행합니다:

SELECT * FROM sys.databases WHERE name = 'db1';
GO
SELECT DB_NAME(database_id) AS 'database', synchronization_state_desc FROM sys.dm_hadr_database_replica_states;

이 가용성 그룹은 고가용성 구성이 아닙니다. 고가용성이 필요한 경우 Linux에서 SQL Server에 대한 Always On 가용성 그룹 구성 또는 Windows에서 가용성 그룹의 생성 및 구성의 지침을 따릅니다.

읽기 전용 보조 복제본에 연결

두 방법 중 하나를 사용하여 읽기 전용 보조 복제본에 연결할 수 있습니다:

  • 애플리케이션은 보조 복제본을 호스팅하는 SQL Server 인스턴스에 직접 연결하고 데이터베이스를 쿼리할 수 있습니다. 자세한 내용은 읽기 가능한 보조 복제본을 참조합니다.
  • 애플리케이션은 수신기가 필요한 읽기 전용 라우팅을 사용할 수도 있습니다. 클러스터 관리자 없이 읽기 확장 시나리오를 배포하는 경우에도 현재 주 복제본의 IP 주소와 SQL Server가 수신 대기하는 것과 동일한 포트를 가리키는 수신기를 만들 수 있습니다. 장애 조치(failover) 후 새로운 주 IP 주소를 가리키도록 수신기를 다시 만들어야 합니다. 자세한 내용은 읽기 전용 라우팅을 참조합니다.

읽기 확장 가용성 그룹에서 주 복제본 장애 조치

각 가용성 그룹에는 하나의 주 복제본만 있습니다. 주 복제본은 읽기 및 쓰기를 허용합니다. 주 복제본을 변경하기 위해 장애 조치(failover)를 수행할 수 있습니다. 일반적인 가용성 그룹에서 클러스터 관리자는 장애 조치 프로세스를 자동화합니다. 클러스터 형식이 NONE인 가용성 그룹에서 장애 조치(failover) 프로세스는 수동입니다.

클러스터 형식이 NONE인 가용성 그룹에서 두 가지 방법으로 주 복제본을 장애 조치(failover)할 수 있습니다:

  • 데이터가 손실되지 않는 수동 장애 조치(Failover)
  • 데이터 손실이 있는 강제 수동 장애 조치(Failover)

데이터가 손실되지 않는 수동 장애 조치(Failover)

주 복제본을 사용할 수 있지만 주 복제본을 호스트하는 인스턴스를 일시적으로 또는 영구적으로 변경해야 하는 경우 이 방법을 사용합니다. 잠재적인 데이터 손실을 방지하려면 수동 장애 조치(failover)를 실행하기 전에 대상 보조 복제본이 최신 상태인지 확인합니다.

데이터 손실이 없는 수동 장애 조치(Failover)를 수행하려면:

  1. 현재 주 복제본 및 대상 보조 복제본을 SYNCHRONOUS_COMMIT으로 설정합니다.

    ALTER AVAILABILITY GROUP [AGRScale] 
         MODIFY REPLICA ON N'<node2>' 
         WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT);
    
  2. 활성 트랜잭션이 주 복제본과 적어도 하나의 동기 보조 복제본에 커밋되었는지 확인하려면 다음 쿼리를 실행합니다:

    SELECT ag.name, 
       drs.database_id, 
       drs.group_id, 
       drs.replica_id, 
       drs.synchronization_state_desc, 
       ag.sequence_number
    FROM sys.dm_hadr_database_replica_states drs, sys.availability_groups ag
    WHERE drs.group_id = ag.group_id; 
    

    보조 복제본이 synchronization_state_descSYNCHRONIZED일 때 동기화됩니다.

  3. REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT을 1로 업데이트합니다.

    다음 스크립트에는 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT라는 가용성 그룹에서 ag1을 1로 설정합니다. 다음 스크립트를 실행하기 전에 ag1을 가용성 그룹의 이름으로 바꿉니다:

    ALTER AVAILABILITY GROUP [AGRScale] 
         SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 1);
    

    이 설정은 모든 활성 트랜잭션이 주 복제본과 적어도 하나의 동기 보조 복제본에 커밋되었는지 확인합니다.

    참고

    이 설정은 장애 조치에만 적용되는 것이 아니며, 환경 요구 사항에 따라 설정해야 합니다.

  4. 주 복제본과 장애 조치(failover)에 참여하지 않는 보조 복제본을 오프라인으로 설정하여 역할 변경을 준비합니다:

    ALTER AVAILABILITY GROUP [AGRScale] OFFLINE
    
  5. 대상 보조 복제본을 주 복제본으로 승격합니다.

    ALTER AVAILABILITY GROUP AGRScale FORCE_FAILOVER_ALLOW_DATA_LOSS; 
    
  6. 기존 주 복제본 및 다른 보조 복제본을 호스트하는 SQL Server 인스턴스에서 다음 명령을 실행하여 기존 주 복제본의 역할을 SECONDARY로 업데이트를 해 주세요:

    ALTER AVAILABILITY GROUP [AGRScale] 
         SET (ROLE = SECONDARY); 
    

    참고

    가용성 그룹 사용을 삭제하려면 DROP AVAILABILITY GROUP을 사용합니다. NONE 또는 EXTERNAL 클러스터 형식을 사용하여 만든 가용성 그룹의 경우 가용성 그룹의 일부인 모든 복제본에서 명령을 실행합니다.

  7. 데이터 이동을 계속하고, 주 복제본을 호스트하는 SQL Server 인스턴스의 가용성 그룹에 있는 모든 데이터베이스에 대해 다음 명령을 실행합니다:

    ALTER DATABASE [db1]
         SET HADR RESUME
    
  8. 읽기 확장 목적으로 만들었으며 클러스터 관리자가 관리하지 않는 수신기를 다시 만듭니다. 원래 수신기가 기존 주 복제본을 가리키는 경우 이 수신기를 삭제하고 새로운 주 복제본을 가리키도록 다시 만듭니다.

데이터 손실이 있는 강제 수동 장애 조치(Failover)

주 복제본을 사용할 수 없고 즉시 복구할 수 없는 경우에는 데이터 손실이 있는 보조 복제본에 대한 장애 조치(failover)를 강제로 수행해야 합니다. 그러나 장애 조치 후 원래 주 복제본이 복구되면 주 복제본이 주 역할을 맡습니다. 각 복제본이 서로 다른 상태에 있지 않도록 하려면 데이터 손실이 있는 강제 장애 조치 후 가용성 그룹에서 원래 주 복제본을 제거합니다. 원래 주 복제본이 다시 온라인 상태가 되면 주 복제본에서 가용성 그룹을 완전히 제거합니다.

주 복제본 N1에서 보조 복제본 N2로 데이터 손실이 있는 수동 장애 조치를 강제로 수행하려면 다음 단계를 수행합니다:

  1. 보조 복제본(N2)에서 강제 장애 조치를 시작합니다:

    ALTER AVAILABILITY GROUP [AGRScale] FORCE_FAILOVER_ALLOW_DATA_LOSS;
    
  2. 새 주 복제본(N2)에서 원래 주 복제본(N1)을 제거합니다:

    ALTER AVAILABILITY GROUP [AGRScale]
    REMOVE REPLICA ON N'N1';
    
  3. 모든 애플리케이션 트래픽이 수신기 및/또는 새 주 복제본을 가리키고 있는지 확인합니다.

  4. 원래 주 복제본(N1)이 온라인 상태가 되면 원래 주 복제본(N1)에서 가용성 그룹 AGRScale을 즉시 오프라인 상태로 설정합니다:

    ALTER AVAILABILITY GROUP [AGRScale] OFFLINE
    
  5. 데이터 또는 동기화되지 않은 변경 내용이 있는 경우에는 백업을 사용하거나 비즈니스 요구 사항에 맞는 기타 데이터 복제 옵션을 사용하여 이 데이터를 보존합니다.

  6. 다음으로, 원래 주 복제본(N1)에서 가용성 그룹을 제거합니다:

    DROP AVAILABILITY GROUP [AGRScale];
    
  7. 원래 주 복제본(N1)에서 가용성 그룹 데이터베이스를 삭제합니다:

    USE [master]
    GO
    DROP DATABASE [AGDBRScale]
    GO
    
  8. (선택 사항) 이제 원하는 경우 N1을 가용성 그룹 AGRScale에 새 보조 복제본으로 다시 추가할 수 있습니다.

수신기를 사용하여 연결하는 경우에는 장애 조치를 수행한 후 수신기를 다시 만들어야 합니다.

다음 단계