package com.biz.mongodb;
import com.mongodb.BasicDBObject;
import com.mongodb.Block;
import com.mongodb.MongoClientSettings;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Indexes;
import com.mongodb.connection.ClusterSettings;
import org.bson.Document;
import java.util.*;
/**
* 몽고DB 서버의 압축 효율 테스트
* - DB서버의 압축 옵션을 적용/ 미 적용 후 bulk 데이터 저장 후 find 성능 확인
*
* @author 엄승하
*/
public class MongodbNotCompressTest {
private static final String dbAddr = "192.168.56.1"; //로컬 vm에 mongodb 4.2를 설치함
private static final String dbName = "compress_test_db"; //db명
private static final int bulkSaveDataSize = 1_000_000; //bulk 데이터 저장 갯수
private static final String dummyTest = "Zstandard is a real-time compression algorithm, providing high compression ratios. It offers a very wide range of compression / speed trade-off, while being backed by a very fast decoder";
private static MongoDatabase mongoDB;
public static void main(String[] args) {
MongoClient mongoClient = getNewMongoClient(dbAddr);
mongoDB = mongoClient.getDatabase(dbName);
final String colNm = "no_compress";
//final String colNm = "compress"; //압축 테스트때 사용하는 컬렉션명
mongoDB.getCollection(colNm).createIndex(Indexes.ascending("uuid")); //인덱스 추가
long startSave = System.currentTimeMillis();
//100만건을 insert해봄
saveBulkData(colNm, bulkSaveDataSize);
long duSaveMills = System.currentTimeMillis() - startSave;
System.out.println(String.format("테스트 데이터 저장 소요시간: '%s'", duSaveMills));
//1건을 추가로 insert 후 find 속도 확인
final String addedUuid = "last-uuid";
Document addLastDoc = new Document();
addLastDoc.append("i", bulkSaveDataSize + 1);
addLastDoc.append("uuid", addedUuid);
addLastDoc.append("dummy_text", dummyTest);
addLastDoc.append("doc_make_date", new Date());
mongoDB.getCollection(colNm).insertOne(addLastDoc);
findByUuid(colNm, addedUuid); //find
mongoClient.close();
}
/**
* UUID로 데이터 찾기
*
* @param colNm 컬렉션명
* @param uuid 찾을 UUID
*/
public static void findByUuid(String colNm, String uuid) {
long startFind = System.currentTimeMillis();
MongoCursor<Document> cur = mongoDB.getCollection(colNm).find(new BasicDBObject("uuid", uuid)).iterator(); //find
while (cur.hasNext()) {
Document doc = cur.next();
System.out.println("\nfind결과:" + doc);
}
long duFindMills = System.currentTimeMillis() - startFind;
System.out.println(String.format("\nfind 소요시간: '%s'", duFindMills));
}
/**
* bulk로 데이터 저장
*
* @param colNm 저장할 컬렉션명
* @param dataSize 저장할 데이터 갯수
*/
public static void saveBulkData(String colNm, int dataSize) {
Date now = new Date();
List<Document> docs = new ArrayList<>(dataSize);
for (int i = 1; i <= dataSize; i++) {
Document doc = new Document();
doc.append("i", i);
doc.append("uuid", UUID.randomUUID().toString());
doc.append("dummy_text", dummyTest);
doc.append("doc_make_date", now);
docs.add(doc);
}
mongoDB.getCollection(colNm).insertMany(docs); //N개 insert
//Thread.sleep(10); //부하분산 목적
}
public static MongoClient getNewMongoClient(String dbAddr) {
List<ServerAddress> serverList = Arrays.asList(new ServerAddress(dbAddr, 27017));
Block<ClusterSettings.Builder> clusterSettings = builder -> builder.hosts(serverList);
//mongo와 실제 커넥션 생성(mongo client생성)
return MongoClients.create(MongoClientSettings.builder().applyToClusterSettings(clusterSettings).build());
}
}
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.(AWS에서는 SG로 보안처리 하고 있어서 편의상 모두 허용하기도 함)
#bindIp: 127.0.0.1 # Listen to local interface only, comment to listen on all interfaces. (주석으로 막으면 모든 IP에서 접속 가능. AWS에서는 SG로 보안처리 하고 있어서 편의상 모두 허용하기도 함)
#bindIp: 127.0.0.1 # Listen to local interface only, comment to listen on all interfaces. (주석으로 막으면 모든 IP에서 접속 가능. AWS에서는 SG로 보안처리 하고 있어서 편의상 모두 허용하기도 함)
replication:
replSetName: repl_set
#참고 : 몽고 replica 설정
primary가 될 서버에서 몽고 콘솔로 접속 : mongo
#Replica set 초기화
rs.initiate()
#Secondary 노드 추가
rs.add("secondary장비의 IP:27017")
#Arbiter 노드 추가
rs.add("arbiter장비IP:37017",arbiterOnly:true)
# 잘 저장되는지 테스트
use testdb
db.test_collection.insert({'msg':'test message'})
db.test_collection.find()
#Secondary에서는 아래 명령 실행 후 조회해 보면 됨
db.slaveOk(true)
#참고 - 1개 장비에 여러개의 몽고데몬을 실행시켜야할 경우
1개의 몽고DB를 설치하면 아래에 service 파일이 생성됨
/etc/systemd/system/multi-user.target.wants
해당 디렉토리의 mongod.service 심볼릭링크가 가리키는 파일(/usr/lib/systemd/system/mongod.service) 이 하나의 데몬 파일
/usr/lib/systemd/system/mongod.service 파일을 복사하여 한개 더 생성(ex. cp /usr/lib/systemd/system/mongod.service /usr/lib/systemd/system/mongod2.service)