2025년 10월 24일

SQL Server DB 마이그레이션 전략 (MSCS/WSFC 고가용성) – 클라이언트 접속 VIP 유지

요약
노후 서버를 신규 장비로 교체하면서 SQL Server 고가용성(WSFC/MSCS 기반 FCI) 을 유지·개선하는 마이그레이션 방안입니다.
핵심은 클라이언트 접속 엔드포인트(VNN/VIP)를 그대로 유지하여 애플리케이션 수정 없이 전환하고, 노드의 RIP(Real IP)는 신규 네트워크 정책에 맞게 변경하는 것입니다.
본 글은 운영 표준화에 유리한 스윙(Swing) FCI / Side-by-Side 전략을 기준으로 “절차 + 체크리스트 + 스크립트”까지 한 번에 정리합니다.


SQL Server Failover Cluster Instance (FCI) migration diagram: application connects to production VIP 10.10.10.100, with staging VIP 10.20.20.100 for new cluster A/B, showing real IPs for each node and shared storage.

0. 용어 정리(이 글에서 쓰는 기준)

  • WSFC/MSCS: Windows Server Failover Clustering (전통적으로 MSCS라고도 부름)
  • FCI: SQL Server Failover Cluster Instance
    (공유 스토리지 기반, “인스턴스 단위” 고가용성)
  • VNN: Virtual Network Name
    (클라이언트가 주로 접속하는 “이름”; DNS/AD 컴퓨터 계정(VCO)과 연결됨)
  • VIP: Virtual IP
    (VNN에 매핑되는 클러스터 IP 리소스; 클라이언트가 바라보는 IP)
  • RIP: Real IP
    (각 노드 서버의 실제 IP — 관리/백업/모니터링/복제 트래픽에 사용)
  • CNO: Cluster Name Object
    (클러스터 자체 컴퓨터 계정)
  • VCO: Virtual Computer Object
    (FCI의 VNN에 해당하는 컴퓨터 계정)

실무 관점 포인트
“VIP만” 유지한다고 해서 항상 앱 변경이 0이 되는 것은 아닙니다.
대부분의 앱은 IP가 아닌 VNN(이름) 으로 접속합니다.
따라서 본 글의 ‘VIP 유지’는 실무적으로 VNN+VIP를 함께 유지하는 것을 기본 전제로 합니다.


1. 목표 아키텍처 한눈에 보기(예시)

[Application / App Servers]
        |
        |  (No change) Connect endpoint
        v
VNN: SQLPROD  ->  VIP: 10.10.10.100 (unchanged)
        |
        v
[WSFC / SQL Server FCI]
     /             \
Node A            Node B
RIP: 10.20.20.21  RIP: 10.20.20.22
(Management/Backup/Monitoring network)

Shared Storage / Private (Heartbeat) networks exist as per standard design
  • VNN/VIP 유지 → 앱/연동 시스템의 연결 문자열 변경 최소화(대부분 “0”에 수렴)
  • RIP 변경 → 신규 장비/랙/보안정책(관리망/백업망 분리 등)에 부합

2. 마이그레이션 전략 선택지(비교)

전략요약장점고려사항/리스크
스윙 FCI(권장)신규 클러스터/FCI를 임시 VNN/VIP로 구축 → 데이터 사전 동기화 → 컷오버 때 기존 VNN/VIP 승계절차 표준화, 사전 리허설/롤백 설계 용이, 다운타임 최소화AD(VCO/CNO 권한), DNS/SPN, 스토리지/데이터 동기화 설계 필요
AG 보조(선택)기존→신규로 AG를 구성해 동기화 후 컷오버다운타임을 더 줄일 수 있음구성·운영 복잡도, 라이선스/에디션/네트워크 요구 증가
인플레이스기존 노드를 교체/업그레이드단순리허설/롤백 어렵고 운영 리스크 큼

본 글은 스윙 FCI 기준으로 설명합니다.


3. 네트워크/IP 설계 (VIP 유지 + RIP 변경을 동시에 만족시키는 방법)

3.1 VIP(클라이언트 접속 IP) 유지

  • 예: VIP = 10.10.10.100/24
    컷오버 후에도 동일 IP를 신규 FCI가 사용
  • (선택) DNS TTL 사전 인하
  • VNN/VIP가 완전히 동일하다면 TTL 영향은 제한적입니다.
  • 하지만 일부 클라이언트 캐시, DNS 갱신 확인, 멀티서브넷 등 변수가 있으면 TTL 인하가 도움이 됩니다.

3.2 노드 RIP(관리/백업/모니터링 IP) 변경

  • 예: 구 노드 10.10.10.11/12 → 신규 노드 10.20.20.21/22
  • 관리망/백업망/하트비트망이 분리된 환경이라면 각 NIC별 RIP 전부 재설계/검증

