부하테스트용 EC2 백엔드 서버 및 인프라 구축 방법
부하테스트용 백엔드 인프라 구성 방법
부하테스트용 EC2 백엔드 서버 생성 방법
AWS > EC2 검색 > 인스턴스 시작 버튼 > 이름 : backend-server 입력 > Quick Start : Ubuntu 운영체제 선택 > 인스턴스 유형 : t3a.small (테스트용 스프링부트 애플리케이션의 사양에 맞는 인스턴스 유형 선택) 확인 > 키 페어(로그인) : 키 페어 생성 > 다운로드된 키 파일 보관 > 네트워크 설정에서 방화벽(보안 그룹) : 다음에서 SSH 트래픽 허용 (0.0.0.0/0), 인터넷에서 HTTP 트래픽 허용 선택 (80번 포트로 서버와 통신 가능) > 인스턴스 시작 > 인스턴스 상태가 대기 중에서 실행 중으로 변경되면 서버 연결 가능
부하테스트 서버에서 부하를 보낼 테스트용 백엔드 서버 EC2 인스턴스를 생성합니다.
RDS DB 전용 보안그룹 생성 ★
AWS > EC2 검색 > 네트워크 및 보안 > 보안그룹 메뉴 > 보안 그룹 생성 > 보안 그룹 이름 : mysql-db-sg 입력 > 설명 : MySQL 전용 DB 보안그룹 입력 > 인바운드 규칙 : 규칙 추가 > 유형 : MYSQL/Aurora 선택, 소스 : 소스 : Anywhere-IPv4 (0.0.0.0/0) 선택 > 보안 그룹 생성
MySQL DB에 접속 가능하도록 허용하는 인바운드 규칙을 따로 관리하는 보안 그룹을 생성합니다.
실습 편의를 위해 0.0.0.0/0으로 설정했으나, 필요한 IP 또는 보안 그룹으로 접근을 제한하는 것이 좋습니다.
AWS RDS 생성 방법
AWS > RDS 검색 > 데이터베이스 생성 > 표준 생성 > MySQL 선택 > 템플릿 : 프리티어 > DB 인스턴스 식별자 : test-database > 마스터 사용자 이름 : admin > 마스터 암호, 마스터 암호 확인 : 패스워드 입력하여 설정 > 인스턴스 구성 : db.t4g.micro > 퍼블릭 액세스 : 예 선택 > 기존 VPC 보안 그룹 : 생성한 mysql-db-sg 보안그룹 선택 > 추가 구성 > 초기 데이터베이스 이름 : testdb > 데이터베이스 생성 > 데이터베이스 상태가 생성 중에서 백업 중으로 변경되면 엔드포인트가 표시되고, 사용 가능으로 변경되면 엔드포인트로 DB 연결 가능
AWS ALB 생성 방법
AWS > EC2 검색 > 로드 밸런싱 > 로드밸런서 메뉴 > 로드밸런서 생성 > 로드밸런서 유형 ALB 선택 > 생성 > 로드 밸런서 이름 : backend-alb 입력 > 네트워크 매핑에서 가용 영역 : 서브넷 4개 모두 선택 > 보안 그룹 : 새 보안 그룹 생성 > 보안 그룹 이름 : backend-alb-sg 입력 > 설명 : ALB 전용 보안그룹 입력 > 인바운드 규칙 : 규칙 추가 > 유형 : HTTP 선택, 소스 : 소스 : Anywhere-IPv4 (0.0.0.0/0) 선택 > 보안 그룹 생성 > 보안 그룹 우측 새로고침 버튼 클릭 > 기존 default 보안그룹 제거 > 생성한 backend-alb-sg 보안그룹 선택 > 리스너 및 라우팅 : 대상 그룹 생성 > 대상 유형 선택 : 인스턴스 체크 > 대상 그룹 이름 : backend-tg 입력 > 상태 검사 경로 : /health 입력 > 다음 > 대상 등록에서 사용 가능한 인스턴스 : 생성한 EC2 백엔드 서버 인스턴스 체크 > 선택한 인스턴스를 위한 포트 : 80 확인 > 아래에 보류 중인 것으로 포함 클릭 > 대상 그룹 생성 > 대상 그룹 선택 우측 새로고침 버튼 클릭 > 생성한 대상그룹 backend-tg 선택 > 로드밸런서 생성 > ALB 로드밸런서 상태가 프로비저닝 중에서 활성 중으로 변경되면 로드밸런서 사용 가능
부하테스트 툴에서 요청을 보내면, 여러 백엔드 서버로 요청을 분산하는 로드밸런서를 생성합니다.
ELB 중에서 ALB는 HTTP/HTTPS 웹 트래픽 처리에 특화된 로드밸런서입니다.
EC2 백엔드 서버에 스프링부트 애플리케이션 실행 방법
EC2 서버 콘솔 접속
AWS > EC2 검색 > name : backend-server 인스턴스 ID 클릭 > 연결 > 연결
JDK 설치
sudo apt update
sudo apt install openjdk-17-jdk
스프링부트 애플리케이션을 실행하기 위해서 JDK 설치를 선행해야 합니다.
JDK 정상 설치 확인
java -version
스프링부트 프로젝트 클론 받기
cd /home/ubuntu
git clone https://github.com/JSCODE-COURSE/load-testing-server.git
부하테스트용 간단한 스프링부트 프로젝트 코드를 GitHub 저장소에서 내려받습니다.
스프링부트 프로젝트 구성 확인
ALB Health Check용 API
@RestController
public class AppController {
@GetMapping("/health")
public String healthCheck() {
return "Success Health Check";
}
}
ALB 로드밸런서가 호출하여 인스턴스 정상 실행 여부를 확인하는 헬스 체크 API 컨트롤러입니다.
게시글 조회 및 생성 API
@RestController
@RequestMapping("boards")
public class BoardController {
private BoardService boardService;
public BoardController(BoardService boardService) {
this.boardService = boardService;
}
@GetMapping()
public List<Board> getBoards(
@PageableDefault(size = 20, sort = "createdAt", direction = Sort.Direction.DESC)
Pageable pageable
) {
return boardService.getBoards(pageable);
}
@PostMapping()
public Board writeBoard(@RequestBody Board board) {
return boardService.writeBoard(board);
}
}
게시글을 최신순으로 조회하거나 생성하는 API 컨트롤러입니다.
부하테스트 툴에서 호출하여 테스트하기 위한 용도로 작성되었습니다.
생성한 RDS 정보 입력
vi /load-testing-server/src/main/resources/application.yml
아래와 같이, application.yml 파일에 DB 연결 정보를 작성하고 저장합니다.
# 생략하면 스프링부트 기본 포트 8080으로 설정 됨
server:
port: 80
# DB 연결 정보 설정
spring:
datasource:
url: jdbc:mysql://RDS엔드포인트:3306/testdb
username: admin
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: create
ddl-auto: create는 애플리케이션을 실행할 때마다 기존 테이블을 삭제하고 다시 만드는 설정입니다.
부하테스트 실습용 프로젝트이므로 테스트 환경을 초기화하기 위해 사용하였습니다.
JPA로 정의한 엔티티 매핑 정보를 기반으로 데이터베이스 테이블을 자동 생성합니다.
스프링부트 프로젝트 빌드
cd /load-testing-server
./gradlew clean build -x test
build 폴더 안에 스프링부트 프로젝트가 빌드된 JAR 파일이 생성됩니다.
스프링부트 애플리케이션 실행
cd build/libs
sudo nohup java -jar jscode-0.0.1-SNAPSHOT.jar > app.log 2>&1 &
nohup 명령어로 빌드된 JAR 파일을 이용하여 스프링부트 프로젝트를 백그라운드에서 실행합니다.
표준 출력 및 에러는 app.log에 저장되어 tail 명령어로 확인할 수 있습니다.
스프링부트 애플리케이션 정상 실행 여부 확인
lsof -i:80
또는
ps -ef | grep java
80번 포트를 사용 중인 프로세스를 확인하거나, java 프로세스가 실행중인지 확인하면 됩니다.
EC2 서버로 요청하여 스프링부트 애플리케이션 응답 확인
http://EC2서버IP/health
EC2 서버에서 실행 중인 스프링부트 애플리케이션의 /health API를 직접 호출하여,
Success Health Check가 웹 화면에 정상 표시되는지 확인합니다.
ALB 로드밸런서로 요청하여 스프링부트 애플리케이션 응답 확인
AWS > EC2 검색 > 로드 밸런싱 > 로드밸런서 메뉴 > 생성한 backend-alb 로드밸런서 이름 클릭 > DNS 이름 복사 >
http://ALB로드밸런서DNS이름/health
ALB 로드밸런서 DNS 이름으로 /health API를 호출하면, 대상 그룹에 등록된 EC2 서버로 요청이 전달됩니다.
Success Health Check가 웹 화면에 정상 표시되는지 확인합니다.
RDS DB에 데이터 추가
MySQL 더미 데이터 100만개 생성 방법
-- 최대 밤복(재귀) 횟수를 기본값 1000이 아닌, 생성할 더미 데이터 개수보다 높거나 같게 설정
SET SESSION cte_max_recursion_depth = 1000000;
-- 더미 데이터 삽입 쿼리
INSERT INTO boards (content, title, created_at)
WITH RECURSIVE cte (n) AS
(
SELECT 1
UNION ALL
SELECT n + 1 FROM cte WHERE n < 1000000 -- 생성할 더미 데이터 개수
)
SELECT
CONCAT('Content', LPAD(n, 7, '0')), -- 'Content' + 7자리 숫자로 구성된 content 컬럼 데이터 생성
CONCAT('Title', LPAD(n, 7, '0')), -- 'Title' + 7자리 숫자로 구성된 title 컬럼 데이터 생성
TIMESTAMP(DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 3650) DAY) + INTERVAL FLOOR(RAND() * 86400) SECOND) AS created_at -- 최근 10년 내 임의의 날짜와 시간 생성
FROM cte;
-- 전체 데이터 개수 확인 (정상 생성 완료 시 1000000개 조회)
SELECT COUNT(*) FROM boards;
운영 환경 데이터가 100만개라 가정하고, 비슷한 환경을 구성하기 위해서 더미 데이터 100만개를 생성합니다.