mongo DB설치하기 (Feat. Docker)

2019-11-25

일전에 프로젝트 하나를 진행하게 되었는데.
DB의 로우데이터를 특정 조건에 맞게 집계를 해야했다.
프로젝트 규모나 사용성을 봤을때는
rdbms로 작업해도 크게 무리가 되지 않는 스펙이었다
근데 주변 동료들이 no-sql로 하는건 어떠냐고 해서 한번 해보기로 했다.

DB 선택하기

먼저 어떤 db engine이 가장 많이 사용되는지 검색해 봤다
여기 에서 확인 해보니 Document 기반으로는 MongoDB 순위가 높았다
통계 Data 특성상 스키마간 RelationShip이 크게 필요하지 않을 것이라 생각해서 MongoDB로 해보기로 했다

MongoDB ?

MongoDB는 필요한 쿼리 및 인덱싱을 통해 원하는 확장성과 유연성을 갖춘 문서 데이터베이스입니다.

특징

  1. Document-oriented storage : MongoDB는 database > collections > documents 구조로 document는 key-value형태의 BSON(Binary JSON)으로 되어있다
  2. Full Index Support : 다양한 인덱싱을 제공한다.
    1. Single Field Indexes : 기본적인 인덱스 타입
    2. Compound Indexes : RDBMS의 복합인덱스 같은 거
    3. Multikey Indexes : Array에 매칭되는 값이 하나라도 있으면 인덱스에 추가하는 멀티키 인덱스
    4. Geospatial Indexes and Queries : 위치기반 인덱스와 쿼리
    5. Text Indexes : String에도 인덱싱이 가능
    6. Hashed Index : Btree 인덱스가 아닌 Hash 타입의 인덱스도 사용 가능
  3. Replication& High Availability : 간단한 설정만으로도 데이터 복제를 지원. 가용성 향상
  4. Auto-Sharding : MongoDB는 처음부터 자동으로 데이터를 분산하여 저장하며, 하나의 컬렉션처럼 사용할 수 있게 해준다. 수평적 확장 가능
  5. Querying(documented-based query) : 다양한 종류의 쿼리문 지원. (필터링, 수집, 정렬, 정규표현식 등)
  6. Fast In-Pace Updates : 고성능의 atomic operation을 지원
  7. Map/Reduce : 맵리듀스를 지원.(map과 reduce 함수의 조합을 통해 분산/병렬 시스템 운용 지원, 하둡처럼 MR전용시스템에 비해서는 성능이 떨어진다)
  8. GridFS : 분산파일 저장을 MongoDB가 자동으로 해준다. 실제 파일이 어디에 저장되어 있는지 신경 쓸 필요가 없고 복구도 자동이다.
  9. Commercial Support : 10gen에서 관리하는 오픈소스

장점

  1. Flexibility : Schema-less라서 어떤 형태의 데이터라도 저장할 수 있다.
  2. Performance : Read & Write 성능이 뛰어나다. 캐싱이나 많은 트래픽을 감당할 때 써도 좋다.
  3. Scalability : 애초부터 스케일아웃 구조를 채택해서 쉽게 운용가능하다. Auto sharding 지원
  4. Deep Query ability : 문서지향적 Query Language 를 사용하여 SQL 만큼 강력한 Query 성능을 제공한다.
  5. Conversion / Mapping : JSON형태로 저장이 가능해서 직관적이고 개발이 편리하다.

단점

  1. 정합성이 떨어지므로 트랜잭션이 필요한 경우에는 부적합하다. (ex. 금융, 결제, 회원정보 등)
  2. JOIN이 없다. join이 필요없도록 데이터 구조화 필요
  3. memory mapped file으로 파일 엔진 DB이다. 메모리 관리를 OS에게 위임한다. 메모리에 의존적, 메모리 크기가 성능을 좌우한다. 2-4를 참고하자.
  4. SQL을 완전히 이전할 수는 없다.
  5. B트리 인덱스를 사용하여 인덱스를 생성하는데, B트리는 크기가 커질수록 새로운 데이터를 입력하거나 삭제할 때 성능이 저하된다. 이런 B트리의 특성 때문에 데이터를 넣어두면 변하지않고 정보를 조회하는 데에 적합하다.

MongoDB 설치 (Feat. Docker)

사전 설치 서버에 Docker설치를 해야한다.
이전 회사 특성상 root권한이 없었기에 관리자에게 설치 요청

Image Download

필요한 Image는 Docker Hub 에서 검색이 가능하다

1
docker pull mongo

Download 된 이미지 확인

1
docker images

Image 생성

1
docker build -t mongo:tl_mongo .

Container 생성

1
docker run -dit -p 27017:27017 -v /home1/irteam/mongo/data:/data/db --name ubuntu --net=host -e MONGO_INITDB_ROOT_USERNAME=id입력부분 -e MONGO_INITDB_ROOT_PASSWORD=pwd입력부분 mongo --auth--auth

인증모드로 mongo접속

1
docker exec -it {containerId} mongo -u id입력부분 -p pwd입력부분 -authenticationDatabase admin

MongoDB Compass

워크벤치나 토드같은 client 도구이다
https://www.mongodb.com/download-center/compass