3.3 가장 중요한 전제: “VIP 서브넷 연결성”은 반드시 유지돼야 함

VIP를 기존 서브넷에 그대로 두려면, 신규 노드가 다음 중 하나를 만족해야 합니다.

  • 권장(가장 흔함): 클라이언트 VLAN(=VIP 서브넷)에 연결된 NIC를 유지
  • 관리망/백업망은 별도 NIC로 신규 대역 사용
  • 또는: 동일 NIC에 secondary IP로 VIP 서브넷을 수용(네트워크 정책에 따라 제한될 수 있음)
  • 또는: 멀티서브넷/클라우드 환경이면 별도 패턴(예: ILB/Overlay) 필요

결론: “노드 RIP가 바뀐다”는 것과 “VIP 서브넷 연결을 유지한다”는 것은 동시에 설계되어야 합니다.


4. IP 계획 표(템플릿)

리소스기존신규변경 여부비고
VIP(VNN)10.10.10.10010.10.10.100유지클라이언트 접속 IP
노드A RIP(관리망)10.10.10.1110.20.20.21변경운영 접근/백업/모니터링
노드B RIP(관리망)10.10.10.1210.20.20.22변경운영 접근/백업/모니터링
백업망(선택)10.30.30.x10.40.40.x변경분리망 운영 시
Heartbeat/Private별도 대역동일/신규환경별라우팅/방화벽 점검

WSFC SQL Server FCI를 위한 네트워크 토폴로지 다이어그램: 클라이언트 VLAN, 관리 VLAN, 및 백업 VLAN. SQL 노드 1과 SQL 노드 2의 NIC 및 공유 스토리지 연결.

5. 단계별 실행 절차(체크리스트 포함)

A. 사전 준비 (D‑14 ~ D‑2)

재고/현황 파악

  • SQL 버전/에디션/CU, 인스턴스 이름, 포트(고정/동적), Collation, 서비스 계정
  • DB 목록, 크기, 백업 전략, RPO/RTO, 주요 배치/ETL/연동
  • SQL Agent 잡/연결 서버/크리덴셜/프록시/SSIS/SSRS 등 종속성

호환성/표준 정렬

  • 신규 OS/SQL 패치 레벨 표준화
  • 클러스터 기능/스토리지/네트워크 검증(사전 Test-Cluster 계획)
  • 동일한 설정 템플릿 적용(MAXDOP, Cost Threshold, Max Memory, TempDB 등)

AD/DNS 사전 작업(가장 자주 터지는 구간)

  • 기존 FCI VCO(예: SQLPROD) 의 위치(OU)와 권한 확인
  • 신규 클러스터 CNO(예: CLUSNEW$) 가 VCO를 제어할 수 있도록 권한 설계
  • 이상적: VCO에 대해 신규 CNO에 Full Control(또는 클러스터 요구 권한) 부여
  • (선택) DNS TTL 인하(운영 정책에 맞게)

네트워크/RIP 설계

  • 신규 대역(VLAN/서브넷/게이트웨이)
  • 방화벽/ACL 업데이트 목록 작성
  • App → VIP:1433
  • Backup/Monitoring → 노드 RIP(에이전트/WinRM/WMI/SMB 등)
  • 관리망 접근 정책(점프서버/운영자 PC)

백업/복구 리허설(반드시 수행)

  • 전체/차등/로그 백업 → 별도 환경에서 실제 복원 검증
  • 경로, 권한, 압축, 암호화(사용 시), 복원 시간 측정

성능 기준선(Baseline)

  • CPU/IOPS/Wait Stats/상위 쿼리/Query Store(가능 시) 스냅샷 확보
  • 전환 후 “회귀(regression)” 판정 근거로 사용

B. 신규 클러스터 구축 (D‑7 ~ D‑2)

  • 신규 노드에 RIP(신규 대역) 부여
    (원격 끊김 대비 iDRAC/iLO/콘솔 확보)
  • WSFC 구성(쿼럼 구성: 디스크/파일공유/클라우드 위트니스)
  • 공유 스토리지/LUN 구성 및 권한, MPIO, 드라이버 정합성 확인
  • 임시 VNN/임시 VIP 로 신규 FCI 인스턴스 설치
    예: SQLNEW-TMP, 10.20.20.200
  • SQL 서버 설정 표준화(COLLATION, TempDB, 메모리/병렬, 유지보수 잡 등)

데이터 이행 채널 결정

  • 운영 표준화 관점에서는 다음 조합이 가장 흔합니다.
  • 초기 시드(seed): Full 백업/복원
  • 동기화: 로그 전달(Log Shipping) 또는 주기적 로그 복원(수동/자동)

