1. MongoDB 튜닝 방법
* MongoDB 튜닝
- 데이터 베이스 튜닝이 필요한 시점
: 설계와 사용자의 패턴이 달라졌을 경우
: 잘못된 설계일 경우
: 데이터가 축적되거나 장비의 노후화 일 경우
- 데이터 튜닝방법
: 데이터 모델 튜닝
: 질의 튜닝
: 아키텍쳐 튜닝
: 인스턴스 튜닝
: 하드웨어 튜닝
* MongoDB 튜닝
: 가장 쉬운 방법은 하드웨어를 업그레이드하는 하드웨어 튜닝
: 데이터 모델이나, 질의 튜닝은 비지니스 모델에 대한 깊은 이해를 필요로 하는 어려운 튜닝 방법
: 또한 데이터 마이그래이션도 동반하기 때문에 라이브 모드에서 쉬운 결정이 아님.
: 아키텍쳐 튜닝이나 인스턴스 튜닝은 실 서비스 단계에서 선택하기에 어려운 점이 많음
: 실행중이기 때문에, 타이밍이나 소요되는 시간을 감안해야 함.
* 데이터 모델 튜닝
: 초기에 설계한 데이터 모델이 제대로 성능을 발휘하지 못할 때 필요한 조치
: 설계미흡, 예측하지 못한 데이터 입력, 용도 변경에 인함.
: 가장 알맞는 데이터 모델을 가지고 있어야 함.
: 최초 컬랙션 생성시 기본 익스텐트 크기가 할당됨
: 너무 작으면 쓰기 작업이 발생할 때 새로운 익스텐트를 할당 받을 때마다 지연이 발생
: RDBMS에서도 발생함
: 초당 몇만건 이상되는 빅데이터처리를 위해서라면 미리 예측해서 지정해야 한다/
: MongoDB의 Document 자료구조
: 데이터를 중첩하여 Embedding형태로 구성하는 것을 추천한다.
: 하지만, 데이터의 밀접도가 낮을 경우 Linking방식으로 설계하는 것을 고려해야 한다.
: MongoDB도 빠른 검색을 위한 인덱스 시스템을 가지고 있음
: 백그라운드 인덱스 타입으로 생성이 가능함
: insert마다 인덱스를 생성하여 성능저하가 발생하지 않도록 해야함.
: MongoDB의 복합 인덱스
: RDBMS처럼 다중 인덱스 가능
: 우선순위에 따라 지정하는 것이 좋고, RUD가 잦은 필드도 제외해야함.
* 질의 튜닝
: MongoDB는 서버에 질의된 문장을 profiling하는 것이 가능함.
: 분석 결과는 db.system.profile Collection 에 저장됨
: 질의 문장들의 분석이 가능함 (Explain 함수)
: 질의 문장의 성능이 저하되는 원인인 인덱스를 찾을 수 있음
* 아키텍쳐 튜닝
: 운영체제의 메모리 설정을 따라기기 때문에 충분한 map Memory 영역이 필요함
: 하나의 시스템에서 하나의 인스턴스만 실행해야한다..
: 단일 노드보다는 다중 노드로 서비스하는 것이 유리하다.
: 샤드 시스템을 통해 분산 저장과 Load balancing의 장점을 얻을수 있다.
* 하드웨어 튜닝
: 가장 쉬운 방법
: SDD사용, 충분한 메모리 공간 사용, 다중코어, 다중 node사용
: Mongopref 유틸리티를 사용하면 MongoDB의 Disk I/O상태 확인 가능
* Profile 시스템
: 질의 결과에 대한 프로파일링 시스템을 제공
: 분석 결과는 db.system.profile 콜랙션에 저장
: 일정 시간이 초과된 질의를 추출할 수 있음
: 성능 튜닝할 대상등을 선정하는 것이 가능해짐
: Propile을 위해 환경설정이 필요하다
> db.commandHelp("profile") // 사용방법 출력
: 현재 프로파일 설정 상태 확인
> db.getProfilingLevel() // 결과가 0이면 시스템을 사용하지 않음, 1이면 100ms 이상 걸린 정보를 저장함, 2이면 System에서 발생한 모든 정보를 저장함
: 설정 변경
> db.setProfilingLevel(2) // 입력이 0이면 시스템을 사용하지 않음, 1이면 100ms 이상 걸린 정보를 저장함, 2이면 System에서 발생한 모든 정보를 저장함
: 저장된 프로파일 정보 조회
> db.system.profile.find() // 전체내역 확인
> db.system.profile.find({millis:{$gt:5}}) // 특정시간이상 걸린 정보들만 조회
2. MongoDB 보안 팁
* 인증 설정
: 설치과정 중 인증과 관련된 설정을 하는 부분이 없음
: 설치후 누구나 DB에 접속할 수 있음
: 허가된 사용자만이 DB에 접속할 수 있도록 계정, 패스워드를 설정해양 한다.
: 실행 시 인증정보를 사용하겠다는 파라미터를 포함하면 됨
: 데이터베이스별로 계정과 패스워드를 추가하여 사용하는 것을 권장
: 각 DB별 계정 정보는 system.users라는 namespace에 저장됨
: db.removeUser(username) 명령으로 계정 삭제 가능
* MongoDB 종료
: MongoDB 안전종료 방법
: foreground로 실행시 Ctrl-C로 강제종료 // 권장하지않음
: MongoDB Shell 이용시 db.shutdownServer()
: 반드시 -auth 패러미터를 사용하여 mongod를 구동해야함.
: 드라이버 이용시 {"shutdown":1} 명령
* HTTP 인터페이스 보안
: 누구나 HTTP 인터페이스에 접근해서는 안되기 때문에, -auth 패러미터를 사용해서 mongod 인스턴스를 구동해야함