mongodb_개요
구조



flowchart TD
client("client app") --> driver("driver (python, go..)")
driver --> system_security("보안(인증/ 암호화)")
driver --> system_management("관리(sharding/ replication)")
driver --> system_query("쿼리 시스템(parser/ optimizer/ execution engine)")
system_security --> storage_engine("스토리지 엔진 API")
system_management --> storage_engine
system_query --> storage_engine
storage_engine --> wired_tiger("wired tiger C API")
wired_tiger --> wired_tiger_schema("schema")
wired_tiger --> wired_tiger_cursor("cursor")
wired_tiger --> wired_tiger_transactions("transactions")
wired_tiger_schema --> E11["Metadata"]
E11 --> wired_tiger_cursor
wired_tiger_schema --> E12["dhandle / Btree"]
wired_tiger_schema --> E12
E12 --> E13["Row/Column Storage"]
wired_tiger_transactions --> F2["Snapshots"]
F2 --> F3["Eviction"]
F3 --> G1["Block Manager"]
E13 --> G1
E13 --> G2["Cache"]
G2 --> G1
G2 --> H1["History Store"]
H1 --> G1
H1 --> wired_tiger_cursor
wired_tiger_transactions --> H2["Logging"]
H2 --> G1
G1 --> I1["File System & OS interface"]
I1 --> J1["Database Files"]
I1 --> J2["Log Files"]참고
schema

replica set

sharding

mongodb 기술