C. 데이터 동기화 (D‑2 ~ D‑1)

  • 운영 DB 전체 백업 → 신규 FCI에 WITH NORECOVERY 로 복구
  • 로그 백업/전송/적용 자동화(스케줄링) → Lag 최소화
  • 앱/배치 영향 최소화를 위해 동기화 타이밍과 백업 윈도우를 명확히 운영

D. 컷오버(D‑Day) — 런북 형태로 실행

컷오버는 “기술 작업”이 아니라 “운영 이벤트”입니다.
반드시 담당자/승인자/시간/롤백 기준이 포함된 런북으로 실행하세요.

1) 다운타임 시작 공지 / 변경창 확보

  • 사용자 공지, 점검 페이지/기능 잠금 등 준비

2) 쓰기 트래픽 차단

  • SQL Agent 잡 중지, ETL/배치/연동 중지
  • 앱 쓰기 차단(가능하면 Read-only 모드)

3) 최종 동기화

  • 최종 로그 백업(필요 시 tail-log) → 신규 적용 → WITH RECOVERY

4) VNN/VIP 승계(핵심 단계)

  • 구 클러스터에서 기존 SQL Network Name / IP 리소스 Offline
  • 신규 클러스터의 임시 VNN을 기존 VNN(예: SQLPROD) 으로 변경
  • 신규 클러스터의 IP 리소스를 기존 VIP(10.10.10.100) 로 변경
  • DNS 등록/전파 확인, 필요 시 강제 등록(정책 범위 내)
  • SPN 재등록(필요 시)

5) 가동 확인(즉시 검증)

  • SQLPROD(VNN) / 10.10.10.100(VIP) 접속 확인
  • 핵심 트랜잭션(Write) / 주요 조회(Read) / 리포트 / 배치 재개
  • 백업/모니터링 에이전트 정상 동작 확인

6) 다운타임 종료 공지


E. 후속 정리 (D+1 ~)

  • Failover 테스트(계획된 장애조치) 1회 이상
  • 백업/모니터링/DR 재연결 및 검증
  • 구 장비 폐기/반납(보안 와이프, CMDB 정리, IP 회수)

SQL Server FCI 컷오버를 위한 런북 타임라인 다이어그램. 애플리케이션, 클라이언트 VLAN, 관리 VLAN, 백업 VLAN을 포함한 단계별 실행 절차를 시각화하여 보여줌.

6. 운영자가 바로 쓰는 스크립트 모음(템플릿)

주의
아래 스크립트는 “예시 템플릿”입니다.
실제 리소스 이름은 환경마다 다르므로 Get-ClusterResource정확한 리소스명 확인 후 적용하세요.

6.1 (신규 클러스터) VIP를 기존 VIP로 변경

# IP Address 리소스 목록
Get-ClusterResource |
  Where-Object { $_.ResourceType -eq 'IP Address' } |
  Format-Table Name, State, OwnerGroup

# 예: 대상 리소스명을 변수로 지정
$ipResName = "IP Address 1"

# 리소스 중지
Stop-ClusterResource -Name $ipResName

# IP 파라미터 업데이트 (기존 VIP 10.10.10.100/24)
$ipRes = Get-ClusterResource -Name $ipResName
$ipRes | Set-ClusterParameter -Name "Address"    -Value "10.10.10.100"
$ipRes | Set-ClusterParameter -Name "SubnetMask" -Value "255.255.255.0"
$ipRes | Set-ClusterParameter -Name "EnableDhcp" -Value 0

# 재기동
Start-ClusterResource -Name $ipResName

6.2 (신규 클러스터) VNN(Network Name) 변경 및 Online

# Network Name 리소스 목록
Get-ClusterResource |
  Where-Object { $_.ResourceType -eq 'Network Name' } |
  Format-Table Name, State, OwnerGroup

# 예: 임시 VNN 리소스명을 지정
$vnnResName = "SQL Network Name (SQLNEW-TMP)"

# Offline 후 이름 변경(파라미터 Name)
Stop-ClusterResource -Name $vnnResName
(Get-ClusterResource -Name $vnnResName) |
  Set-ClusterParameter -Name "Name" -Value "SQLPROD"

# Online
Start-ClusterResource -Name $vnnResName

실무 팁
멀티서브넷/특수 DNS 정책이 있다면 Network Name 리소스의 RegisterAllProvidersIP, HostRecordTTL 같은 파라미터가 이슈가 될 수 있습니다. 단일 서브넷이면 보통 기본값으로 충분합니다.

6.3 DNS 확인(운영자 검증용)

# DNS 조회(클라이언트 관점)
nslookup SQLPROD

# (필요 시) 로컬 DNS 캐시 플러시(앱 서버/운영자 PC에서)
ipconfig /flushdns

6.4 SPN 재등록(필요 시)

:: 서비스 계정 SPN 조회
setspn -L DOMAIN\svc-sql

