TL;DR
MongoDB에서 Read 성능 최대로 하려면, readPreference를 nearest로
(자세한 내용은 본문에 있지만 내용이 깁니다, 바쁘신 분은 성능 요약표만 보셔도 됩니다만 주의사항은 꼭!)
IT Journeyman
IT에 무조건 좋은 것은 없습니다, 모든 것에는 대가가 따릅니다. 그러므로 잘 알고 사용해야...
특히 NoSQL에서는 기존 RDBMS(Oracle)와는 다르게 SMP가 아닌 MPP구조를 선택하여 Read/Write Concern, Read Preference(MongoDB), Consistency Level(Apache Cassandra) 등의 파라미터로 Consistency를 사용자가 선택할 수 있도록 합니다. 권한에는 책임이 따르므로 사용자가 그 내용을 잘 알고 사용해야 합니다.
(자세한 내용은 추후 블로그에서 다뤄보기로 하겠습니다.)
Table of Contents
Executive Summary
● 성능 요약 - readPreference
● Recommended readPreference
0. Performance Test Tool - POCDriver
0-1 : Test Server : c5.4xlarge 16 vCPU, 32GB
0-2 : Sample Data
0-3 : Test Database
1. M60 (NVMe SSD) - 100% Read w/ Primary(default)
1-1 : Resource Usage
1-2 : Test Result
2. M60 (NVMe SSD) - 100% Read w/ secondaryPreferred
2-1 : Resource Usage
2-2 : Test Result
3. M60 (NVMe SSD) - 100% Read w/ nearest
3-1 : Resource Usage
3-2 : Test Result
Executive Summary
- 성능 요약 - readPreference
| Primary(default) | secondaryPreferred | nearest | |
| Read/s | 23,648 | 86,530 | 95,468 |
keyqueries 100%로 수행(Index Scan Only)
- Recommended readPreference
- Read 성능을 최대로 내기 위해서는 nearest를 권장
(readPreference는 Read/Write Concern과는 다른 개념으로 혼동하면 안 됨) - Read 성능이 부족하다면, Secondary를 추가하는 것을 권장
Primary + Secondary = 홀수, 1 DC 구성인 경우 두 개씩 추가만 가능 - Secondary 두 개 추가 대신에 Analytic 노드 1개 추가 가능함
(Analytic Node는 Vote에 참여하지 않으므로 홀수룰에서 제외됨) - 주의 사항
Write Concern이 Majority이거나 1일 경우, 변경이 반영되지 않은 데이터를 읽을(Stale Read)의 가능성이 존재함, Read Consistency가 중요한 어플리케이션의 경우에는 readPreference를 Primary로 설정하여 사용할 것을 권장함
0. Performance Test Tool - POCDriver
(Github Link : https://github.com/johnlpage/POCDriver?tab=readme-ov-file)
0-1 : Test Server : c5.4xlarge 16 vCPU, 32GB
tdate="$(date '+%Y%m%d_%H%M%S')"
java -jar ./bin/POCDriver.jar -d 300 \
-i 0 -k 100 -t 128 -b 1024 \
-c "mongodb+srv://it_admin:manager@kylelive.npgjj.mongodb.net/?retryWrites=true" | tee POCDriver_${tdate}.log
cat ./run.sh | tee -a POCDriver_${tdate}.log
0-2 : Sample Data
ubuntu@ip-172-31-24-248:~/POCDriver$ java -jar ./bin/POCDriver.jar -i 100 -t 300 -e -p
13:47:48.126 [main] INFO com.johnlpage.pocdriver.POCDriver - 26 - MongoDB Proof Of Concept - Load Generator version 0.1.2
{
"_id": {
"w": 1,
"i": 12345678
},
"fld0": 111316,
"fld1": {
"$date": "2021-06-13T08:15:21.057Z"
},
"fld2": "dolor sit amet, consetetur",
"fld3": "Stet clita kasd gubergren, no",
"fld4": "invidunt ut labore et dolore",
"fld5": {
"$date": "2020-04-20T02:09:43.871Z"
},
"fld6": 1649139,
"fld7": "et ea rebum. Stet clita kasd",
"fld8": "est Lorem ipsum dolor sit",
"fld9": 655099,
"bin": {
"$binary": {
"base64": "",
"subType": "00"
}
}
}
0-3 : Test Database
M60 (NVMe SSD) Tier로 Primary 1, Secondary 4, Analytic 1로 구성

1. M60 (NVMe SSD) - 100% Read w/ Primary(default)
1-1 : Resource Usage


1-2 : Test Result
After 300 seconds, 0 new documents inserted - collection has 173239913 in total
0 inserts per second on average
23648 keyqueries per second on average
0 updates per second on average
0 rangequeries per second on average
tdate="$(date '+%Y%m%d_%H%M%S')"
java -jar ./bin/POCDriver.jar -d 300 \
-i 0 -k 100 -t 128 -b 1024 \
-c "mongodb+srv://it_admin:manager@kylelive.npgjj.mongodb.net/?retryWrites=true" | tee POCDriver_${tdate}.log
cat ./run.sh | tee -a POCDriver_${tdate}.log
2. M60 (NVMe SSD) - 100% Read w/ secondaryPreferred
2-1 : Resource Usage


2-2 : Test Result
After 300 seconds, 0 new documents inserted - collection has 173239913 in total
0 inserts per second on average
86530 keyqueries per second on average
0 updates per second on average
0 rangequeries per second on average
tdate="$(date '+%Y%m%d_%H%M%S')"
java -jar ./bin/POCDriver.jar -d 300 \
-i 0 -k 100 -t 128 -b 1024 \
-c "mongodb+srv://it_admin:manager@kylelive.npgjj.mongodb.net/?retryWrites=true&readPreference=secondaryPreferred" | tee POCDriver_${tdate}.log
cat ./run.sh | tee -a POCDriver_${tdate}.log
3. M60 (NVMe SSD) - 100% Read w/ nearest
3-1 : Resource Usage
Analytic Node가 세 번째 Graph이다, Read 작업에 같은 비중으로 참여하고 있음을 알수 있다.


3-2 : Test Result
After 300 seconds, 0 new documents inserted - collection has 173239913 in total
0 inserts per second on average
95468 keyqueries per second on average
0 updates per second on average
0 rangequeries per second on average
tdate="$(date '+%Y%m%d_%H%M%S')"
java -jar ./bin/POCDriver.jar -d 300 \
-i 0 -k 100 -t 128 -b 1024 \
-c "mongodb+srv://it_admin:manager@kylelive.npgjj.mongodb.net/?retryWrites=true&readPreference=nearest" | tee POCDriver_${tdate}.log
cat ./run.sh | tee -a POCDriver_${tdate}.log
'T. > MongoDB' 카테고리의 다른 글
| [Data Lake]Atlas Data Federation (0) | 2024.07.30 |
|---|---|
| [Sizing]Extended Storage Sizes (0) | 2024.07.27 |
| Atlas Chart Demo w/ Lookup(Join) (0) | 2024.07.22 |
| Atlas Chart Demo (0) | 2024.07.22 |
| [Backup & Recovery]DB 복구, 그 아찔한 기억(Table Level Recovery) (0) | 2024.06.06 |