mongodb快速均衡匯入資料

來源:互聯網
上載者:User

標籤:

需求環境:

有一個項目需要將mongodb sharding從2.6升級到3.0 並使用wt引擎,其中2.6環境很多collectiong開啟了Sharding,且資料量很大.

選擇mongodump,mongorestore方式

 

問題:

      在restore步驟出現了2個問題

  1)大數量資料匯入緩慢時間花費長

  2)chunks分配不均勻,需要很長時間做balance.

分析原因:

  針對以上問題我對mongodb的進行了初步的學習和研究,同時也查看了一些優秀的部落格,發現部分原因:

  mongodb匯入大量資料,會涉及到chunks的分裂和新chunk檔案分配這個過程耗費時間,並且自動均衡策略不能均勻分配chunks到每個shard這在資料匯入時也會引起不同的shard io使用差距大,無法合理使用整個叢集的io。

解決辦法:

  可以提前預先分配chunks並且均勻的移動到每個shard,針對這個情境我寫了一個簡單的python指令碼實現

#! /usr/bin/python#input basic infons = "crawler.logsData"shard_key = "_id"shards= ["shard01","shard02","shard03","shard04"]min_key = 237223617max_key = 264171274avg_doc_size = 2340    #bytechunk_size = 64*1024*1024   #byte 64MBfragment = 0.9def split_chunk(ns,shard_key,shards,min_key,max_key,avg_doc_size,chunk_size,fragment ):    fname=‘./‘+ns+‘.js‘    f=open(fname,‘a‘)    f.write("db = db.getSiblingDB(‘admin‘)"+‘\n‘)    docs_per_chunk = int(chunk_size*fragment/avg_doc_size)    key_value=min_key+docs_per_chunk    shard_counter = 0    shardlen = len(shards)    while  key_value  < max_key:        str_split_chunk=(‘db.runCommand( { split : "%s", middle : {%s:%d} } )‘)% (ns,shard_key,key_value)        str_move_chunk=(‘db.runCommand({moveChunk: "%s", find: {%s:%d}, to: "%s"})‘)%(ns,shard_key,key_value,shards[shard_counter])        shard_counter = shard_counter + 1        if shard_counter == shardlen:            shard_counter = 0        key_value=key_value+docs_per_chunk        f.write(str_split_chunk+‘\n‘)        f.write(str_move_chunk+‘\n‘)    #    print(str_split_chunk)    #    print(str_move_chunk)    f.closedsplit_chunk(ns,shard_key,shards,min_key,max_key,avg_doc_size,chunk_size,fragment)

step1

編輯以上指令碼填寫參數運行   會產生一個分配和move chunks的js檔案檔案名稱是crawler.logsData.js

step2

使用以下命令運行可以實現chunks的均勻預分配

time mongo admin -u username -p‘passwd‘ < /home/user/crawler.logsData.js  

step3

運行以下命令實現collection  crawler.logsData的資料匯入

time mongorestore --host *** --port **  --db crawler --collection  logsData  -u username -p "passwd"  /home/user/crawler/logsData.bson

注意:

  step1&2可以預先處理不必等到遷移時,這樣分配chunks和 chunks balance的時間就可以在實際遷移時節約出來了,這樣做還可減少匯入資料發生chunk split.

以下是我的測試結果 mongorestore 時間花費   26GB資料 14分鐘

 

 

發散:

  針對以上測試,我們進一步思考,是否可以把這個方式使用到維護方面,如果我們預Crowdsourced Security Testing道collection的每月的資料增長量,那麼就可以提前為下一個月的資料做chunks的預分配,

這樣就不必使用mongodb balance因為在寫入資料時就已經按照我們的規劃均勻寫入資料,這樣可以均衡sharding的io使用率,提高整個sharding寫入效率.

 

mongodb快速均衡匯入資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.