본문 바로가기
DATABASE/MsSQL

[MsSQL] SQL Server - AlwaysOn Basic 구성 (AD 없이 처음부터 끝까지)

by DANEW 2024. 4. 23.

SQL Server - High Availability

데이터베이스를 운영함에 제일 중요한 것은 무엇일까?

중요한 것은 많지만 그 중에 하나를 꼽자면 바로 서버 이중화를 통한 고가용성 - High Availability (HA) 이 꼭 나올 것이다.

장애가 나도 최대한 빠른시간에 대처하여 서비스를 유지할 수 있게 해주는HA구성이야 말로 운영 서비스 중 제일 중요하기 때문이다.

 

SQL Server 의 여러가지 HA구성 방법 중 Active Directory (AD) 설정이 없이 AlwaysOn Basic을 구성하는 방법에 대해서 소개해보도록 하겠다.

 

AlwaysOn Basic

기존에 구성되어있는 SQL Server에서 라이센스 비용을 아끼고자 SQL Server 2019 Standard 버전으로 변경하여 구성 후 AlwaysOn Basic의 적용을 고려하게 되었다.

 

AlwaysOn Basic은 SQL Server 2016 Standard 버전부터 제공되는 HA구성 방법 중 하나로 기존의 AlwayOn보다 제약사항이 조금 있다.

 

크게 차이나는 몇가지를 소개해보자면 아래와 같다.

- Standard 버전에만 AlwaysOn Basic을 구성 가능

- 하나의 가용성 그룹에 하나의 데이터베이스만 존재가 가능

- 주 가용성 복제본만 읽고 쓰기가 가능

- 보조 가용성 복제본은 읽기 불가능, 백업 불가능

 

AlwaysOn Basic 구성

AlwaysOn을 구성하기위해서는 Server 세팅과 Database 세팅이 필요하다.

하나하나 차근차근 진행해보도록 하자.

 

총 2대의 Windows Server를 사용하여 AlwaysOn Basic을 구성하였다.

 

IP는 4개의 IP를 사용하였으며, 예를들어 아래와 같이 사용하였다. 본문에는 모자이크되어 명칭으로 대체하겠다.

 

Windows Server - Node 1 / 100.100.100.1

Windows Server - Node 2 / 100.100.100.2

Windows Server - Cluster / 100.100.100.3

SQL Server - Listener / 100.100.100.4

 

Windows Server - 네트워크 관련 세팅

Windows Server의 네트워크 설정을 한다.

[제어판 -> 네트워크 공유 센터 -> 어댑터 설정 변경]

두대의 서버에 각각의 IP와 게이트웨이 주소를 넣어준다. AD서버 없이 진행 하므로 DNS 서버 주소는 빈값으로 넘어간다.

Node 1 서버에는 100.100.100.1 / Node2 서버에는 100.100.100.2 주소가 들어갈 것이다.

 

다음으로는 컴퓨터 명칭 변경한다.

[제어판 -> 시스템 -> 고급 시스템 설정 -> 컴퓨터 이름 -> 변경]

컴퓨터이름은 각각 사용하기 편한명칭으로 바꾼다. node1 / node2로 각각의 서버 명칭을 정하였다.

반응형

이어서 DNS 접미사 까지 추가로 설정 한다.

[자세히 -> 컴퓨터의 DNS 접미사 설정 (아무 명칭 가능)]

각 서버의 동일한 접미사를 설정 해준 후 Windows Server를 재시작한다.

 

IP 설정과 컴퓨터 명칭관련 설정이 끝나면 Hosts 파일 수정한다.

[경로 C:\Windows\System32\drivers\etc 에 위치한 hosts 파일을 메모장으로 실행]

파일 맨 아래에 [IP - TAB - 컴퓨터이름.DNS접미사] 로 Server 1, 2와 Cluster 를 명시해준다.

100.100.100.1        node1.alwayson

100.100.100.2        node2.alwayson

100.100.100.3        cluster.alwayson

 

Windows Server -  포트 세팅

Node1과 Node2의 서버에서 SQL Server와 AlwaysOn을 위한 포트를 오픈한다.

[제어판 -> Windows Defender 방화벽 -> 고급설정 -> 인바운드 규칙 -> 새규칙]

인바운드 규직으로 1433, 5022 포트를 접근을 허용한다.

 

Windows Server - 클러스터 설정

각 서버에서 PowerShell을 관리자로 실행하여 아래의 명령어를 실행한다.

new-itemproperty -path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name LocalAccountTokenFilterPolicy -Value 1

 

