下載吧 - 綠色安全的游戲和軟件下載中心

軟件下載吧

當(dāng)前位置:軟件下載吧 > 數(shù)據(jù)庫(kù) > DB2 > 詳解OpLog訂閱MongoDB的數(shù)據(jù)變更

詳解OpLog訂閱MongoDB的數(shù)據(jù)變更

時(shí)間:2024-02-04 13:45作者:下載吧人氣:26

前言

我們開源了一個(gè)訂閱分發(fā)mysql的binlog的項(xiàng)目,一直用的非常好,忽然有天開發(fā)說(shuō)能不能支持MongoDB的數(shù)據(jù)訂閱呢,MongoDB的使用度也挺廣泛的。安排。經(jīng)過(guò)簡(jiǎn)單的了解后發(fā)現(xiàn)MongoDB也有類似binlog的機(jī)制,最終花了兩天時(shí)間把功能完成,并統(tǒng)一抽象集成到binlog開源項(xiàng)目中,使用和binlog同一套訂閱分發(fā)模型管理MongoDB數(shù)據(jù)源。整個(gè)過(guò)程非常順利,比整mysql的binlog要簡(jiǎn)單的多了。

oplog簡(jiǎn)介

先來(lái)聊聊MongoDB的主備機(jī)制,和mysql的binlog類似,在MongoDB中,有一個(gè)系統(tǒng)庫(kù)“”Local”,庫(kù)里有一個(gè)集合“oplog.rs”,這個(gè)集合類似于binlog文件,里面記錄了MongoDB的所有操作。從節(jié)點(diǎn)通過(guò)讀取oplog.rs里的數(shù)據(jù)做到數(shù)據(jù)同步。

解析oplog

和訂閱mysql的binlog一樣(模擬一個(gè)從節(jié)點(diǎn)mysql)。我們的訂閱服務(wù)要像從節(jié)點(diǎn)那樣讀取解析oplog.rs里的數(shù)據(jù)。解析前先看下oplog.rs的Document的數(shù)據(jù)結(jié)構(gòu)

詳解OpLog訂閱MongoDB的數(shù)據(jù)變更

上圖是一個(gè)插入的數(shù)據(jù)的日志,可見oplog的doc中共有如下字段,含義分別如下:

ts:操作的時(shí)間戳(非常重要)

t:term最初在主數(shù)據(jù)庫(kù)上生成操作的。(含義不明)

h:本次操作的唯一hashID

v: 版本號(hào)

op:操作類型,有六種類型,我們只需要關(guān)注其中的i(插入)、u(更新)、d(刪除)即可

ns:庫(kù)名和集合名稱,中間使用“.”連接

o:本次操作的document內(nèi)容

o2:只有op操作類型時(shí)u更新時(shí),才會(huì)有這個(gè)字段,代表更新的條件語(yǔ)句

$set:o2獲取后的文檔里的屬性,代表更新的字段

如上字段,完成一次oplog的解析,只需要ts、op、ns、o、o2、$set即可,其中ts非常重要,可以類比為binlog中的Position。同步mysql的數(shù)據(jù)時(shí),通過(guò)記錄消費(fèi)binlog的位置,也就是Position,可以有效避免訂閱服務(wù)停機(jī)后,消費(fèi)記錄丟失的問(wèn)題。同步MongoDB時(shí),通過(guò)記錄ts的值,來(lái)記錄消費(fèi)的位置,可以到達(dá)和訂閱binlog一樣的效果。和mysql訂閱不同的是,MongoDB的同步需要同步服務(wù)自己查詢,而且oplog在MongoDB4.0之前的版本有大小限制,超過(guò)設(shè)置的容量后,老的數(shù)據(jù)就會(huì)被丟失,在4.0之后的版本已經(jīng)解除了這個(gè)限制。

代碼

上面已經(jīng)分析了oplog的結(jié)構(gòu)以及訂閱步驟,下面我們直接構(gòu)建查詢即可,需要注意,每次獲取到的ts值,需要存儲(chǔ)記錄下來(lái),已便重新訂閱時(shí),從上次斷開的記錄重新開始。下面直接看代碼,重點(diǎn)邏輯都以注釋詳盡

