# 옵션 설명 -u : 계정명 -p : 계정의 비밀번호 --authenticationDatabase=admin : 인증 --host : 원격 시 IP 주소 및 포트 --out : Dump 받을 폴더 경로 --db : Dump 받을 DB 선택 (미작성 시 DB 전체) --collection : Dump 받을 collection(table) 선택 (미작성 시 Collection 전체) --gzip : Dump 파일 확장자
# 옵션 설명 -u : 계정명 -p : 계정의 비밀번호 --authenticationDatabase=admin : 인증 --host : 원격 시 IP 주소 및 포트 --db : Restore 할 DB 선택 --collection : Restore 할 collection(table) 선택 --gzip : Restore 파일 확장자 --drop : 백업에 없는 collection 삭제
예약 작업 저장을 위한 스토리지로 Mongo DB를 선택했으며, Collection 구조는 아래와 같이 정의하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// collection
varreservedTask{
_id: xxx, //taskId
cmd: OOOO, // 실행할 작업
contents: {name:'aasfdsadf'} // 작업에 필요한 내용 Object Type
reserved: YYYY-MM-DDTHH:MM:SS, // 실행될 시간
registered: YYYY-MM-DDTHH:MM:SS, // 등록한 시간
status: REQUEST // 작업 실행 상태
}
// task 등록
db.reservedTasks.save({
cmd: 'sendMail',
registered: newDate(),
reserved: newDate('2015-11-13T09:00:00'),
contents: {
to: 'abc@def.com',
body: '.......'
},
status: 'REQUEST'
});
구현할 기능은 아래와 같다
예약 작업 등록
실행할 작업을 DB로 부터 읽어 옴.
실행할 작업이 있을 경우, 상태를 실행으로 변경하고 예약 작업을 실행
실행을 완료한 작업은 완료로 처리
여러 서버에서 스캐쥴러가 동작할 경우 2, 3, 4번의 과정에서 동일한 작업이 여러번 실행되는 문제가 발생할 수 있다. 만약 서버 A가 2, 3번 과정을 실행중일때, 서버 B가 2번 과정을 실행하게 되면, 동일한 작업이 두번 실행되게 된다. 이러한 문제는 MongoDB로 구현할때 findAndModify 연산을 이용하여 해결할 수 있다.
위의 쿼리를 수행하게 되면 읽기와 쓰기가 동시에 수행이 되어, 여러 서버에서 동시에 수행이 되더라도 동일한 작업이 여러번 실행되는 것을 막을 수 있다. 또한 이후 작업이 결과에 따라 status 값을 조정함으로써 완료/실패 처리가 가능하다.
문제점 findAndModify를 사용할 경우 예약된 작업을 하나씩 실행해야 한다. 만약 1000개의 예약된 작업이 있을 경우 1000번 위의 과정을 수행해야 한다. 이러한 제한은 findAndModify가 하나의 document에 대해서만 update가 가능하기 때문이다. 이를 위해서는 다른 해결책이 필요하다.
이중 확인을 사용한 방법(transId 추가)
실행할 작업을 DB로 부터 읽어 옴.
DB로 부터 읽어 온 작업을 업데이트(상태: 실행중, transId:’transactionNum’)