:: (예시) 포트 1433 고정인 경우 - 중복 방지 위해 -S 사용
setspn -S MSSQLSvc/SQLPROD:1433 DOMAIN\svc-sql
setspn -S MSSQLSvc/SQLPROD.DOMAIN.LOCAL:1433 DOMAIN\svc-sql

:: 중복 SPN 점검(권장)
setspn -X

SPN 관련 장애 신호

  • SSPI handshake failed / Kerberos 인증 실패
  • 특정 앱 서버에서만 간헐적 로그인 실패
    이 경우 SPN 중복/권한/레코드 전파를 우선 점검합니다.

6.5 노드 RIP 변경(Windows) — 원격 끊김 대비 필수

# 주의: 원격 접속 단절을 대비해 iDRAC/iLO/콘솔 확보 후 실행 권장

# 기존 IP 제거(예: 10.10.10.*)
Get-NetIPAddress -InterfaceAlias "Ethernet0" -AddressFamily IPv4 |
  Where-Object { $_.IPAddress -like "10.10.10.*" } |
  Remove-NetIPAddress -Confirm:$false

# 새 RIP 부여(예: 10.20.20.21/24)
New-NetIPAddress -InterfaceAlias "Ethernet0" `
  -IPAddress "10.20.20.21" -PrefixLength 24 -DefaultGateway "10.20.20.1"

# DNS 등록(정책 허용 범위 내)
Register-DnsClient

7. 품질 보증(QA) 체크리스트

클러스터/인프라

  • [ ] Test-Cluster 결과 Warning/Error에 대한 조치 완료(또는 승인된 예외 문서화)
  • [ ] 공유 스토리지/MPIO/디스크 소유권 정상
  • [ ] Failover(수동/자동) 테스트 통과

접속점(VNN/VIP)

  • [ ] VIP(10.10.10.100)로 접속 정상
  • [ ] VNN(SQLPROD)로 접속 정상 (연결 문자열 변경 없음)
  • [ ] DNS 레코드/전파 확인(nslookup 결과 일치)

네트워크/RIP 변경 반영

  • [ ] 노드 RIP(10.20.20.21/22) 기준으로 운영 접근(RDP/WinRM) 정상
  • [ ] 백업/모니터링/보안(ACL/허용목록) 시스템에 신규 RIP 반영 완료
  • [ ] 방화벽/보안장비 정책 업데이트 완료

보안/계정

  • [ ] SPN 중복 없음(setspn -X)
  • [ ] Kerberos/SSPI 오류 없음(또는 예외 원인/대응 기록)
  • [ ] SQL Agent Job/Proxy/Credential 정상

데이터/업무

  • [ ] 핵심 트랜잭션(Write) / 주요 조회(Read) / 리포트 테스트 통과
  • [ ] 성능 기준선 대비 동등 이상(또는 회귀 분석/조치 계획 수립)

8. 롤백 플랜(안전망)

롤백 전제

  • 컷오버 이후 신규 환경에 쓰기 트래픽이 들어가면 “단순 롤백”은 어려워집니다.
    따라서 런북에는 롤백 결정 시점(Go/No-Go 게이트) 을 반드시 둡니다.

단순 롤백(권장 시나리오)

1) 신규 클러스터에서 VNN/VIP Offline
2) 구 클러스터에서 VNN/VIP Online(AD/DNS 권한/상태 복구 포함)
3) 앱 접속 정상화 확인
4) 데이터 정합성 확인 후 재시도 일정 수립


9. 자주 묻는 질문(FAQ)

Q1. VIP를 유지하면 정말 앱 수정이 없나요?

A. 대부분은 없습니다. 다만 다음은 반드시 함께 점검해야 합니다.

  • 앱이 IP로 붙는지, VNN(이름)으로 붙는지(대부분 VNN)
  • 방화벽/WAF/LB/보안장비가 “노드 RIP 변경”을 인지해야 하는지
  • 모니터링/백업 에이전트가 노드 RIP를 기준으로 허용목록을 쓰는지

Q2. 노드 RIP 변경 시 가장 큰 주의점은?

A. 원격 접속 단절입니다. 반드시 iDRAC/iLO 콘솔 확보 후 진행하세요.
추가로 다음도 자주 문제 됩니다.

  • NIC 바인딩/Metric/라우팅 우선순위
  • DNS 등록 갱신
  • 백업/모니터링 서버의 접근 허용 정책(ACL) 즉시 갱신

Q3. 단일 서브넷/멀티 서브넷 모두 가능한가요?

A. 가능합니다. 다만 멀티 서브넷 환경은 추가 고려가 필요합니다.

  • DNS 등록 정책(RegisterAllProvidersIP 등)
  • 클라이언트 드라이버 옵션(예: MultiSubnetFailover=True 여부)
  • 장애 시 연결 지연/재시도 정책