MongoDB 丟數(shù)據(jù)的說(shuō)法已經(jīng)出現(xiàn)很久很久了,傳言甚多。這里簡(jiǎn)單總結(jié)下場(chǎng)景。 1.在MongoDB很早的版本,2.0之前,沒(méi)有journal,加上默認(rèn)不是安全寫,系統(tǒng)一宕機(jī)就可能出現(xiàn)數(shù)據(jù)丟失,因?yàn)閿?shù)據(jù)沒(méi)有刷盤,也沒(méi)有恢復(fù)日志恢復(fù)機(jī)制。這個(gè)問(wèn)題倒默認(rèn)啟用journal以及安
MongoDB 丟數(shù)據(jù)的說(shuō)法已經(jīng)出現(xiàn)很久很久了,傳言甚多。這里簡(jiǎn)單總結(jié)下場(chǎng)景。
1.在MongoDB很早的版本,2.0之前,沒(méi)有journal,加上默認(rèn)不是安全寫,系統(tǒng)一宕機(jī)就可能出現(xiàn)數(shù)據(jù)丟失,因?yàn)閿?shù)據(jù)沒(méi)有刷盤,也沒(méi)有恢復(fù)日志恢復(fù)機(jī)制。這個(gè)問(wèn)題倒默認(rèn)啟用journal以及安全寫之后,沒(méi)有問(wèn)題了。
2.選舉機(jī)制造成的數(shù)據(jù)丟失。這里主要說(shuō)這個(gè)。簡(jiǎn)單講,MongoDB目前的選舉機(jī)制是有缺陷的。在一些場(chǎng)景下會(huì)造成數(shù)據(jù)丟失。這些場(chǎng)景實(shí)際中會(huì)出現(xiàn),如多機(jī)房情況下,但一般不會(huì)太多。
場(chǎng)景1
replica set有如下節(jié)點(diǎn): n1, n2, n3, n4, n5
n1 主節(jié)點(diǎn)
n2,n3從n1同步
n4,n5從n3同步
假設(shè)發(fā)生如下事件:
現(xiàn)在有2個(gè)主節(jié)點(diǎn) n1 and n3.其中一個(gè)需要降級(jí),如果 n1降級(jí),不會(huì)產(chǎn)生什么后果, 但如果 n3 降級(jí), 多數(shù)成員確認(rèn)的寫操作就丟失了.
MongoDB 2.4中這是非常可能的. 雙主場(chǎng)景中,選擇哪一個(gè)主節(jié)點(diǎn)降級(jí)是隨意的. SERVER-9765 描述了這個(gè)問(wèn)題. 現(xiàn)在 2.6版本中,其中一個(gè)主節(jié)點(diǎn)根據(jù)上一次選舉的時(shí)間戳來(lái)決定哪一個(gè)降級(jí).上面例子中 n3被選舉為主的時(shí)間比 n1近, n3應(yīng)該保持作為主而n1應(yīng)該降級(jí). 因?yàn)槌蓡T可能每30秒?yún)⑴c一次選舉,因此成功的選舉之間最小間隔為30秒. 雖然如此,我仍然不知道不同成員之間的時(shí)鐘誤差在這個(gè)算法上如何影響。
場(chǎng)景2
這里問(wèn)題就是有兩個(gè)主,任意一個(gè)降級(jí),都要回滾相應(yīng)的寫操作。這個(gè)例子也可以看出MongoDB復(fù)制的一個(gè)潛在問(wèn)題,即簡(jiǎn)單的以來(lái)時(shí)間戳來(lái)決定oplog位置。
場(chǎng)景3
這個(gè)場(chǎng)景與2有點(diǎn)類似,但是考慮一下降級(jí)的時(shí)候考慮選舉的時(shí)間,即選最近選舉出來(lái)的為主,另一個(gè)主降級(jí)。
這里可以看出的問(wèn)題是,寫確認(rèn)操作和投票選舉操作之間并沒(méi)有足夠的交流,n4,n5投票給n3,確認(rèn)了一個(gè)可能回滾的寫操作,部分原因是因?yàn)閯倓偼瓿蛇x舉操作。這是MongoDB選舉協(xié)議沒(méi)有考慮的地方。
總的來(lái)說(shuō),現(xiàn)在MongoDB的選舉協(xié)議問(wèn)題如下:
雙主的情況下,必須解決一下問(wèn)題
數(shù)據(jù)同步線程和寫確認(rèn)操作線程必須與選舉主節(jié)點(diǎn)線程有更多交流,簡(jiǎn)言之,應(yīng)該如下:
tokumx將通過(guò)ark選舉協(xié)議來(lái)解決這個(gè)問(wèn)題。
參考:
http://www.tokutek.com/2014/07/explaining-ark-part-3-why-data-may-be-lost-on-a-failover/
原文地址:為什么MongoDB會(huì)丟數(shù)據(jù), 感謝原作者分享。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com