private BsonTimestamp queryTs;
@Test
public void OpLogTest() {
MongoClient mongoClient = new MongoClient(new MongoClientURI(“mongodb://admin:admin@127.0.0.1:3717”));
MongoCollectioncollection = mongoClient.getDatabase(“local”)
.getCollection(“oplog.rs”);

//如果是首次訂閱,需要使用自然排序查詢,獲取第最后一次操作的操作時(shí)間戳。如果是續(xù)訂閱直接讀取記錄的值賦值給queryTs即可
FindIterabletsCursor = collection.find().sort(new BasicDBObject(“$natural”, -1))
.limit(1);
Document tsDoc = tsCursor.first();
queryTs = (BsonTimestamp) tsDoc.get(“ts”);
while (true) try {
//構(gòu)建查詢語(yǔ)句,查詢大于當(dāng)前查詢時(shí)間戳queryTs的記錄
BasicDBObject query = new BasicDBObject(“ts”, new BasicDBObject(“$gt”, queryTs));
MongoCursordocCursor = collection.find(query)
.cursorType(CursorType.TailableAwait) //沒有數(shù)據(jù)時(shí)阻塞休眠
.noCursorTimeout(true) //防止服務(wù)器在不活動(dòng)時(shí)間(10分鐘)后使空閑的游標(biāo)超時(shí)。
.oplogReplay(true) //結(jié)合query條件,獲取增量數(shù)據(jù),這個(gè)參數(shù)比較難懂,見:https://docs.mongodb.com/manual/reference/command/find/index.html
.maxAwaitTime(1, TimeUnit.SECONDS) //設(shè)置此操作在服務(wù)器上的最大等待執(zhí)行時(shí)間
.iterator();
while (docCursor.hasNext()) {
Document document = docCursor.next();
//更新查詢時(shí)間戳
queryTs = (BsonTimestamp) document.get(“ts”);
//TODO 在這里接收到數(shù)據(jù)后通過(guò)訂閱數(shù)據(jù)路由分發(fā)

String op = document.getString(“op”);
String database = document.getString(“ns”);
Document context = (Document) document.get(“o”);
Document where = null;
if (op.equals(“u”)) {
where = (Document) document.get(“o2”);
if (context != null) {
context = (Document) context.get(“$set”);
}
}
System.err.println(“操作時(shí)間戳:” + queryTs.getTime());
System.err.println(“操作類 型:” + op);
System.err.println(“數(shù)據(jù)庫(kù).集合:” + database);
System.err.println(“更新條件:” + JSON.toJSONString(where));
System.err.println(“文檔內(nèi)容:” + JSON.toJSONString(context));
}
} catch (Exception e) { e.printStackTrace(); }
}

標(biāo)簽MongoDB,技術(shù)文檔,數(shù)據(jù)庫(kù),MongoDB

相關(guān)下載

查看所有評(píng)論+

網(wǎng)友評(píng)論

網(wǎng)友
您的評(píng)論需要經(jīng)過(guò)審核才能顯示

熱門閱覽

最新排行

公眾號(hào)

主站蜘蛛池模板: 手机1024看片| 又湿又紧又大又爽a视频国产| 国产亚洲精品自在久久| 啊灬啊别停灬用力啊公阅读| 公和我在厨房好爽中文字幕| 亚洲精品一二区| 亚州无吗黄瓜视频有直播的不| 久久久久亚洲av片无码| 一级毛片免费不卡| 999无色码中文字幕| 欧美浮力第一页| 精品福利视频一区二区三区 | 被公连续侵犯中文字幕| 精品国产a∨无码一区二区三区| 热re久久精品国产99热| 欧洲亚洲综合一区二区三区| 日日噜噜夜夜狠狠va视频| 天天想你视频免费观看完整版高清中文| 国产精品无圣光一区二区| 国产伦精品一区二区三区视频金莲| 全彩acg无翼乌| 亚洲av日韩av无码污污网站| 中文字幕在线网| 182tv免费观看在线视频| 色欲AV无码一区二区三区| 波多野结衣免费观看视频| 日韩精品一区二区三区色欲av| 小雪把双腿打开给老杨看免费阅读 | 波多野结衣欲乱上班族| 日韩激情无码免费毛片| 天天做天天爱天天综合网2021| 国产成人欧美一区二区三区 | 波多野结衣与老人公569| 日本网址在线观看| 国自产拍亚洲免费视频| 国产V片在线播放免费无码| 亚洲国产综合精品中文第一区| 一级一级女人18毛片| 黄色免费在线网址| 欧美日韩综合网在线观看| 影院成人区精品一区二区婷婷丽春院影视 |