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 (테스트용) |
| OS | Windows Server 2019/2022 |
| 도메인 | Active Directory 도메인 필수 |
| WSFC | 모든 노드 공통 클러스터 구성원 |
| 네트워크 | 노드 간 고속 사설망 권장 |
환경 구성
| 서버 | IP | 역할 |
|---|---|---|
| SQL1 | 192.168.1.10 | Primary |
| SQL2 | 192.168.1.11 | Secondary (동기) |
| SQL3 | 192.168.1.12 | Secondary (비동기, DR) |
| AG Listener | 192.168.1.50 | 애플리케이션 연결 VIP |
Step 1 — Windows Server Failover Cluster 구성
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.30Step 2 — SQL Server Always On 활성화
SQL Server Configuration Manager → SQL Server 서비스 → 속성 → Always On 가용성 그룹 탭에서 활성화
또는 PowerShell:
Enable-SqlAlwaysOn -ServerInstance "SQL1" -Force
Enable-SqlAlwaysOn -ServerInstance "SQL2" -Force
Enable-SqlAlwaysOn -ServerInstance "SQL3" -Force서비스 재시작 필요.
Step 3 — 미러링 엔드포인트 생성 (각 노드)
-- 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)
-- 복구 모드 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에서 백업 복원
-- 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)
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 조인
-- 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 생성
-- 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으로 연결하며, 페일오버 후에도 동일 주소로 접속됩니다.
상태 확인
-- 복제 상태
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;수동 페일오버
-- 새 Primary로 지정할 Secondary에서 실행
ALTER AVAILABILITY GROUP [AG_Sales] FAILOVER;읽기 전용 라우팅 (Read Scale-out)
-- 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개까지 둘 수 있습니다.
이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.
질문 & 답변 (Q&A)
이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.