億級mongodb數據遷移


1. 預先准備有效數據單號池,通過單號拉取數據處理

單號表默認為1

01 使用findAndModify 更新單號表狀態為 2 讀取單號 循環讀取100 條

02 通過運單號批量查詢 Aladin_WayBillStatus 表 獲取數據

03 拼接 新增 SQL語句

04 批量提交給 Hbase

05 批量更新 單號表 狀態 為 3

方式優點

簡單粗暴,開發簡單 不超過200行代碼,應為findAndModify 的原子性可以部署N個節點。

方式缺點

  執行效率不高,並且提升優化空間幾乎沒有,使用多線程獲取單號反而會更加耗時。

  執行效率得看獲取數據的表的承受能力。

  對現有數據庫照成壓力

2.預支時間段表,通過時間段刷數據。

01 使用findAndModify  隨機獲取一個時段

02 通過時間段拉取一批數據

03 拼接 新增 SQL語句

04 批量提交給 Hbase

05 批量更新 時間段表 狀態 為 3

方式優點

效率會比方式01 提高不少。

由於findAndModify   可以多節點部署。

方式缺點

  每次時間段獲取的數據量都是不可控的,業務高峰期時間段數據量可能非常大,業務低峰期數據量非常小,時間段生成規則會非常麻煩

       對現有數據庫照成壓力

3.通過mongodb查詢游標掃描數據。

find查詢默認是從最舊數據開始。

_id 可以使用 $gt 查詢 _id是有序的。

    public void test_2(ObjectId o) {
        DBCursor s;
        if (o == null) {
            s = mt.getCollection("orderid").find();
        } else {
            DBObject lisi = new BasicDBObject();
            lisi.put("_id", new BasicDBObject("$gt", o));
            s = mt.getCollection("orderid").find(lisi);
        }
        try {
            while (s.hasNext()) {
                DBObject item = s.next();
                o = (ObjectId) item.get("_id");
                String me = ((BasicDBObject) item).toJson();
                mq.send(new Message("mgtomq", me.getBytes(RemotingHelper.DEFAULT_CHARSET)));
                System.out.println(o);
            }
        } catch (Exception e) {
            test_2(o);
        }
    }

    方式優點:

      不會對數據庫照成太大壓力。

      讀取的數據也是從老到新的數據。

    方式缺點:

      無法部署多個節點,獲取數據和處理數據一起處理效率不高。

      解決方式: 通過消息中間件解耦,讀取數據,生產消息,處理數據設置每次100條消費消息。

    這種讀取數據方式也是 datex 使用的,處理方式不通,但是想法差不多。

 

如果不需要對數據進行處理,可以直接使用 datex 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM