为什么MongoDB会丢数据
MongoDB 丢数据的说法已经出现很久很久了,传言甚多。这里简单总结下场景。 1.在MongoDB很早的版本,2.0之前,没有journal,加上默认不是安全写,系统一宕机就可能出现数据丢失,因为数据没有刷盘,也没有恢复日志恢复机制。这个问题倒默认启用journal以及安
MongoDB 丢数据的说法已经出现很久很久了,传言甚多。这里简单总结下场景。
1.在MongoDB很早的版本,2.0之前,没有journal,加上默认不是安全写,系统一宕机就可能出现数据丢失,因为数据没有刷盘,也没有恢复日志恢复机制。这个问题倒默认启用journal以及安全写之后,没有问题了。
2.选举机制造成的数据丢失。这里主要说这个。简单讲,MongoDB目前的选举机制是有缺陷的。在一些场景下会造成数据丢失。这些场景实际中会出现,如多机房情况下,但一般不会太多。
场景1
replica set有如下节点: n1, n2, n3, n4, n5
n1 主节点
n2,n3从n1同步
n4,n5从n3同步
假设发生如下事件:
- (n1, n2)与(n3, n4, n5)之间发生网络分裂(network partition)
- n3连不到n1,然后选举它自己
- n4 n5 投票给 n3, 因此n3 变成主节点
- n3执行写操作A,然后复制到n4,n5并确认,这样被复制集大部分成员确认了。
- n1 重新连接到复制集, 但仍然是主节点. 它必须降级.
现在有2个主节点 n1 and n3.其中一个需要降级,如果 n1降级,不会产生什么后果, 但如果 n3 降级, 多数成员确认的写操作就丢失了.
MongoDB 2.4中这是非常可能的. 双主场景中,选择哪一个主节点降级是随意的. SERVER-9765 描述了这个问题. 现在 2.6版本中,其中一个主节点根据上一次选举的时间戳来决定哪一个降级.上面例子中 n3被选举为主的时间比 n1近, n3应该保持作为主而n1应该降级. 因为成员可能每30秒参与一次选举,因此成功的选举之间最小间隔为30秒. 虽然如此,我仍然不知道不同成员之间的时钟误差在这个算法上如何影响。
场景2
- (n1, n2)与(n3, n4, n5)之间发生网络分裂(network partition)
- n3连不到n1,然后选举它自己
- n4 n5 投票给 n3, 因此n3 变成主节点
- n3执行写操作A,然后复制到n4,n5并确认,这样被复制集大部分成员确认了。
- n1 重新连接到复制集, 但仍然是主节点. 它必须降级.
- n1接受写操作B,然后复制并被n2确认;
- n4停止从n3复制并开始从n1复制;
- 因为n1没有写操作A,n4回滚写操作A,然后复制并确认写操作B.
这里问题就是有两个主,任意一个降级,都要回滚相应的写操作。这个例子也可以看出MongoDB复制的一个潜在问题,即简单的以来时间戳来决定oplog位置。
场景3
这个场景与2有点类似,但是考虑一下降级的时候考虑选举的时间,即选最近选举出来的为主,另一个主降级。
- 所有从节点从n1复制.
- 发生网裂,(n1, n2) 与 (n3, n4, n5)断开
- n3连不到n1,然后选举它自己
- n4 n5 投票给 n3, 但n3还没变为主节点
- n4和n5投票后,网络恢复
- n1发生写操作A,并被n2,n4,n5确认,n3还没变成主或者还没复制并确认这个写操作。
- n3最终成为主了,还没机会复制并确认A操作
- n1注意到n3是主并且选举的时间更近,因此n1降级
- 所有成员开始从n3复制,因此回滚A操作。
这里可以看出的问题是,写确认操作和投票选举操作之间并没有足够的交流,n4,n5投票给n3,确认了一个可能回滚的写操作,部分原因是因为刚刚完成选举操作。这是MongoDB选举协议没有考虑的地方。
总的来说,现在MongoDB的选举协议问题如下:
双主的情况下,必须解决一下问题
- 两个主节点必须不能产生交错的oplog
- 当双主情况下,oplog位置小的降级
数据同步线程和写确认操作线程必须与选举主节点线程有更多交流,简言之,应该如下:
- 成员不能投票会回滚写操作的节点为主节点;
- 成员不能确认因为选举投了赞成票可能造成回滚的写操作。
tokumx将通过ark选举协议来解决这个问题。
参考:
http://www.tokutek.com/2014/07/explaining-ark-part-3-why-data-may-be-lost-on-a-failover/
原文地址:为什么MongoDB会丢数据, 感谢原作者分享。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

MySQL에서는 altertabletable_nameaddcolumnnew_columnvarchar (255) 이후에 필드를 추가하여 altertabletable_namedropcolumncolumn_to_drop을 사용하여 필드를 삭제합니다. 필드를 추가 할 때는 쿼리 성능 및 데이터 구조를 최적화하기위한 위치를 지정해야합니다. 필드를 삭제하기 전에 작업이 돌이킬 수 없는지 확인해야합니다. 온라인 DDL, 백업 데이터, 테스트 환경 및 저하 기간을 사용하여 테이블 구조 수정은 성능 최적화 및 모범 사례입니다.

Laravel과 YII의 주요 차이점은 설계 개념, 기능적 특성 및 사용 시나리오입니다. 1. Laravel은 개발의 단순성과 즐거움에 중점을두고 Eloquentorm 및 Artisan 도구와 같은 풍부한 기능을 제공하며 빠른 개발 및 초보자에게 적합합니다. 2.YII는 성능과 효율성을 강조하고, 고 부하 애플리케이션에 적합하며, 효율적인 Activerecord 및 캐시 시스템을 제공하지만 가파른 학습 곡선이 있습니다.

C는 고성능 및 저수준 제어 기능으로 인해 센서 데이터를 처리하는 데 적합합니다. 특정 단계에는 다음이 포함됩니다. 1. 데이터 수집 : 하드웨어 인터페이스를 통해 데이터를 얻습니다. 2. 데이터 분석 : 원래 데이터를 사용 가능한 정보로 변환합니다. 3. 데이터 처리 : 필터링 및 평활 처리 처리. 4. 데이터 저장 : 데이터를 파일 또는 데이터베이스에 저장합니다. 5. 실시간 처리 : 코드의 효율적이고 낮은 대기 시간을 보장합니다.

Uniswap 사용자는 유동성 풀에서 지갑으로 토큰을 인출하여 자산 보안 및 유동성을 보장 할 수 있습니다. 이 프로세스에는 가스 수수료가 필요하며 네트워크 혼잡의 영향을받습니다.

마우스 스크롤링 이벤트의 구현 원리 탐색 일부 웹 사이트를 탐색 할 때 일부 페이지 요소는 마우스가 호버링 될 때 여전히 전체 페이지를 스크롤 할 수 있음을 알 수 있습니다.

준수하고 안전한 비트 코인 트레이딩 플랫폼을 선택할 때는 규제 라이센스, KYC/AML 정책 및 보안 조치를 평가하고 Binance, OKX 및 Gate.io의 세 가지 주요 플랫폼을 추천해야합니다.

cryptocurrency 거래 분야에서 거래소의 보안은 항상 사용자의 초점이었습니다. 2025 년, 수년간의 개발 및 진화 후 일부 교환은 뛰어난 보안 조치 및 사용자 경험으로 두드러집니다. 이 기사는 2025 년에 가장 안전한 5 개의 교환을 소개하고 Black U (해커 공격 사용자)를 피하기 위해 자금이 100% 보안을 피하는 방법에 대한 실질적인 안내서를 제공 할 것입니다.

MongoDB는 많은 양의 구조화되지 않은 데이터를 처리하는 데 적합한 NOSQL 데이터베이스입니다. 1) 문서와 컬렉션을 사용하여 데이터를 저장합니다. 문서는 JSON 객체와 유사하며 컬렉션은 SQL 테이블과 유사합니다. 2) MongoDB는 B-Tree Indexing 및 Sharding을 통해 효율적인 데이터 운영을 실현합니다. 3) 기본 작업에는 문서 연결, 삽입 및 쿼리가 포함됩니다. 집계 파이프 라인과 같은 고급 작업은 복잡한 데이터 처리를 수행 할 수 있습니다. 4) 일반적인 오류에는 객체의 부적절한 취급과 색인 사용이 부적절합니다. 5) 성능 최적화에는 인덱스 최적화, 샤드, 읽기 쓰기 분리 및 데이터 모델링이 포함됩니다.
