Cloud DB for MySQL 읽기 부하를 네트워크 로드밸런서로 분산시키는 방법 | VPC
개요
MySQL DB서버의 부하를 줄이기 위해 보통 읽기 전용 DB서버를 생성하게 되는데, 읽기 전용 서버를 여러대 생성해서 로드밸런서(Load Balancer)로 연결하면 읽기 부하를 분산 시키고 좀 더 안정적인 서비스가 가능해집니다.
여기서는 Ncloud (네이버 클라우드) VPC 환경에서 관리형 DB인 Cloud DB for MySQL의 읽기 전용 Slave DB를 네트워크 로드밸런서(Network 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에 생성]해서 안정성을 높일 수 있습니다.
DB 서버 타입, 스토리지 타입, 스토리지 용량, DB 서버 이름, DB 서비스 이름 등을 입력합니다.
Private Sub 도메인을 선택하고 입력하면 [*.{Private Sub Domain}.vpc-cdb.ntruss.com] 같은 형식으로 도메인이 생성됩니다.
DB 설정
USER ID, DB 접근 HOST(IP), USER 암호, 접속 포트, DB명 등을 입력합니다.
고가용성을 선택한 경우 [Backup]은 기본으로 무조건 사용하게 됩니다.
접속포트 설정: DB 접속포트는 한번 설정하면 이후에 변경할 수 없으니 신중하게 설정하셔야 합니다.
Slave DB Server 추가
DB가 생성되었으면 [Master] DB를 선택하고, [DB 관리]에서 [Slave 추가] 메뉴를 선택합니다.
Slave DB Server를 추가할 때 설정할 수 있는 것은 Subnet 입니다. 부하 분산을 위해서는 2대 이상을 추가해야 하는데, 여기서는 테스트를 위해 2대를 추가하겠습니다.
우선 첫번째 Slave DB Server는 KR-2 존에 추가했습니다.
다음으로 두번째 Slave DB Server는 KR-1 존에 추가해보겠습니다.
이렇게 Slave DB Server 2대를 추가해서 [Master], [Standy Master] 포함 총 4대의 서버가 생성되었습니다.
[Standy Master] DB 서버와 두번째 [Slave] DB 서버는 KR-1 존에 생성해서 안정성을 높이는 구조를 선택했습니다.
Target Group 설정
다음으로 Load Balancer와 Cloud DB for Mysql을 연결할 Target Group을 설정해보겠습니다.
Target Group 생성
여기서 중요한 항목은 프로토콜입니다. [Network Load Balancer]에 사용할 Target Group이므로 [TCP]를 선택합니다.
포트는 Cloud DB for Mysql 생성 시에 사용했던 포트를 입력해야 하는데 여기서는 3306을 사용하겠습니다.
Health Check 설정
Health Check 설정에서는 TCP 프로토콜을 선택합니다. 포트는 마찬가지로 3306을 입력합니다.
Target 추가
Target 추가 화면에 가면 앞에서 생성했던 Slave DB Server 2대를 확인할 수 있는데, 선택 후에 오른쪽으로 이동시킵니다.
Load Balancer 생성
여기서는 [네트워크 프록시 로드밸런서 (Network Load Balancer)]를 선택합니다.
로드밸런서 생성
현재 네트워크 로드밸런서는 멀티존으로 구성할 수 없습니다. 그래서 서브넷 선택에서도 1개만 선택할 수 있습니다.
리스너 설정
리스너 프로토콜은 TCP, 포트는 3306으로 설정합니다.
Target Group 선택
위에서 생성했던 Target Group을 선택합니다.
ACG 설정
네트워크 로드밸런서와 연동을 할 때는 로드밸런서의 Subnet 대역 뿐만 아니라 [네트워크 로드밸런서]에 접근하는 장비의 공인 IP를 [Cloud DB for MySQL]의 ACG에 추가해야 합니다.
⁃ 그래서 로드밸런서에 접속하는 서버 IP를 Target Group에 묶인 장비(여기서는 DB 서버)에 그대로 전달하게 됩니다.
⁃ 그러므로 ACG에는 로드밸런서의 Subnet 대역이 아닌 접속하는 서버의 공인 IP를 허용해 주어야 합니다.
Test 서버 공인 IP 확인
테스트를 위해 미리 준비해 둔 CentOS를 설치한 서버입니다. ACG 설정에 추가할 공인 IP를 확인합니다.
Load Balancer 서브넷 확인
ACG에 추가할 멀티존으로 구성된 로드밸런서의 서브넷을 확인합니다.
그리고, 테스트 시에 접속할 로드밸런서의 접속 정보를 메모해 둡니다.
ACG 확인
[Cloud DB for MySQL]의 [Master] DB를 선택하고 [ACG] 항목 옆의 버튼을 클릭합니다.
[ACG] 리스트에서 해당 ACG를 선택하고 [ACG 설정] 버튼을 클릭합니다.
ACG 규칙 추가
필요한 ACG 규칙을 추가합니다. 여기서는 테스트에 필요한 다음 항목들을 추가했습니다.
- Test CentOS Server -> Cloud DB for MySQL 접근 규칙
- Load Balancer -> Cloud DB for MySQL 접근 규칙
테스트 서버 설정
DB 부하 분산 테스트에 사용할 서버에 MySQL Client를 설치합니다.
CentOS 7부터는 yum으로 설치하는 MySQL의 기본 데이터베이스가 MariaDB로 변경되었습니다.
yum -y install 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]에 접속된 상태
[test-004-OOO]에 접속된 상태
DB 삭제
테스트를 끝낸 DB를 삭제하려고 할 때 [Slave나 Recovery DB 서버가 있는 경우 Master DB를 삭제할 수 없습니다.]라는 메시지가 나타나는 것을 확인할 수 있습니다.
그래서 DB를 삭제할 때는 [Slave DB]부터 삭제해야 하고, [Slave DB]를 삭제할 때에도 동시에 삭제할 수 없고 1대씩 차례로 삭제해야 합니다.
참고 URL
-
Ncloud Cloud DB for MySQL 읽기 부하 분산 설정 가이드
https://guide.ncloud-docs.com/docs/database-database-5-2#읽기-부하-분산-설정 -
Classic 환경 Cloud DB for MySQL 읽기 부하를로드밸런서로 분산시키는 방법
https://docs.3rdeyesys.co/docs/database/cloud-db-mysql/load-balance/classic-lb/ -
VPC 환경 Cloud DB for MySQL 읽기 부하를 네트워크 프록시 로드밸런서로 분산시키는 방법
https://docs.3rdeyesys.com/docs/database/cloud-db-mysql/load-balance/vpc-network-proxy-lb/
문서 업데이트 내역
날짜 | 내용 |
---|---|
2022-08-08 | 문서 최초 생성 |