인메모리
- storage.engine: inMemory
- ram - 1g 의 50% 기본설정
- 트랜젝션에서 primary node는 wiredTiger 엔진, read node는 인메모리 가능
mongodb 구조
mongodb 설계
- 아비터
- 샤딩
- 샤딩 내 레플리카의 id는 유니키 키 이지만, 타 샤딩의 레플리카 끼리 id는 중복 생성 가능
- 레플리카
기본 query/ Aggregate
- match (검색 되는 양을 조절하여 속도 개선하기 위해 우선 진행)
- group/ sort
etc query
- out
- unwind
- lookup
monitoring
index
- ESR Rule : Equality, Sort, Range
- Query에서 Equality에 대한 부분을 먼저 배치
- 그 다음 query의 order를 반영하는 필드가 반영
- 마지막에 range를 고려
- index 순서 전략
- 자주 사용하는 index 순번 지정
- 마지막 index를 제거한 index 생성하여 분기 index 지정 : 검색 파라미터를 일렬로 정렬하고 하나씩 빼서 하나의 그룹처럼 인덱스 구성 활용
search vector
mongodb transaction :: spring
setup mongodb enterprise
- https://www.mongodb.com/ko-kr/docs/manual/tutorial/install-mongodb-enterprise-with-docker/
- 독립형 업그레이드
- mongod 종료 후 enterprise mongod 실행
- 복제본 업그레이드
- mongod 종료 후 enterprise mongod 실행
- mongosh primary 연동/ 새 primary 세팅
- secondary enterprise mongod 실행
- 샤드 업그레이드
- mongosh > mongos :: sh.stopBalancer() 밸런서 비활성화 (sh.getBalancerState() :: 확인)
- 복제본의 secondary mongod 업그레이드
- mongosh primary 연동/ 새 primary 세팅
- enterprise mongod 실행
- 각 샤드 한 번에 하나씩 업그레이드
- mongos 인스턴스 업그레이드
- cluster의 mongos 연결 후 밸런서 활성화 (sh.startBalancer())
mongo dump
mongodump —uri=“mongodb://mongodb0.example.com:27017” [additional options]
mongodump —uri=“mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/?replicaSet=myReplicaSetName” [additional option]
mongodump —host {111.111.111.0} —port 27017 —db {dataBase} —out {fileName}
mongodump —uri=“mongodb://10.166.238.112:30012” -u root -p test123 —authenticationDatabase=admin —db=test —collection=test —out=~/backup/mongodump-2023-10-10
mongorestore —host 127.0.0.1 —port 27017 —drop [삭제하려는DB이름] —db [복구하려는DB이름] [복구하려는 dumpFile 위치]
mongodb ops manager
- deployment - agent : automation/ backup/ monitoring 일괄 처리 (api 존재)
- deployment - security - mongodb users : 접속 유저 권한 설정
- deployment - security - mongodb roles : role기준으로 어떤 유저가 권한을 가졌는지 보기
- deployment - security - settings : TLS(Transport Layer security)/ authentication/ agent 설정
- deployment - host mapping : 도메인에 할당된 host정보 수정
- deployment - choose server - read time : 현재 시각의 server 정보
- hostTest collection : 사용된 collection 정보를 실시간으로 노출(작업이 많은 상위 컬렉션 목록)
- slowest operations : db.currentOp() 로 조회한 가장 느린 작업 목록
- deployment - choose server - status - toffle charts
- Opcounters : 명령의 수
- Connections :
- Page faults :
- MongoDB 스키마 설계
- MongoDB는 메모리 의존적이므로 Document가 커질 수록 사용 면에서 비효율
- Lookup(임베디드 기반 컬렉션 Join)과 reference 설계가 필요
- 수동참조 : _id 값을 사용하여 직접적으로 참조사용
- DBRefs : 문서 자체를 참조규칙
- $ref : 참조할 document의 컬렉션 이름"name": "js", "ref_to_b": { "$ref":<value>, "$id":<value>, "$db":<value> }
- $id : document 내의 id 키
- $db : 참조할 document의 db 이름 - DBA관리성을 위해 Collection 분리 고려
fattern
- flag(outlier) 패턴
- 특정 값(배열 수)가 많을 경우 flag 키 값을 설정하는 패턴
- archived 패턴
- document 수가 많을 경우 따로 컬렉션을 복사하여 관리하는 패턴 (분기점을 명시하여 따로 관리하거나 참조 키를 임베딩하는 것이 확장성 용이)
- 안티 패턴
- 비대화된 document의 값들을 summary/ detail 컬렉션을 나누어 빈번한 조회와 상세로 관리
라이프사이클
- 검증규칙 : 검증 컬렉션을 생성하고 특정 validation 실패한 도큐먼트만 검색할 시 $nor 활용
- opsManager 레퍼런스 : mongodb.com/ko-rk/docs/ops-manager/current/view-real-time-metrics
- opsManager 메트릭스 지표 : docs.whatap.io/mongodb/metrics-data-list
management
- $indexStats : 인덱스 확인
db.TB_LAYER2_ADVISOR.aggregate([
{$indexStats: {}}
])
- hideindex로 인덱스를 일시적으로 비활성화 시켜 성능 확인
select
- 검색 목적시 $regex: /pattern/, $options: “i” 는 비효율적이므로 strength로 대체
{
collection: {
locale: “en”,
strength: 2 // 강도가 1, 2에서는 대소문자를 구분 안함
}
}
insert
- validator scheme
db.createCollection(”TB_LAYER2_ADVISOR”,
{
validator: {
$jsonSchema: {
bsonType: “object”,
required: [“key1”, “key2”, “key3”, “key5”],
properties: {
key1: {
bsonType: “string”,
descripttion: “문자열 타입의 필수 항목“
},
key2: {
bsonType: “int”,
minnum : 2000,
maxnum: 2030,
descripttion: “[2000, 2030] 사이 정수 타입의 필수 항목“
},
key3: {
enum: [”aws”, “azure”, “dscloud”, “hpc”, null],
descripttion: “배열 요소 중 하나이며 필수 항목“
},
key4: {
bsonType: [ “int” ],
descripttion: “해당 필드가 존재한다면 정수 타입“
},
key5: {
bsonType: “object”,
required: [ “region” ],
properties: {
resourceId: {
bsonType: “string”,
description: “해당 필드가 존재한다면 문자열“
},
region: {
bsonType: “string”,
description: “문자열 타입의 필수 항목”
}
},
},
}
}
}
}
)
update
- 시퀀스 : $inc 제한자 (시퀀스 이기 때문에 멱등 보장 않함)
db.seq_example.update(
{
“Name”: “js”,
},
{
“$inc”: {”val”: 1}
}
)
- 수정 : $set 제한자
db.COLLECTN_NAME.updateMany(
{
<조건절>
},
[{
$set: {
<업데이트 구문>
}
}]
)
- 수정삭제 : $unset 제한자
- 추가 : $push 제한자 :: field가 존재할 경우 요소를 배열 끝에 추가
- 추가삭제 : $pull : 추가된 요소를 삭제
- 갱신수정 : $save 제한자 :: $set과 유사
- validate 수정
db.runCommand(
{collmond: “TB_LAYER2_ADVISOR”,
validator: {
$jsonSchema: {
bsonType: “object”,
required: [”key1”, “key2”],
properties: {
key1: {
bsonType: “string”,
description: “문자열 타입의 필수 항목 입니다.“
},
}
}
}
}
)
벤치마크
- mongostat
- 서버의 상태를 실시간으로 확인
- 쿼리 상태
- mongotop
- mongodb 서버가 소비하는 정보 추적
- profilling
- 쿼리 효율
- explain plans
- explain 실행계획 확인