NoSql/mongo(또는 tokumx)
                
              mongodb 4.2의 'Zstandard' 압축 효과 확인
                달사자!
                 2020. 7. 23. 12:27
              
                          
            - 
목적
- 
mongodb Zstandard(이하 zstd)압축 알고리즘 효과 및 압축옵션 적용시 find 성능에 문제가 없는지 확인
- 
환경
- 
mongodb 4.2 서버
- 
java 드라이버 4.0.4
- 
방법
- 
압축 옵션 적용/미 적용시 압축율과 find 성능 확인
- 
테스트 결과
- 
용량 절약에 효과가 있으며 find 성능 문제 없음
- 
상세 내용은 하단 참고
[필요사항]
- 
테스트용 java 프로그램(하단 참고)
mongodb 드라이버 maven dependency
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-core</artifactId>
    <version>4.0.4</version>   
</dependency>
테스트용 java 소스
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());
   }
}[결과]
- 
압축 옵션 미 적용시
- 
파일 사이즈
- 
소요시간
- 
압축 zstd 적용시
- 
파일 사이즈
- 
소요시간