Mongodb sharding模式篇

來源:互聯網
上載者:User

標籤:mongodb sharding

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/75/7C/wKiom1Y6B0_Dw6WaAAFNY7nY7CI980.jpg" style="float:none;" title="1.png.jpg" alt="wKiom1Y6B0_Dw6WaAAFNY7nY7CI980.jpg" />

8台機器,4個分區及其各自之間的角色指派:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/75/7A/wKioL1Y6B47QK48aAAJNby2Synk073.jpg" style="float:none;" title="2.png" alt="wKioL1Y6B47QK48aAAJNby2Synk073.jpg" />

注意:上表中顏色相同的代表在同一台伺服器上,其實也可以每個成員單放一台機器,但是比如像arbiter(仲裁節點),configserver(設定管理員),mongos(路由)本身消耗資源不是很大,可以複用,但是一台伺服器最好只運行一個mongod。所以我們採用的一台伺服器只運行了一個mongod和1至2個其他群組成員,注意,一台伺服器上不要運行同一組的多個成員,這樣就起不到冗餘的作用了。


//shard1

10.10.6.48 10.10.6.46

sudo mkdir -p /var/soft/data/shard1

sudo mkdir -p /var/soft/log

 

sudo /var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard1 --bind_ip0.0.0.0 --port 27040 --dbpath /var/soft/data/shard1/ -logpath/var/soft/log/shard1.log --logappend --nojournal --oplogSize=4096 --fork--noprealloc

 

10.10.6.90

sudo mkdir -p /var/soft/data/arbiter1/

sudo mkdir -p /var/soft/log

/var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard1--bind_ip 0.0.0.0 --port 27000 --dbpath /var/soft/data/arbiter1/ -logpath /var/soft/log/arbiter1.log--logappend --nojournal --oplogSize=4096 --fork

 

10.10.6.46上執行

config = {_id: ‘shard1‘, members: [{_id: 0, host:‘mongodb46:27040‘}, {_id: 1, host: ‘mongodb48:27040‘},{_id: 2, host:‘mongodb90:27000‘, arbiterOnly: true}]}

rs.initiate(config);

 

//shard2

10.10.6.90 10.10.6.91

sudo mkdir -p /var/soft/data/shard2

sudo mkdir -p /var/soft/log

 

sudo /var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard2 --bind_ip0.0.0.0 --port 27050 --dbpath /var/soft/data/shard2/ -logpath /var/soft/log/shard2.log--logappend --nojournal --oplogSize=4096 --fork --noprealloc

 

10.10.6.92

sudo mkdir -p /var/soft/data/arbiter2/

sudo mkdir -p /var/soft/log

/var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard2--bind_ip 0.0.0.0 --port 27000 --dbpath /var/soft/data/arbiter2/ -logpath/var/soft/log/arbiter2.log --logappend --nojournal --oplogSize=4096 --fork

 

10.10.6.91 上執行

config = {_id: ‘shard2‘, members: [{_id: 0, host:‘mongodb90:27050‘}, {_id: 1, host: ‘mongodb91:27050‘},{_id: 2, host:‘mongodb92:27000‘, arbiterOnly: true}]}

rs.initiate(config);

 

//shard3

10.10.6.92 10.10.6.93

sudo mkdir -p /var/soft/data/shard3

sudo mkdir -p /var/soft/log

 

sudo /var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard3 --bind_ip0.0.0.0 --port 27060 --dbpath /var/soft/data/shard3/ -logpath/var/soft/log/shard3.log --logappend --nojournal --oplogSize=4096 --fork--noprealloc

 

10.10.6.94

sudo mkdir -p /var/soft/data/arbiter3/

sudo mkdir -p /var/soft/log

/var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard3--bind_ip 0.0.0.0 --port 27000 --dbpath /var/soft/data/arbiter3/ -logpath/var/soft/log/arbiter3.log --logappend --nojournal --oplogSize=4096 --fork

 

10.10.6.93 上執行

config = {_id: ‘shard3‘, members: [{_id: 0, host:‘mongodb92:27060‘}, {_id: 1, host: ‘mongodb93:27060‘},{_id: 2, host:‘mongodb94:27000‘, arbiterOnly: true}]}

rs.initiate(config);

 

//shard4

10.10.6.94 10.10.6.95

sudo mkdir -p /var/soft/data/shard4

sudo mkdir -p /var/soft/log

 

sudo /var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard4 --bind_ip0.0.0.0 --port 27070 --dbpath /var/soft/data/shard4/ -logpath/var/soft/log/shard4.log --logappend --nojournal --oplogSize=4096 --fork--noprealloc

 

10.10.6.46

sudo mkdir -p /var/soft/data/arbiter4/

sudo mkdir -p /var/soft/log

