最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

剖析后OpLog訂閱MongoDB的數(shù)據(jù)變更就沒那么難了

 更新時間:2022年02月24日 11:15:27   作者:kl  
這篇文章主要為介紹了OpLog訂閱MongoDB的數(shù)據(jù)變更,希望讀完本文后讓你對OpLog訂閱MongoDB的數(shù)據(jù)變更不在頭疼,有需要的朋友可以借鑒參考下,希望能夠有所幫助

前言

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

oplog簡介

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

解析oplog

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

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

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

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

h:本次操作的唯一hashID

v: 版本號

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

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

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

o2:只有op操作類型時u更新時,才會有這個字段,代表更新的條件語句

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

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

代碼

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

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");

        //如果是首次訂閱,需要使用自然排序查詢,獲取第最后一次操作的操作時間戳。如果是續(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)建查詢語句,查詢大于當(dāng)前查詢時間戳queryTs的記錄
            BasicDBObject query = new BasicDBObject("ts", new BasicDBObject("$gt", queryTs));
            MongoCursordocCursor = collection.find(query)
                    .cursorType(CursorType.TailableAwait) //沒有數(shù)據(jù)時阻塞休眠
                    .noCursorTimeout(true) //防止服務(wù)器在不活動時間(10分鐘)后使空閑的游標(biāo)超時。
                    .oplogReplay(true) //結(jié)合query條件,獲取增量數(shù)據(jù),這個參數(shù)比較難懂,見:https://docs.mongodb.com/manual/reference/command/find/index.html
                    .maxAwaitTime(1, TimeUnit.SECONDS) //設(shè)置此操作在服務(wù)器上的最大等待執(zhí)行時間
                    .iterator();
            while (docCursor.hasNext()) {
                Document document = docCursor.next();
                //更新查詢時間戳
                queryTs = (BsonTimestamp) document.get("ts");
                //TODO 在這里接收到數(shù)據(jù)后通過訂閱數(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("操作時間戳:" + queryTs.getTime());
                System.err.println("操作類  型:" + op);
                System.err.println("數(shù)據(jù)庫.集合:" + database);
                System.err.println("更新條件:" + JSON.toJSONString(where));
                System.err.println("文檔內(nèi)容:" + JSON.toJSONString(context));
            }
        } catch (Exception e) { e.printStackTrace(); }
    }

結(jié)語

上面代碼只是一個簡單的測試用例,完整的應(yīng)用還需要考慮ts的記錄更新,事件的抽象,數(shù)據(jù)的分發(fā)等。我們已經(jīng)開源的binlog訂閱分發(fā)項目目前支持?jǐn)?shù)據(jù)源在線管理,訂閱數(shù)據(jù)(庫、表)在線管理,如果能夠使用同一套管理后臺管理binlog和oplog的訂閱在好不過。要實現(xiàn)和binlog統(tǒng)一管理模型,配置和分發(fā)方面基本不需要改動,然后從頂層數(shù)據(jù)源方面做區(qū)分實現(xiàn)即可。

目前我們整合管理的功能都已經(jīng)開發(fā)好了,關(guān)于oplog部分的代碼還沒提交到github上,后面會和大家相見。