다음으로 각 서버의 서버관리자를 통해 장애조치 클러스터링 기능을 설치 한다.

[서버관리자 -> 관리 -> 역할 및 기능 추가]

앞에부분은 기본 값들로 넘어간 후 기능 페이지에서 장애조치 클러스터링을 체크하여 설치한다.

설치가 완료되면 각 서버를 재부팅한다.

 

설치 된 장애조치 클러스터링 기능을 통해 클러스터를 생성하도록 한다.

[서버 관리자 -> 도구 -> 장애조치 클러스터 관리자 -> 클러스터 만들기]

클러스터에 포함될 노드들의 명칭을 입력하여 추가한다.

우리는 위에 설정했던 node1.alwayson / node2.alwayson을 추가하면 된다.

초반에 설정한 hosts 파일에 입력했던 cluster라는 명칭과 해당 IP주소를 입력한다.

클러스터가 생성되었다.

 

SQL Server - 설치 및 세팅

SQL Server 2016이상의 Standard 버전을 설치한다.

SQL Server 2019 Standard 설치는 아래의 링크를 참고하자.

 

[MsSQL] SQL Server 2019 Standard 기본 설치 (Windows Server)

 

두 서버의 데이터 경로는 같은 경로를 유지하여야 한다.

 

설치가 완료되었으면, SQL Server 구성관리자를 통해 Always On 설정을 활성화 한다.

[SQL Server 구성 관리자 -> SQL Server 서비스 -> SQL Server 속성 -> Always On 가용성 그룹]

두 서버 모두 Always On 가용성 그룹 사용을 활성화 체크하여 적용 후 서비스를 재시작한다.

 

SQL Server - 마스터키, 계정 및 인증서 생성

각 서버에 아래의 경로로 인증서를 보관 할 폴더 생성,  각 서버에 같은경로이기만 하면 된다.

[C:\alwayson]

 

Node1과 Node2에서 각각 쿼리를 순서대로 실행한다. Node1은 주황색 / Node2는 푸른색으로 표현하겠다.

 

[Node1] - 마스터키 생성, 계정 생성, 인증서 생성 및 백업

-- Node1의 master key 생성
create master key encryption by password = 'Password12!@'

-- Node1에 Node2 로그인용 계정 생성
create login LOGIN_NODE2 with password = 'Password12!@'
create user LOGIN_NODE2 for login LOGIN_NODE2

-- Node1의 인증서 생성
create certificate MAIN_CERT with subject = 'node1 certificate'

-- Node1의 인증서 백업
backup certificate MAIN_CERT to file = 'C:\alwayson\MAIN_CERT.cert'

 

[Node2] - 마스터키 생성, 계정 생성, 인증서 생성 및 백업

-- Node2의 master key 생성
create master key encryption by password = 'Password12!@'

-- Node2 로그인 생성 / Node1에 접속용
create login LOGIN_NODE1 with password = 'Password12!@'
create user LOGIN_NODE1 for login LOGIN_NODE1

-- Node2의 인증서 생성
create certificate SUB_CERT with subject = 'node2 certificate'

-- Node2의 인증서 백업
backup certificate SUB_CERT to file = 'C:\alwayson\SUB_CERT.cert'

 

생성한 인증서를 각각의 서버로 옮겨 넣는다 (각각 MAIN, SUB 인증서를 다 가지고 있다)

 

[Node1] - 옮겨온 인증서 추가

-- Node1
create certificate SUB_CERT authorization LOGIN_NODE2 from file = 'C:\alwayson\SUB_CERT.cert'

 

[Node2] - 옮겨온 인증서 추가

-- Node2
create certificate MAIN_CERT authorization LOGIN_NODE1 from file = 'C:\alwayson\MAIN_CERT.cert'

 

[Node1] - EndPoint 생성 

-- Node1 EndPoint 생성
create endpoint AG_EP
       state = started
    as tcp (listener_port = 5022, listener_ip = ALL)
   for database_mirroring (authentication = certificate MAIN_CERT, role = ALL) 

-- Node1 계정 권한 추가
grant connect on endpoint::AG_EP to LOGIN_NODE2

 

[Node2] - EndPoint 생성 

-- Node2 EndPoint 생성
create endpoint AG_EP
       state = started
    as tcp (listener_port = 5022, listener_ip = ALL)
   for database_mirroring (authentication = certificate SUB_CERT, role = ALL) 

-- Node2 계정 권한 추가
grant connect on endpoint::AG_EP to LOGIN_NODE1

 

SQL Server - Availability Group 생성

SSMS로 Node1에 접속하여 가용성 그룹 생성

