Mongo DB Atlas vs mongodb vs rds 비교

이진우·2024년 9월 28일
0

스프링 학습

목록 보기
41/41

계기

채팅 내용을 어디다가 저장하는게 나을까 하던 중
MongoDb를 선택했다.

MongoDB를 사용할 때 Ec2 에 따로 배포를 할까 아니면 클라우드에 저장되는 mongodb atlas 를 이용할 까 생각하다가

편하게 관리를 할 수 있는 atlas 를 사용하기로 마음먹었다.

항상 무료로 사용할 수 있는 것이 아니라 아래와 같이 선택을 할 수 있는데

M0 은 스토리지가 너무 적다고 생각하였고,
M10 은 시간 당 0.1 달러 하루에 대략 2.4달러 한달에 대략 72 달러... 라 매우 금전적으로 부담되었다.
그래서 중간인 Serverless 를 선택했지만

region 을 korea 를 선택할 수 없는 단점이 있었다.

확인 결과 M10 과 M0 은 모두 Korea 가 있었다...

하지만 어쩌겠는가 MongoDB를 사용하기로 이미 마음먹었기 때문에
계속 진행해보았다.

그리고 성능을 판단해보고 쓰잘데기 없으면 삭제하도록 하자고 생각했다.

성능 테스트

비교를 위해 EC2 를 따로 생성한 이후
MongoDB의 docker image 를 pull 하여 실행하였고

이와 Serverless 의 성능을 비교하고자 하였다.

이왕 하는 김에 rds 도 같이 비교해보고자 한다.

테스트 환경

Apache Jmeter 를 활용하려고 하며,
부하 등등을 수행해보자.

스크립트는 아래와 같이 작성하였다.

RDS

RDS 는 JDBC Connection Configuration 을 이용하여 설정 하였고
JDBC Request 에

INSERT INTO `message` (`created_at`, `updated_at`, `contents`, `chatting_room_id`, `sender_id`) 
VALUES (NOW(), NOW(), 'Hello, this is a test message', 8, 1188);

와 같은 쿼리를 작성하였다.

atlas 와 Ec2 mongodb

먼저 테스트를 위해서는 mongodb java driver 를 다운로드 받아야 한다.
기본 apache jmeter 에 내장되어 있는 java driver 로는 에러가 걸리는데 어떤 에러가 났는지는 기억이 안나므로 생략

그리고 jmeter/lib 에 넣어주면 된다. 이를 통해 mongodb 와 jmter 를 통신할 수 있게 해줄 수 있다.

이후

첫 번쨰 JSR223 Sampler 에서

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import com.mongodb.client.model.Sorts;

try {

	String uri = "mongodb+srv://아이디:비밀번호@dev-c....net";

		MongoClient mongoClient = MongoClients.create(uri);

MongoDatabase database = mongoClient.getDatabase("db이름");

MongoCollection<Document> collection = database.getCollection("collection이름");

Document latestDocument = collection.find()
				.sort(Sorts.descending("createdAt")) // "timestamp" 필드 기준으로 내림차순 정렬
				.first(); // 첫 번째 문서 가져오기
 
vars.putObject("chatting", collection);
 
 return "Connected to " + latestDocument.toJson();
}
catch (Exception e) {
 SampleResult.setSuccessful(false);
 SampleResult.setResponseCode("500");
 SampleResul
 

두번째 JSR223 에서

import com.mongodb.client.MongoCollection;
import org.bson.Document;
import org.bson.types.ObjectId;
import java.util.Arrays;
import java.time.LocalDateTime;

try {
 MongoCollection<Document> collection = vars.getObject("chatting");
 
   Document document = new Document("_id", new ObjectId()) // 자동 생성되는 _id 필드
        .append("chattingRoomId", 1)
        .append("senderId", 8110)
        .append("contents", "hihihi")
        .append("createdAt", LocalDateTime.now()) // 현재 시간으로 생성
        .append("_class", "com.gaduationproject.cre8.domain.chat.entity.ChattingMessage");
 
 collection.insertOne(document);
return "Document inserted";
}
catch (Exception e) {
 SampleResult.setSuccessful(false);
 SampleResult.setResponseCode("500");
 SampleResult.setResponseMessage("Exception: " + e);
}

를 사용해서 Write 의 성능을 확인할 수 있게 했다.

세번쨰 JSR223 에서는

import com.mongodb.client.MongoCollection;
import org.bson.Document;
import org.bson.types.ObjectId;
import java.util.Arrays;
import java.time.LocalDateTime;
import com.mongodb.client.MongoClient;

try {
 
 MongoClient mongoClient = vars.getObject("mongoClient");
 mongoClient.close();
 
return "close";
}
catch (Exception e) {
 SampleResult.setSuccessful(false);
 SampleResult.setResponseCode("500");
 SampleResult.setResponseMessage("Exception: " + e);
}

으로 설정해서 connection을 닫아주도록 했다.

왜냐?

이거땜에 계속 connection 이 쌓이면서 오류가 났기 때문입니다.

전체적으로는

이런 흐름을 가진다.

Write

100 명의 유저가 동시에 write 할 떄

즉 아래와 같은 환경이다.

RDS

mongodb-atlas

mongodb - ec2

1명의 유저가 반복적을 100번 write 수행

RDS

Mongodb-atlas

mongodb-ec2

READ

테스트 환경

5000 건의 데이터를 저장한 이후 조회속도를 비교한다.

100명의 유저가 한번에 조회

RDS

mongodb-atlas

mongodb-ec2

1명의 유저가 100번 조회

RDS

mongodb-atlas

mongodb-ec2

결론

단순히 MongoDB를 사용한다고 나는 mysql 보다 더 빠르게 조회를 수행했습니다.

라는 것이 아니라는 것을 느꼈다.

물론 지식의 부족으로 완벽히 동일한 환경에서 mysql 과 mongodb 를 비교한 것은 아니라고 생각하지만...

이거하나는 분명했다.

atlas serverless 보다 그냥 ec2 하나 파서 mongodb 돌리는게 훨씬 성능이 좋았다.

참고할 만한 자료

https://www.researchgate.net/publication/349764039_Analyzing_Performance_Differences_Between_MySQL_and_MongoDB

mongodb 와 mysql 을 조회 , write , update 등에 대해서 비교해놓은 논문이다.
큰돌님의 영상에서도 소개가 된 바 있다.

여기서도 역시 다양한 방면에서 성능 개선이 있었다고 주장하니
읽어보면 좋을 것 같다.

profile
기록을 통해 실력을 쌓아가자

0개의 댓글