億級mongodb數據遷移

1. 預先準備有效數據單號池,經過單號拉取數據處理mongodb

單號表默認爲1數據庫

01 使用findAndModify 更新單號表狀態爲 2 讀取單號 循環讀取100 條多線程

02 經過運單號批量查詢 Aladin_WayBillStatus 表 獲取數據優化

03 拼接 新增 SQL語句spa

04 批量提交給 Hbase線程

05 批量更新 單號表 狀態 爲 3code

方式優勢中間件

簡單粗暴,開發簡單 不超過200行代碼,應爲findAndModify 的原子性能夠部署N個節點。blog

方式缺點開發

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

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

  對現有數據庫照成壓力

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 

相關文章
相關標籤/搜索