2011-08-11 2 views
14

나는 중요한 데이터가있는 프로젝트를 만들고있다. 이것은 빛이나 서버가 다운되면 우리가 잃을 수 없다는 것을 의미합니다. 우리는 데이터베이스를 위해 MongoDB를 사용하고 있습니다. 한 요소가 삽입되지 않은 경우 전체 데이터를 삽입하고 롤백 한 후 내 데이터가 데이터베이스에 있는지 확인하고 싶습니다. Mongo 뒤에있는 철학으로 우리는 거래가 필요하지 않지만 어떻게하면 데이터가 실제로 "블랙홀"에 보내지는 것보다 실제로 안전하게 저장되었는지 확인할 수 있습니다.삽입물에 MongoDB의 안전 모드가 얼마나 안전합니까?

  • 검색해야할까요?

  • 특정 mongoDB 명령을 사용해야합니까?

  • 나는 하나 개의 서버가
    만족 속도과 빛
    가 다운되면 그것은 아무것도 보장하지 않는 방법으로 충분한 경우에도 샤딩을 사용해야합니까?

최상의 해결책은 무엇입니까?

답변

14

가장 좋은 방법은 MongoDB에 데이터의 중요성을 알릴 수있는 쓰기 문제입니다. 가장 빠른 Write Concern은 가장 안전하지 않습니다. 데이터는 다음 예약 플러시까지 디스크로 플러시되지 않습니다. 가장 안전한 방법은 데이터를 반환하기 전에 여러 대의 컴퓨터에서 디스크에 데이터가 기록되었는지 확인하는 것입니다.

FSYNC_SAFE (최소한 Java driver의 관점에서 볼 때 FSYNC_SAFE 임) 또는 데이터가 복제되었음을 확인하는 REPLICAS_SAFE입니다.

MongoDB에는 전통적인 의미의 트랜잭션이 없습니다. Mongo 데이터베이스에이를 수행하도록 알릴 수 없으므로 롤백을 수동으로 수행해야합니다.

다른 작업은 비교적 새로운 --journal 옵션 (Write Ahead Log 사용)을 사용하거나 복제본 세트를 사용하여 많은 컴퓨터에서 데이터를 공유함으로써 한 컴퓨터에서 데이터 무결성을 최대화 할 수 있습니다. 충돌/전력 손실.

샤딩은 특별히 큰 데이터 세트를 처리 할 때로드를 공유하는 방법으로 하드웨어 오류를 방지하지 않습니다. 샤딩을 여러 디스크에 데이터를 쓰는 방법 인 복제 세트와 혼동해서는 안됩니다. 하나 이상의 기계.

따라서 데이터가 충분히 가치있는 경우 필요로하는 복원력을 제공하려면 확실히 복제본 세트를 사용해야하며, 다른 데이터 센터/가용성 영역/랙/등의 슬레이브를 배치해야합니다.

replica 집합의 개별 노드 우선 순위를 지정하는 방법이 있습니다 (아직 구현되지 않았는지 여부를 기억할 수 없음). 마스터가 다운되면 선출 된 새 마스터가 하나임 (즉 다른 국가의 슬레이브가 실제로 유일한 옵션이 아닌 이상 마스터가되지 못하도록 막는) 같은 데이터 센터에서 사용할 수 있습니다.

+0

정말 감사하고 방대한 답변을드립니다. 나는 언젠가는 다른 답장을 기다릴 것이고 만약 내가 새로운 것을 찾지 못한다면 고마워 할 것이다. –

+0

tl; dr : 너는 어떤 방법 으로든 망했다! – Mrchief

5

Google 그룹에 GVP이라는 사람으로부터 정말 좋은 답변을 받았습니다.나는 그것을 인용합니다 (기본적으로 리치의 대답까지 추가) :

하나 개의 요소가 삽입되지 않은 경우 내 데이터가 삽입 한 후 데이터베이스에 있는지 확인하고 전체 일괄 처리를 롤백하고 싶습니다

.

이것은 복잡한 주제이며 여기에 고려해야 할 몇 가지 트레이드 오프가 있습니다. .

샤딩을 사용해야합니까?

샤딩은 스케일링 쓰기를위한 것입니다. 데이터 안전을 위해 복제 세트를보고 싶습니다.

일부 mongoDB 명령을 사용해야합니까?

가장 먼저 고려해야 할 사항은 안드레아스가 지정한 으로 'getLastError()'또는 'getLastError()'입니다. "안전한"쓰기를 실행하면 데이터베이스가 삽입을 수신하고 쓰기를 적용한다는 것을 알고 있습니다. 그러나 MongoDB는 60 초마다 디스크로만 플러시되므로 서버는 디스크의 데이터없이 을 실패 할 수 있습니다.

두 번째 고려해야 할 사항은 "저널링" (v1.8 이상)입니다. 저널링을 켜면 데이터가 저널 에 100ms마다 플러시됩니다. 그래서 당신은 실패하기 전에 작은 창문을 가지고 있습니다. 드라이버는 "안전"보다 한 단계 높은 "fsync"옵션 (이름 확인)을 가지고 있으며, 데이터에 이 저널 파일 (즉, 저널 파일)로 플러시되었음을 알리기를 기다립니다. 그러나이 경우에만 만 하나의 서버를 포함합니다. 서버상의 하드 드라이브가 단지 이 죽으면 어떻게됩니까? 두 번째 사본이 필요합니다.

고려해야 할 세 번째 사항은 복제입니다. 드라이버는 반환하기 전에 " 이 데이터를 N 노드에 복제"하는 "W"매개 변수를 지원합니다. 쓰기가 특정 시간 초과 전에 "N"노드에 도달하지 않으면 쓰기가 실패합니다 (예외 이 발생 함). 그러나 복제 세트의 노드 수인 을 기반으로 "W"를 올바르게 구성해야합니다. 다시 말하지만, 하드 드라이브 이 실패 할 수 있기 때문에 저널링을 사용하더라도 복제를보고 싶을 것입니다. 데이터 센터간에 복제가 너무 커서 여기에 을 가져올 수 없습니다. 마지막으로 고려해야 할 것은 " 을 굴림"해야한다는 것입니다. 내 이해에서, MongoDB는 "롤백" 용량을 갖고 있지 않습니다. 일괄 삽입을 수행하는 경우 어떤 요소가 실패했는지 나타내는 표시가 나타납니다.

여기에 PHP 드라이버에 대한 링크가 있습니다 : http://it.php.net/manual/en/mongocollection.batchinsert.php 복제 및 W 매개 변수에 대한 세부 사항을 확인해야합니다. 나는 같은 제한이 여기에 적용된다고 생각한다.