Ncloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서(Network Proxy Load Balancer)로 분산시키는 방법입니다

개요

MySQL DB서버의 부하를 줄이기 위해 보통 읽기 전용 DB서버를 생성하게 되는데, 읽기 전용 서버를 여러대 생성해서 로드밸런서(Load Balancer)로 연결하면 읽기 부하를 분산 시키고 좀 더 안정적인 서비스가 가능해집니다.

여기서는 Ncloud (네이버 클라우드) VPC 환경에서 관리형 DB인 Cloud DB for MySQL의 읽기 전용 Slave DB를 네트워크 프록시 로드밸런서(Network Proxy Load Balancer)에 연결하고 제대로 부하가 분산되는지 확인해보겠습니다.

사전 준비

DB 접속과 부하 분산을 테스트할 서버가 필요합니다. 여기서는 CentOS 7.8 서버를 준비했습니다.

DB 서버 생성

우선 [Cloud DB for MySQL] - [DB Server]에서 DB를 생성합니다.

서버 설정

DB엔진 버전과 VPC, 그리고 Subnet을 선택합니다.

[고가용성 지원]을 선택하면 [Standby DB]도 추가로 생성되고, [Multi Zone]을 선택하면 Master와 Standby Master DB를 각각 [서로 다른 Zone에 생성]해서 안정성을 높일 수 있습니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

DB 서버 타입, 스토리지 타입, 스토리지 용량, DB 서버 이름, DB 서비스 이름 등을 입력합니다.
Private Sub 도메인을 선택하고 입력하면 [*.{Private Sub Domain}.vpc-cdb.ntruss.com] 같은 형식으로 도메인이 생성됩니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

DB 설정

USER ID, DB 접근 HOST(IP), USER 암호, 접속 포트, DB명 등을 입력합니다.
고가용성을 선택한 경우 [Backup]은 기본으로 무조건 사용하게 됩니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

Slave DB Server 추가

DB가 생성되었으면 [Master] DB를 선택하고, [DB 관리]에서 [Slave 추가] 메뉴를 선택합니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

Slave DB Server를 추가할 때 설정할 수 있는 것은 Subnet 입니다. 부하 분산을 위해서는 2대 이상을 추가해야 하는데, 여기서는 테스트를 위해 2대를 추가하겠습니다.
우선 첫번째 Slave DB Server는 KR-2 존에 추가했습니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

다음으로 두번째 Slave DB Server는 KR-1 존에 추가해보겠습니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

이렇게 Slave DB Server 2대를 추가해서 [Master], [Standy Master] 포함 총 4대의 서버가 생성되었습니다.

[Master] DB 서버와 첫번째 [Slave] DB 서버는 KR-2 존에,
[Standy Master] DB 서버와 두번째 [Slave] DB 서버는 KR-1 존에 생성해서 안정성을 높이는 구조를 선택했습니다.
cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

Target Group 설정

다음으로 Load Balancer와 Cloud DB for Mysql을 연결할 Target Group을 설정해보겠습니다.

Target Group 생성

여기서 중요한 항목은 프로토콜입니다. [Network Proxy Load Balancer]에 사용할 Target Group이므로 [PROXY_TCP]를 선택합니다.
포트는 Cloud DB for Mysql 생성 시에 사용했던 포트를 입력해야 하는데 여기서는 3306을 사용하겠습니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

Health Check 설정

Health Check 설정에서는 TCP 프로토콜을 선택합니다. 포트는 마찬가지로 3306을 입력합니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

Target 추가

Target 추가 화면에 가면 앞에서 생성했던 Slave DB Server 2대를 확인할 수 있는데, 선택 후에 오른쪽으로 이동시킵니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

Load Balancer 생성

여기서는 [네트워크 프록시 로드밸런서 (Network Proxy Load Balancer)]를 선택합니다.

애플리케이션 로드밸런서(Application Load Balancer)는 Cloud DB for MySQL의 부하분산에 사용할 수 없습니다.
cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

로드밸런서 생성

안정성을 높이려면 로드밸런서도 멀티존으로 구성할 수 있습니다. KR-1, KR-2 두 곳의 서브넷을 모두 선택하겠습니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

리스너 설정

리스너 프로토콜은 TCP, 포트는 3306으로 설정합니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

Target Group 선택

위에서 생성했던 Target Group을 선택합니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

ACG 설정

[Cloud DB for MySQL]에 접근하는 로드밸런서들의 Subnet 대역을 ACG에 추가해야 합니다.

Load Balancer 서브넷 확인

ACG에 추가할 멀티존으로 구성된 로드밸런서의 서브넷 2가지를 확인합니다.
그리고, 테스트 시에 접속할 로드밸런서의 접속 정보를 메모해 둡니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

ACG 확인

[Cloud DB for MySQL]의 [Master] DB를 선택하고 [ACG] 항목 옆의 버튼을 클릭합니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

[ACG] 리스트에서 해당 ACG를 선택하고 [ACG 설정] 버튼을 클릭합니다.

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

ACG 규칙 추가

필요한 ACG 규칙을 추가합니다.

  • Load Balancer (KR-1) -> Cloud DB for MySQL 접근 규칙
  • Load Balancer (KR-2) -> Cloud DB for MySQL 접근 규칙
cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

테스트 서버 설정

DB 부하 분산 테스트에 사용할 서버에 MySQL Client를 설치합니다.

~# yum -y install mysql
cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

부하 분산 테스트

설치된 MySQL Client를 이용해서 Load Balancer 도메인으로 접속한 후에 접속한 DB 서버의 호스트명을 확인하는 쿼리를 실행합니다.

여러 차례 반복해보면 아래와 같이 위에서 추가했던 Slave DB [test-003-OOO], [test-004-OOO]에 각각 접속되는 것을 확인할 수 있습니다.

~# mysql -h {Load Balancer 접속 도메인} -u {계정} -p
MySQL [(none)]> SELECT @@hostname;

[test-003-OOO]에 접속된 상태

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

[test-004-OOO]에 접속된 상태

cloud VPC 환경에서 Cloud DB for MySQL 서버의 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법

DB 삭제

테스트를 끝낸 DB를 삭제하려고 할 때 [Slave나 Recovery DB 서버가 있는 경우 Master DB를 삭제할 수 없습니다.]라는 메시지가 나타나는 것을 확인할 수 있습니다.

그래서 DB를 삭제할 때는 [Slave DB]부터 삭제해야 하고, [Slave DB]를 삭제할 때에도 동시에 삭제할 수 없고 1대씩 차례로 삭제해야 합니다.

Ncloud Classic 환경에서 Cloud DB for MySQL 디비의 읽기 부하를 로드밸런서로 분산시키는 방법

참고 URL

  1. Ncloud Cloud DB for MySQL 읽기 부하 분산 설정 가이드
  2. VPC 환경 Cloud DB for MySQL 읽기 부하를 네트워크 로드밸런서로 분산시키는 방법
  3. Classic 환경 Cloud DB for MySQL 읽기 부하 로드밸런서로 분산시키는 방법