mongodb移動chunks指令碼

來源:互聯網
上載者:User

mongodb移動chunks指令碼
隨著資料量的增加,可能需要把增加分區(shard),增加分區後,需要將部分的資料移動到新的分區上。本來mongodb是支援自動平衡的(balancer,也就是會根據各個分區的資料情況,自動分區、移動資料到分區上),但由於自動平衡需要大量的系統資源,而且容易導致程式卡死,所以在實際的應用中,我們是將自動平衡關掉的。
我們曾經遇到的問題是。原來2個分區,由於資料量的增加,準備添加一個分區。原來2個分區上,每個分區上有幾百個chunks,單個網站(如:用tudou舉例),在一個分區上就有近200個chunks。
問題:自動平衡已被停掉
手動移動,資料太多,費時費力。
方法:採用單個網站,使用指令碼來移動。

var namespace = "tudou.video";
var cursor = db.chunks.find({ns:namespace});
var s1=0,s2=0,s3=0;
var allCnt = cursor.count();
var perCnt = parseInt(allCnt/3);
print("all-count:"+allCnt+" per-count:"+perCnt);
while (cursor.hasNext()) {
var chunk = cursor.next();
if(chunk.shard=="s1"){
s1++;
print("s1 "+chunk._id);
if(s1>perCnt && s3<perCnt){
print("s1 "+s1+" moveChunk "+chunk.min.md5id);
//printjson(chunk.min);
var ret = db.adminCommand({moveChunk :namespace, find : chunk.min, to : "s3"});
printjson(ret);
if(ret.ok==1){
s3++;
s1--;
}
}
}else if(chunk.shard=="s2"){
s2++;
print("s2 "+chunk._id);
if(s2>perCnt && s3<perCnt){
print("s2 "+s2+" moveChunk "+chunk.min.md5id);
var ret = db.adminCommand({moveChunk :namespace, find : chunk.min, to : "s3"});
printjson(ret);
if(ret.ok==1){
s3++;
s2--;
}
}
}else if(chunk.shard=="s3"){
print("s3 "+chunk._id);
s3++;
}
}

另外的問題:無論是手動還是指令碼(其實就是手動,稍簡化改移哪個而已)。都有可能程式卡死,可能是分區的某台機器,也可能導致路由mongos卡死。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.