[SQL Server Node1 -> Always On 고가용성 -> 가용성 그룹 -> 새 가용성 그룹]

새로운 가용성 그룹의 명칭을 정하며 생성한다.

이름 추가

데이터베이스 수준 상태 검색 체크

사용 가능한 복제본의 추가를 하여 NODE2를 추가한다

 - 읽을수 있는 보조 : 아니요

 - 시딩 모드 : 자동

위와 같이 가용성 그룹이 생성되었으며, 추가로 Node2를 가용성 그룹에 연결한다.

[Node2를 우클릭 -> 가용성 그룹에 조인]

 

SQL Server - 가용성 데이터베이스 추가

AlwaysOn Basic의 가용성 그룹에는 하나의 데이터베이스만 추가 할 수 있다.

여러 개의 데이터베이스를 이중화 하기 위해서는 여러 개의 가용성 그룹을 생성해야 한다...

 

먼저 Node1에서 데이터베이스를 생성 후 Full Backup / Log Backup을 진행한다.

-- 데이터베이스 생성
create database BAN_DB

-- Full Backup
backup database BAN_DB to disk = 'C:\alwayson\BAN_DB.bak'

-- Log Backup
backup log BAN_DB to disk = 'C:\alwayson\BAN_DB.trn'

 

Full Backup / Log Backup 파일(bak, trn)을 Node2 서버로 복사해 넣는다.

 

복사해온 파일을 Node2 데이터베이스에 복구 한다.

-- full backup 복구
restore database BAN_DB from disk = 'C:\alwayson\BAN_DB.bak' with norecovery

-- log backup 복구
restore log BAN_DB from  disk = 'C:\alwayson\BAN_DB.trn' with norecovery

 

wtih norecovery 명령어를 추가하여 복원 중 상태로 만든다.

 

Node1로 돌아와 용성 데이터베이스를 추가해보자

[Always On 고가용성 -> 가용성 그룹 -> AG_01 -> 가용성 데이터베이스 우클릭 -> 데이터베이스 추가]

가용성 데이터베이스에 추가할 데이터베이스를 체크한다.

 

Node2와 연결한다.

동기화 기본 설정은 조인만을 선택하여 진행한다.

데이터베이스가 동기화되며, 가용성 데이터베이스에 추가되었음을 확인한다.

 

Node1 (주) 에서는 읽기 쓰기가 가능하지만, Node2 (보조) 에서는 해당 데이터베이스에 접근이 불가하다. (alwayson basic)

Node1 (주)의 서버가 다운되어 failover가 발생하면, Node2 (보조) -> Node2 (주)로 전환 된 후 접근이 가능해진다.

 

SQL Server - 가용성 그룹 수신기 추가

가용성 그룹 수신기는 AlwaysOn 가용성 그룹의 각 복제본(노드)의 데이터베이스에 접근하기위한 클라이언트 가상 네트워크 이름이다.

가용성 그룹 수신기를 사용하면, 클라이언트가 SQL Server의 실제 IP 주소나 인스턴스 이름을 알 필요 없이 수신기를 통해 접속할 수 있으며, failover가 발생하더라도 연결 문자열(IP 주소 혹은 인스턴스 이름)을 수정하지 않아도 된다.

 

Node1에서 가용성 그룹 수신기를 추가한다.

[Always On 고가용성 -> 가용성 그룹 -> AG_01 -> 가용성 그룹 수신기 우클릭 -> 수신기 추가]

네트워크 모드를 고정 IP로 바꾼 후 수신기 DNS 이름과 포트 1433을 입력해준다.

추가 버튼을 눌러 수신기로 사용할 IP 주소를 입력한다. (예: 맨처음 정의한 100.100.100.4 를 사용)

원격지에서 이제 100.100.100.4를 통해 해당 데이터베이스를 접근 할 수 있게 된다. 

 

Comment

아직 테스트는 더 해봐야하지만, 여러 데이터베이스를 가용성 데이터베이스로 추가하고 싶으면,

새로운 가용성 그룹을 만들어야하기에 그때마다 가용성 그룹 수신기를 추가해야하는데, IP주소에 대한 부담이 있었다.

 

근데 하나의 가용성 그룹 수신기만 있으면, 모든 데이터베이스에 해당 수신기를 통해 접근이 가능한것 같지만, 관련된 문서를 찾아볼 수 없었다.

 

여러모로 구성에 대해서만 소개하게 되었지만, 혹여나 테스트 및 운영을 하게된다면 운영에 대한 내용도 추가 포스팅으로 설명하도록 하겠다.

반응형