MongoDB 트랜잭션이 Docker에서 작동하지 않는 이유와 해결 방법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
인프라/DevOps/보안
대상자
MongoDB와 Docker를 사용하는 개발자, DevOps 엔지니어.
난이도: 중간 (Docker와 MongoDB 기초 지식 필요)
핵심 요약
- 트랜잭션 지원을 위해 MongoDB는 복제 집합(replica set)이 필수 (단일 노드도 포함)
startSession()
/startTransaction()
사용 시 복제 집합 구성이 전제- 보안 강화를 위한 keyfile 기반 인증 및 app-scoped 사용자 생성 필수
섹션별 세부 요약
1. MongoDB 트랜잭션의 기본 원리
- 복제 집합은 주/부 서버 간 데이터 동기화와 일관성을 보장
- 트랜잭션 실행 조건:
- 다중 문서/컬렉션 간 원자성 (atomicity
)
- 노드 간 쓰기 순서 동의 (write-order agreement
)
- 오류 시 롤백(rollback
) 가능
- 단일 서버는 트랜잭션을 보장할 수 없음
2. Docker 환경에서 복제 집합 구성
- keyfile 생성 및 보안 설정:
```bash
openssl rand -base64 756 > mongo-keyfile
chmod 400 mongo-keyfile
```
- Docker 컨테이너 실행 명령:
```bash
docker run -d --name mongo-rs --hostname mongo-rs -p 27017:27017 \
-v /full/path/mongo-keyfile:/etc/mongo/keyfile:ro \
-e MONGO_INITDB_ROOT_USERNAME=adminuser \
-e MONGO_INITDB_ROOT_PASSWORD=StrongP@ssw0rd! \
-e MONGO_INITDB_DATABASE=test \
mongo:latest \
--replSet rs0 --auth --keyFile /etc/mongo/keyfile --bind_ip_all
```
--replSet rs0
: 복제 집합 이름 지정--keyFile
: 내부 인증용 공유 비밀키 적용
3. 복제 집합 초기화 및 사용자 생성
- MongoDB shell을 통한 복제 집합 초기화:
```bash
docker exec -it mongo-rs mongosh -u adminuser -p StrongP@ssw0rd! --authenticationDatabase admin --eval 'rs.initiate({_id: "rs0", members: [{_id: 0, host: "127.0.0.1:27017"}]})'
```
- 앱용 사용자 생성:
```bash
use test
db.createUser({user: "appuser", pwd: "AppP@ssw0rd!", roles: [{role: "readWrite", db: "test"}]})
```
4. 애플리케이션 연결 설정
- 환경 변수 설정:
```env
MONGO_URI="mongodb://appuser:AppP%40ssw0rd!@localhost:27017/test?authSource=test&replicaSet=rs0"
```
- Mongoose 연결 코드:
```javascript
mongoose.connect(process.env.MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
serverSelectionTimeoutMS: 2000
})
```
replicaSet=rs0
: 복제 집합 프로토콜 활성화
결론
- MongoDB 트랜잭션을 Docker에서 사용하려면 복제 집합 구성과 인증 설정이 필수적
keyfile
기반 인증 및 별도 앱 사용자 생성을 통해 보안 강화MONGO_URI
에replicaSet=rs0
파라미터 추가로 트랜잭션 기능 활성화