以上就是剖析后OpLog訂閱MongoDB的數(shù)據(jù)變更就沒那么難了的詳細(xì)內(nèi)容,更多關(guān)于OpLog訂閱MongoDB的數(shù)據(jù)變更的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MongoDB的主從復(fù)制及副本集的replSet配置教程

    MongoDB的主從復(fù)制及副本集的replSet配置教程

    MongoDB可以在以一個主節(jié)點處理客戶端請求的情況下以其他節(jié)點服務(wù)器負(fù)責(zé)映射主節(jié)點上的數(shù)據(jù),即為我們通常所說的主從復(fù)制功能,這里我們就來共同總結(jié)MongoDB的主從復(fù)制及副本集的replSet配置教程:
    2016-07-07
  • mongodb字段值自增長實現(xiàn)代碼

    mongodb字段值自增長實現(xiàn)代碼

    這篇文章主要介紹了mongodb字段值自增長實現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • mongodb 中rs.stauts()命令參數(shù)解析

    mongodb 中rs.stauts()命令參數(shù)解析

    MongoDB的rs.status()命令是查看副本集狀態(tài)的重要工具,它可以展示副本集中各個成員的角色、健康狀態(tài)、同步進(jìn)度等關(guān)鍵信息,本文介紹mongodb 中rs.stauts()命令參數(shù)解析,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • MongoDB創(chuàng)建和查詢視圖的方式

    MongoDB創(chuàng)建和查詢視圖的方式

    本文整理mongodb的官方文檔,介紹mongodb的視圖創(chuàng)建和查詢,在Mongodb中,允許使用兩種方式來創(chuàng)建視圖,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2023-12-12
  • MongoDB的基礎(chǔ)知識簡介

    MongoDB的基礎(chǔ)知識簡介

    這篇文章主要介紹了MongoDB的基礎(chǔ)知識簡介,需要的朋友可以參考下
    2017-05-05
  • MongoDB入門教程之細(xì)說MongoDB數(shù)據(jù)庫的增刪查改操作

    MongoDB入門教程之細(xì)說MongoDB數(shù)據(jù)庫的增刪查改操作

    這篇文章主要介紹了MongoDB入門教程之細(xì)說MongoDB數(shù)據(jù)庫的增刪查改操作,本文環(huán)境是windows,所以以圖片形式講解,需要的朋友可以參考下
    2014-08-08
  • CentOS8?安裝MongoDB?本地連接的操作方法

    CentOS8?安裝MongoDB?本地連接的操作方法

    MongoDB 是一個由 C++ 語言編寫的基于分布式文件存儲的數(shù)據(jù)庫,MongoDB 是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的,這篇文章主要介紹了CentOS8?安裝MongoDB?本地連接,需要的朋友可以參考下
    2022-11-11
  • ubuntu安裝mongodb創(chuàng)建賬號和庫及添加坐標(biāo)索引的流程分析

    ubuntu安裝mongodb創(chuàng)建賬號和庫及添加坐標(biāo)索引的流程分析

    這篇文章主要介紹了ubuntu安裝mongodb創(chuàng)建賬號和庫及添加坐標(biāo)索引的流程分析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 在Mac OS上安裝使用MongoDB的教程

    在Mac OS上安裝使用MongoDB的教程

    這篇文章主要介紹了在Mac OS上安裝使用MongoDB的教程,包括MongoDB基本的命令與數(shù)據(jù)類型的講解,如果在開發(fā)環(huán)境中調(diào)試的話相當(dāng)推薦閱讀本文,需要的朋友可以參考下
    2016-02-02
  • 詳解mongodb 主從配置

    詳解mongodb 主從配置

    我研究過的nosql,memcache,redis,mongodb都是支持分布式的,生產(chǎn)環(huán)境中用過memcache,redis,性能穩(wěn)定。mongodb是最接近關(guān)系型數(shù)據(jù)庫的,不用花很多時間去構(gòu)建數(shù)據(jù)庫模型,將來我會用mongodb,看一下主從配置
    2014-07-07

最新評論

永康市| 呈贡县| 庐江县| 莫力| 临邑县| 兴安县| 阆中市| 定安县| 腾冲县| 轮台县| 武定县| 安丘市| 黑龙江省| 江阴市| 观塘区| 合阳县| 渑池县| 女性| 琼海市| 肇源县| 格尔木市| 宁南县| 克东县| 华亭县| 潢川县| 永宁县| 庄河市| 揭阳市| 论坛| 启东市| 翁源县| 伊宁县| 东乌珠穆沁旗| 宁远县| 韩城市| 思茅市| 武强县| 六安市| 清新县| 南雄市| 灵山县|