[NCP - CloudDB for MySQL Slave 부하 분산] use. Loadbalancer

Naver Cloud 플랫폼에서 지원하는 관리형 DB인 Cloud DB for Mysql에 LB를 추가하여 부하 분산 해볼 예정입니다.

Cloud DB for Mysql에서 고가용성으로 생성하게 되면 Master-Slave 구조로 생성됩니다. 이 두 노드는 failover시 서로 role이 바뀌어가기 때문에 standby master의 role을 가진 slave DB는 LB에 추가 할 수도 접속 할 수도 없습니다.

따라서 이번 테스트에서는 Master와 Standby Master 두 노드를 제외한 Slave DB 2개를 추가하여 구성하였습니다.

전체적인 구성은 위 그림과 같습니다. 

 

 

WAS에서 아래와 같이 설정하여 Slave노드에 read작업을 부하분산 하도록 설정하였습니다.

Write 작업 -> Master 노드

Read 작업 -> LoadBalancer(Slave 노드)

 

 

 

■ Cloud DB for Mysql 생성

 

 

■ 상단의 DB관리 바에서 Slave 추가 클릭 (Slave 총 3대 생성) 

 

 

 

※ DB role이 Master와 Standby Master는 Loadbalancer에 할당 할 수 없습니다. 즉 최소 노드 4개는 있어야 합니다..

 

■ Load Balancer 생성

 

■ LB생성
네트워크 유형 Private IP 선택
프로토콜 TCP

 

 

 

■ ACG 설정 

 

■ LB 상태 확인

 

■ LB 접속용 vm에 ACG추가

 
■ LB로 접속 후 hostname 확인.
새로운 세션은 hostname 변경. loadbalance 정상 동작 확인

 

■ Master 서버에 public 도메인 생성 후 직접 접속

 

## Master서버에 Data입력

[root@tunning ~]# mysql -ujeongg -p -h db-atniq.pub-cdb.ntruss.com
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 31180
Server version: 8.0.25 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> use jh;
Database changed

MySQL [jh]> create table test(i int);
Query OK, 0 rows affected (0.015 sec)

 

## Slave 서버에서 data확인

<jh-test-003>
MySQL [(none)]> select * from jh.test;
+------+
| i    |
+------+
|    1 |
+------+

<jh-test-004>
MySQL [(none)]> select * from jh.test;
+------+
| i    |
+------+
|    1 |
+------+

 

■ 대량 데이터 삽입(10만건)
slave insert 속도 비교 -> 비동기 방식
MySQL [jh]> CREATE TABLE Nonprimenumber(num INT PRIMARY KEY);
Query OK, 0 rows affected (0.016 sec)

DELIMITER $$
CREATE PROCEDURE myFunction()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE (i <= 100000) DO
        INSERT INTO `Nonprimenumber` VALUE (i);
        SET i = i + 1;
    END WHILE;
END$$
DELIMITER ;


## 프로시저 호출
MySQL [jh]> call myFunction();



<jh-test-003>
MySQL [(none)]> select count(*) from jh.Nonprimenumber;
+----------+
| count(*) |
+----------+
|    35182 |
+----------+
1 row in set (0.007 sec)

MySQL [(none)]> select count(*) from jh.Nonprimenumber;
+----------+
| count(*) |
+----------+
|    35939 |
+----------+
1 row in set (0.004 sec)

MySQL [(none)]> select count(*) from jh.Nonprimenumber;
+----------+
| count(*) |
+----------+
|    37345 |
+----------+
1 row in set (0.004 sec)



<jh-test-004>
MySQL [(none)]> select count(*) from jh.Nonprimenumber;
+----------+
| count(*) |
+----------+
|    34545 |
+----------+
1 row in set (0.004 sec)

MySQL [(none)]> select count(*) from jh.Nonprimenumber;
+----------+
| count(*) |
+----------+
|    35762 |
+----------+
1 row in set (0.005 sec)

MySQL [(none)]> select count(*) from jh.Nonprimenumber;
+----------+
| count(*) |
+----------+
|    36095 |
+----------+
1 row in set (0.005 sec)

 

WAS까지 구현하지 못해 디테일하게 구현하지 못했으나 DB단만 봤을때 비동기방식이라 트랜잭션이 많은 환경에서 해당 구성이 적합한지는 모르겠습니다..대량의 select작업을 구현해서 배치성으로 구성이 적합한지 확인해봐야겠습니다.

 

 

참고

 

네이버 설명서

https://www.ncloud.com/product/database/cloudDbMysql

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

https://guide.ncloud-docs.com/docs/database-database-5-2#%EC%9D%BD%EA%B8%B0-%EB%B6%80%ED%95%98-%EB%B6%84%EC%82%B0-%EC%84%A4%EC%A0%95

 

DB Server - Cloud DB for MySQL 사용

 

guide.ncloud-docs.com