2012-07-17 2 views
6

얼마 전 MongoDB를 사용 해본 결과 fsync은 데이터가 디스크로 플러시 될 때까지 기다리는 것을 보았습니다. 좋아, 그래서 나는 그것이 데이터의 안전을위한 해결책이라고 생각했다.MongoDB의 fsync는 무엇입니까?

SQL 대안보다 오랜 시간이 걸리는 것이 효과적입니다. 그런 다음 syncdelay0에 넣을 수 있다는 것을 알았지 만 속도는 다시 돌아 왔지만 많은 동시 요청이있을 때 앞으로 어떻게 될지 생각했습니다. 따라서 fsync 옵션을 업데이트에서 제거하고 syncdelay 구성 옵션을 제거했습니다.

데이터를 쓰고 있는지 테스트하려면 업데이트를 한 후 Rockmongo를 빠르게 확인했는데 데이터가 실제로 거기에있었습니다.

실제로 쓰기가 느리고 쓰기가 없으면 어쨌든 fsync은 무엇입니까?

답변

5

당 몽고 설명서 :

fsync의 주요 용도는 플러시 및 백업을위한 데이터베이스를 잠그는 것입니다.

도에 대한

fsync를 조작 블록을 다른 모든 쓰기 작업이 실행되는 동안.

블로킹이 이유 인 것처럼 보입니다.

4

fsync은 기술적으로 모든 데이터를 디스크로 강제 플러시하는 관리 명령입니다. 일반적으로 최소한 코드에서는 사용하지 않아야합니다. 백업 등을 위해 데이터베이스를 잠그는 데 사용됩니다.

MongoDB의 데이터 안전성은 복제/샤딩/저널링에서 발생하며 강제 작성에서는 발생하지 않습니다. 그런 종류의 일은 그 일의 목적에 어긋납니다.

Java 드라이버는 WriteConcern 클래스에서이 '쓰기 및 동기화'개념을 래핑합니다. 데이터의 어느 부분이 더 중요하거나 덜 중요한지 결정할 필요는 없으며 도구를 신뢰하여 작업을 수행해야합니다.

또한 syncdelay을 0으로 설정하면 저널링을 해제해야합니다. this을 참조하십시오.

+0

가장 큰 걱정은 Mongo가 syncdelay 후에 메모리에 데이터를 저장 한 다음 사용자가 성공적으로 msg를 수신했지만 하드웨어가 동기화되기 전에 실패하면 기본적으로 큰 실패입니다. 맞습니까? 아니면 이것에 대한 해결책이 있습니까? – Hadrian

+0

다시 복제하십시오.MongoDB는 RDBMS가 아닌 분산 데이터 저장소입니다. MongoDB의 단일 인스턴스는 본질적으로 _useless_입니다. 왜냐하면 당신은 그 자체로 내구성을 의지 할 수 없기 때문입니다. 일단 두 개의 인스턴스가 있으면 하드웨어에 대해 걱정할 필요가 없습니다. – kprobst

+0

저널링을 사용하는 단일 인스턴스는 특히 저널링 쓰기 문제로 내구성을 유지하는 데 적합합니다. – MrKurt

0

다른 답변에서 설명한대로 fsync 명령은 플러시를 강제 실행하며 특정 시점 스냅 샷의 데이터 파일을 잠그기 전에 일반적으로 사용됩니다.

getLastError에있는 "fsync"write concern option은 보류중인 모든 데이터가 디스크로 플러시 된 것을 기다릴 것입니다. 일반적으로 이것을 사용하지는 않을 것이고 "j"옵션 (저널링이 발생하자마자 반환됩니다)은 반환하는 것이 훨씬 빠르며 내구성있는 쓰기를 보장합니다. getLastError 명령을 자동으로 실행하게하려면 원하는 드라이버에서 안전한 옵션으로 update/insert 명령을 전달할 수 있습니다.