/엔지니어/데이터베이스/MSSQL Always On 가용성 그룹 — SQL
데이터베이스고급windowsmssqlsql-serveralways-on

MSSQL Always On 가용성 그룹 — SQL Server HA 이중화 구성

SQL Server Always On 가용성 그룹으로 Primary-Secondary 이중화를 구성하고, 자동 페일오버와 읽기 전용 라우팅까지 설정하는 전체 과정을 설명합니다.

Always On 가용성 그룹이란?

SQL Server Always On AG(Availability Group)는 데이터베이스 레벨의 HA 솔루션으로, 여러 Secondary 복제본을 유지하며 자동/수동 페일오버를 지원합니다.

주요 특징

  • 최대 8개 Secondary 복제본 (SQL Server 2022 기준)
  • 동기/비동기 커밋 모드 선택
  • Secondary에서 읽기 전용 쿼리 오프로드
  • Windows Server Failover Cluster(WSFC) 위에서 동작

사전 요구사항

항목요구사항
SQL Server 에디션Enterprise 또는 Developer (테스트용)
OSWindows Server 2019/2022
도메인Active Directory 도메인 필수
WSFC모든 노드 공통 클러스터 구성원
네트워크노드 간 고속 사설망 권장

환경 구성

서버IP역할
SQL1192.168.1.10Primary
SQL2192.168.1.11Secondary (동기)
SQL3192.168.1.12Secondary (비동기, DR)
AG Listener192.168.1.50애플리케이션 연결 VIP

Step 1 — Windows Server Failover Cluster 구성

PowerShell (모든 노드)

POWERSHELL
# 장애 조치 클러스터링 기능 설치
Install-WindowsFeature Failover-Clustering -IncludeManagementTools

# 사전 검사
Test-Cluster -Node SQL1, SQL2, SQL3

# 클러스터 생성 (SQL1에서)
New-Cluster -Name "SQLCluster" -Node SQL1,SQL2,SQL3 -StaticAddress 192.168.1.30

Step 2 — SQL Server Always On 활성화

SQL Server Configuration Manager → SQL Server 서비스 → 속성 → Always On 가용성 그룹 탭에서 활성화

또는 PowerShell:

POWERSHELL
Enable-SqlAlwaysOn -ServerInstance "SQL1" -Force
Enable-SqlAlwaysOn -ServerInstance "SQL2" -Force
Enable-SqlAlwaysOn -ServerInstance "SQL3" -Force

서비스 재시작 필요.


Step 3 — 미러링 엔드포인트 생성 (각 노드)

SQL
-- SQL1, SQL2, SQL3 각각 실행
CREATE ENDPOINT [Hadr_endpoint]
    STATE = STARTED
    AS TCP (LISTENER_PORT = 5022)
    FOR DATA_MIRRORING (ROLE = ALL, ENCRYPTION = REQUIRED ALGORITHM AES);

-- 서비스 계정에 CONNECT 권한 부여
GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [DOMAIN\sql_service];

Step 4 — 데이터베이스 준비 (Primary)

SQL
-- 복구 모드 FULL 필수
ALTER DATABASE [SalesDB] SET RECOVERY FULL;

-- 전체 백업 (Secondary로 복원에 사용)
BACKUP DATABASE [SalesDB]
  TO DISK = '\\fileserver\backup\SalesDB.bak'
  WITH FORMAT, INIT;

BACKUP LOG [SalesDB]
  TO DISK = '\\fileserver\backup\SalesDB_log.bak';

Step 5 — Secondary에서 백업 복원

SQL
-- SQL2, SQL3에서 실행 (NORECOVERY 필수)
RESTORE DATABASE [SalesDB]
  FROM DISK = '\\fileserver\backup\SalesDB.bak'
  WITH NORECOVERY, MOVE 'SalesDB' TO 'C:\Data\SalesDB.mdf',
       MOVE 'SalesDB_log' TO 'C:\Data\SalesDB_log.ldf';

RESTORE LOG [SalesDB]
  FROM DISK = '\\fileserver\backup\SalesDB_log.bak'
  WITH NORECOVERY;

Step 6 — 가용성 그룹 생성 (Primary)