/var/soft/mongodb2.2/bin/mongod --shardsvr --replSet shard4--bind_ip 0.0.0.0 --port 27000 --dbpath /var/soft/data/arbiter4/ -logpath/var/soft/log/arbiter4.log --logappend --nojournal --oplogSize=4096 --fork

 

10.10.6.95上執行

config = {_id: ‘shard4‘, members: [{_id: 0, host:‘mongodb94:27070‘}, {_id: 1, host: ‘mongodb95:27070‘},{_id: 2, host:‘mongodb46:27000‘, arbiterOnly: true}]}

rs.initiate(config);

 

//配置configserver:

 

在10.10.6.4810.10.6.93 10.10.6.95

sudo mkdir -p /var/soft/data/config

sudo mkdir -p /var/soft/log/config

 

/var/soft/mongodb2.2/bin/mongod --bind_ip 0.0.0.0 --fork --configsvr--port 20000 --dbpath /var/soft/data/config --logpath/var/soft/log/config/config.log --logappend

 

// 添加mongos

sudo mkdir -p /var/soft/log/mongos

10.10.6.90:

/var/soft/mongodb2.2/bin/mongos --port 30000 --configdb mongodb48:20000,mongodb93:20000,mongodb95:20000--logpath /var/soft/log/mongos/mongos.log --logappend --fork

 

10.10.6.48:

/var/soft/mongodb2.2/bin/mongos --port 30000 --configdb mongodb48:20000,mongodb93:20000,mongodb95:20000--logpath /var/soft/log/mongos/mongos.log --logappend --fork

 

10.10.6.92:

/var/soft/mongodb2.2/bin/mongos --port 30000 --configdb mongodb48:20000,mongodb93:20000,mongodb95:20000--logpath /var/soft/log/mongos/mongos.log --logappend --fork

 

10.10.6.90

/var/soft/mongodb2.2/bin/mongo --port 30000

 

db.runCommand({addshard :"shard1/mongodb46:27040,mongodb48:27040",name:"shard1",maxsize:504800});

db.runCommand({addshard :"shard2/mongodb90:27050,mongodb91:27050",name:"shard2",maxsize:504800});

db.runCommand({addshard :"shard3/mongodb92:27060,mongodb93:27060",name:"shard3",maxsize:504800});

db.runCommand({addshard :"shard4/mongodb94:27070,mongodb95:27070",name:"shard4",maxsize:504800});

 

>db.runCommand( { listshards : 1 } )

如果列出了以上二個你加的shards,表示shards已經配置成功

db.printShardingStatus();

 

按研發人員要求建立shard

/var/soft/mongodb2.2/bin/mongos --port 30000 --configdbmongodb48:20000,mongodb93:20000,mongodb95:20000 --logpath/var/soft/log/mongos/mongos.log --logappend --fork

 

db.runCommand( { movePrimary: "recsys0", to:"shard1" })

db.runCommand( { movePrimary: "recsys1", to:"shard2" })

db.runCommand( { movePrimary: "recsys2", to: "shard3"})

db.runCommand( { movePrimary: "recsys3", to:"shard4" })

 

分區設定:

由於我們使用的手動分區,不是auto-sharding,所以也不需要執行類似db.runCommand({enablesharding:庫名})這樣的命令。我們只是在4個不同的shard上建立4個庫。至於讀寫操作會對應哪個庫,由程式來判斷。

那麼建庫的時候要登陸mongos來建,建好一個庫,mongos來自動給你分配是建立在哪個shard上,但是如果你對自動分配的shard不滿意可以運行命令來把它移動到別的shard上。

例如:我在mongos上建立了一個庫叫recsys0庫。運行db.printShardingStatus()命令我們可以看到這個recsys0是建到了哪個shard,如果建到了shard4,你覺得不滿意,你想改到shard1,那麼可以運行命令,db.runCommand({ movePrimary: "recsys0", to: "shard1" }),這個庫就會從shard4挪到shard1上。可通過db.printShardingStatus()再次檢查。

 

維護方面:

每個分區是一個replica set複製集,所以問題的處理與之前的replica set篇相同。

 

出現過的問題:

Recsys1庫明明配置的是在shard2上,但是shard1上也寫入了少量資料,比較奇怪,於是在shard1用mongosniff --source NET eth0 --port 27040來抓取query,看看寫入Recsys1庫的query來自於哪裡,於是發現是來自於一個mongos,其他的mongos均正常,這台mongos直接use Recsys1就進入的是shard1,但是執行db.printShardingStatus()沒發現異常,懷疑是bug,結果關閉了這台mongos服務,解決問題。

本文出自 “zhangdh開放空間” 部落格,請務必保留此出處http://linuxblind.blog.51cto.com/7616603/1709791

Mongodb sharding模式篇

聯繫我們

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