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

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

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

목차
  1. Always On 가용성 그룹이란?
  2. 사전 요구사항
  3. 환경 구성
  4. Step 1 — Windows Server Failover Cluster 구성
  5. Step 2 — SQL Server Always On 활성화
  6. Step 3 — 미러링 엔드포인트 생성 (각 노드)
  7. Step 4 — 데이터베이스 준비 (Primary)
  8. Step 5 — Secondary에서 백업 복원
  9. Step 6 — 가용성 그룹 생성 (Primary)
  10. Step 7 — Secondary 조인
  11. Step 8 — AG Listener 생성
  12. 상태 확인
  13. 수동 페일오버
  14. 읽기 전용 라우팅 (Read Scale-out)
  15. 정리
  16. 자주 묻는 질문 (FAQ)

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)

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