SQL
CREATE AVAILABILITY GROUP [AG_Sales]
WITH (
    AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
    FAILURE_CONDITION_LEVEL = 3,
    HEALTH_CHECK_TIMEOUT = 30000
)
FOR DATABASE [SalesDB]
REPLICA ON
  'SQL1' WITH (
    ENDPOINT_URL = 'TCP://SQL1.domain.local:5022',
    FAILOVER_MODE = AUTOMATIC,
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
    BACKUP_PRIORITY = 50,
    SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
  ),
  'SQL2' WITH (
    ENDPOINT_URL = 'TCP://SQL2.domain.local:5022',
    FAILOVER_MODE = AUTOMATIC,
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
    BACKUP_PRIORITY = 50,
    SECONDARY_ROLE(ALLOW_CONNECTIONS = READ_ONLY)   -- 읽기 오프로드
  ),
  'SQL3' WITH (
    ENDPOINT_URL = 'TCP://SQL3.domain.local:5022',
    FAILOVER_MODE = MANUAL,
    AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,         -- DR 사이트
    BACKUP_PRIORITY = 60,
    SECONDARY_ROLE(ALLOW_CONNECTIONS = READ_ONLY)
  );

Step 7 — Secondary 조인

SQL
-- SQL2에서
ALTER AVAILABILITY GROUP [AG_Sales] JOIN;
ALTER DATABASE [SalesDB] SET HADR AVAILABILITY GROUP = [AG_Sales];

-- SQL3에서 동일하게 실행
ALTER AVAILABILITY GROUP [AG_Sales] JOIN;
ALTER DATABASE [SalesDB] SET HADR AVAILABILITY GROUP = [AG_Sales];

Step 8 — AG Listener 생성

SQL
-- Primary에서
ALTER AVAILABILITY GROUP [AG_Sales]
ADD LISTENER 'AG_Sales_Listener' (
    WITH IP ((N'192.168.1.50', N'255.255.255.0')),
    PORT = 1433
);

애플리케이션은 192.168.1.50,1433으로 연결하며, 페일오버 후에도 동일 주소로 접속됩니다.


상태 확인

SQL
-- 복제 상태
SELECT ag.name, ars.role_desc, ard.synchronization_state_desc,
       ard.synchronization_health_desc, ard.log_send_queue_size,
       ard.redo_queue_size
FROM sys.dm_hadr_availability_replica_states ars
JOIN sys.availability_replicas ar ON ars.replica_id = ar.replica_id
JOIN sys.availability_groups ag ON ag.group_id = ar.group_id
JOIN sys.dm_hadr_database_replica_states ard ON ard.replica_id = ars.replica_id;

-- 페일오버 준비 상태
SELECT * FROM sys.dm_hadr_availability_group_states;

수동 페일오버

SQL
-- 새 Primary로 지정할 Secondary에서 실행
ALTER AVAILABILITY GROUP [AG_Sales] FAILOVER;

읽기 전용 라우팅 (Read Scale-out)

SQL
-- Primary에서 라우팅 URL 설정
ALTER AVAILABILITY GROUP [AG_Sales]
MODIFY REPLICA ON 'SQL1' WITH (
    PRIMARY_ROLE(READ_ONLY_ROUTING_LIST = ('SQL2','SQL3'))
);

ALTER AVAILABILITY GROUP [AG_Sales]
MODIFY REPLICA ON 'SQL2' WITH (
    SECONDARY_ROLE(READ_ONLY_ROUTING_URL = N'TCP://SQL2.domain.local:1433')
);

연결 문자열에 ApplicationIntent=ReadOnly 추가 시 자동으로 Secondary로 라우팅됩니다.


정리

기능Always On AG
페일오버 단위데이터베이스 그룹
자동 페일오버동기 복제본 (WSFC 판단)
읽기 오프로드Secondary READ_ONLY 허용
DR 구성비동기 복제본
연결 단일화AG Listener VIP

자주 묻는 질문 (FAQ)

Q. MSSQL 이중화 방법은 Always On 말고 뭐가 있나요? A. 크게 ① Always On 가용성 그룹(AG) — DB 단위 복제·자동 장애조치·읽기 부하 분산 ② 장애 조치 클러스터 인스턴스(FCI) — 공유 스토리지 기반 인스턴스 이중화 ③ 로그 전달(Log Shipping) — 지연 허용 DR용 ④ 미러링(구버전, deprecated)이 있습니다. 자동 장애조치와 읽기 분산이 모두 필요하면 Always On AG가 표준입니다.

Q. Always On 이중화에 서버가 몇 대 필요한가요? A. 최소 2대(주 + 보조)이며, 자동 장애조치를 쓰려면 WSFC 쿼럼용으로 파일 공유 감시(File Share Witness) 또는 3번째 노드가 필요합니다. Enterprise 에디션은 복제본을 최대 8개까지 둘 수 있습니다.

#mssql#sql-server#always-on#ha#failover#windows-server
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.