본문 바로가기
카테고리 없음

[Kafka + MongoDB] 몽고디비 데베지움 커넥터 (part.1 MongoDB 클러스터와 oplog)

by 개복취 2024. 4. 7.

 

MongoDB의 데베지움 커넥터를 사용하기 위해서는 MongoDB 클러스터를 구축하고 oplog를 분석해서 데이터를 캡쳐해야한다.

 

oplog는 MySQL의 binlog, PostgreSQL의 WAL 과 비슷하다고 보면 된다. 대표적으로 binlog와 oplog를 비교하면 아래와 같은 차이가 있다. 

 

oplog vs. binlog

사용 데이터베이스 MongoDB (NoSQL) MySQL, MariaDB (SQL)
주요 목적 데이터 복제, 변경 사항 스트리밍 데이터 복제, 복구, 감사
기록 형태 순차적 로그 (텍스트 기반) 바이너리 로그
적용 사례 데이터베이스 클러스터 내 고가용성 유지 데이터 복제, 포인트-인-타임 복구, 변경 사항 감사
데이터 변경 사항 기록 삽입, 갱신, 삭제 DDL 및 DML 쿼리
효율성 데이터 변경 사항의 간단한 기록으로 빠른 동기화 가능 바이너리 형태로 기록하여 복제 효율성 증가

 

대부분 바이너리 로그로 되어있는 기록형태를 감안했을 때, oplog는 희한하게 텍스트기반 스키마로 작성되어있다. 

 

oplog를 mongoDB클러스터의 local 에서 db.oplog.rs.find().pretty() 명령어를 통해 뜯어보면 다음과 같다.

 

 

oplog에서는 정의되어있는 스키마마다 다음과 같은 정보를 담고있다.

ts Timestamp 오퍼레이션을 기록한 시간의 타임스탬프입니다. 이는 oplog 항목의 순서를 결정하는 데 사용됩니다.
h Long 오퍼레이션의 해시 값입니다. 각 오퍼레이션이 고유함을 보장합니다.
op String 오퍼레이션의 타입을 나타냅니다. 예를 들어, 'i'는 삽입(insert), 'u'는 업데이트(update), 'd'는 삭제(delete)를 의미합니다.
ns String 오퍼레이션이 발생한 데이터베이스와 컬렉션의 이름입니다. 예: "mydatabase.mycollection"
o Document 오퍼레이션의 세부 사항을 담고 있습니다. 삽입의 경우 삽입된 문서, 업데이트의 경우 업데이트 사항 등입니다.
o2 Document 업데이트 오퍼레이션의 경우, 업데이트되는 문서의 _id를 포함합니다. 삭제나 삽입 오퍼레이션에는 사용되지 않습니다.

 

스키마가 모두 텍스트기반이라서 바이너리 로그보다 비효율적일것 같다고 생각했는데 MongoDB내부엔진 WiredTiger이 알아서 잘 처리해준다고 한다..

 

 

몽고디비 레플리카셋

oplog가 Standalone/local 모드에서는 기록되지 않는것과는 별개로, 서비스 운영에 있어서 레플리카 셋 구축은 필수이다. 

 

 

PSS / PSA 구조

 

PSS: 서로 헬스체크를 해주고 Primary노드에 장애 및 오류가 발생했을 때 신속하게 복구 할 수 있도록 한다. 이로써, 높은 가용성(HA)을 보장한다.

 

PSA: Arbiter노드는 서버의 리소스를 많이 담고 있지 않고, 실제로도 데이터를 담고 있지 않기 때문에 안정성이 낮다. 

 

도커이미지를 띄우고 아무 mongosh들어가서 인스턴스를 초기화 시켜주었다. 

 

 

본격적인 클러스터 구축 및 데베지움 연동은 part2에서 이어서..