1、mongodb分區科普 (各種羅嗦)
Replica Set(複本集):
複本集使其組內的每個成員(member)在不同的mongod執行個體中具有相同的資料備份,這樣可以將來自應用伺服器的請求訪問(request visit)得以均勻的分布在Replica Set的每一個成員所在的mongod執行個體上,用以減緩單台mongod伺服器在請求負載上的壓力。在一定時限內Replica Set能完成其組內成員資料的最終一致,這種備份機制是自動且對使用者透明的。
Mongodb使用緩衝來大量命中讀請求來達到提高輸送量的目的,這樣使得在某些極端的情況下(比如單機房部署環境下機房斷電)仍不能保證資料完整可靠的儲存下來。會丟失最近幾十秒內最新寫入的資料。
Sharding(切分規則):
在單mongod執行個體中的資料負載過大時,可以考慮將執行個體中的資料按一定的規則將資料部署到不同mongod執行個體中。同樣在此切分規則之下,對資料的訪問請求也將按此規則分發到不同的mongod執行個體中,解決單機資料量過大時查詢效能下降的問題。
當然,系統要求資料庫在切分規則下也有較高的可用性,保證資料在經過切分後也會有多份拷貝放置在不同的伺服器中。使得相同資料的mongod執行個體形成分區組(shards group),既Replica Set。這樣使得mongodb叢集允許不多的伺服器故障後仍然保有完整的資料。
Config Server(設定管理員):
Config Server儲存分區叢集的的中繼資料,其中包括在每個mongod執行個體的基本資料和塊資訊。每個設定管理員所有塊的中繼資料的副本。通過兩次提交來確保在設定管理員資訊與塊資料的一致性。
Routing Processor(mongos路由進程)
mongos 可以被看作是一個資料和請求分發的中心,使單一的mongod執行個體組成互相關聯的叢集。當接收用戶端請求, mongos根據Config Server路由到相應的mongod執行個體(可能是一組mongod),處理並返回結果。mongos 進程沒有持久狀態,在mongos啟動時和設定管理員建立串連並擷取狀態,當設定管理員發生任何變化時,會將之傳播到每個mongos 進程。
(領導讓寫個方案,就照著別人的畫了個圖,純屬剽竊,如有雷同,不會是巧合! )
2、啟動三台機器的mongod執行個體
根據Replica Set、Sharding策略部署mongod。將兩個sharding組部署到三台伺服器上,每個sharding組有三個replica set成員。
#Server1:
mkdir -p /data2/mongodb/shard11
mkdir -p /data2/mongodb/shard21
/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data2/mongodb/shard11 --oplogSize 100 --logpath /data2/mongodb/shard11.log --logappend --fork --rest
/mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data2/mongodb/shard21 --oplogSize 100 --logpath /data2/mongodb/shard21.log --logappend --fork –rest
#Server2:
mkdir -p /data2/mongodb/shard12/
mkdir -p /data2/mongodb/shard22/
/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data2/mongodb/shard12 --oplogSize 100 --logpath /data2/mongodb/shard12.log --logappend --fork --rest
/mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data2/mongodb/shard22 --oplogSize 100 --logpath /data2/mongodb/shard22.log --logappend --fork –rest
#Server3:
mkdir -p /data2/mongodb/shard13/
mkdir -p /data2/mongodb/shard23/
/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data2/mongodb/shard13 --oplogSize 100 --logpath /data2/mongodb/shard13.log --logappend --fork --rest
/mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data2/mongodb/shard23 --oplogSize 100 --logpath /data2/mongodb/shard23.log --logappend --fork –rest
3、初始化Replica Set
通過命令列初始化兩組Replica Set,通過mongo串連到一個mongod
/mongodb/bin/mongo 172.17.0.121:27017
config = {_id: ‘shard1′, members: [
{_id: 0, host: '172.17.0.121:27017'},
{_id: 1, host: '172.17.0.122:27017'},
{_id: 2, host: '172.17.0.123:27017'}]};
rs.initiate(config);
/mongodb/bin/mongo 172.17.0.121:27018
config = {_id: ‘shard2′, members: [
{_id: 0, host: '172.17.0.121:27018'},
{_id: 1, host: '172.17.0.122:27018'},
{_id: 2, host: '172.17.0.123:27018'}]};
rs.initiate(config);
4、啟動並配置三台Config Server
#Server1、2、3:
mkdir -p /data2/mongodb/config/
/mongodb/bin/mongod --configsvr --dbpath /data2/mongodb/config/ --port 20000 --logpath /data2/mongodb/config1.log --logappend –fork
5、部署並配置三台Routing Server
指定所有的config sever地址參數,chunkSize是分割資料時每塊(Chunk)的單位大小
#Server1、2、3:
/mongodb/bin/mongos --configdb 172.17.0.121:20000, 172.17.0.122:20000, 172.17.0.123:20000 --port 30000 --chunkSize 100 --logpath /data2/mongodb/mongos.log --logappend –fork
6、命令列添加分區
串連到mongs伺服器,並切換到admin
/mongodb/bin/mongo 172.17.0.121:30000/admin
db.runCommand( {
addshard : “shard1/172.17.0.121:27017, 172.17.0.122:27017, 172.17.0.123:27017”,
name:”shard1”,
maxsize:20480,
allowLocal:true } );
db.runCommand( {
addshard : “shard2/172.17.0.121:27018, 172.17.0.122:27018, 172.17.0.123:27018”,
name:”shard2”,
maxsize:20480
allowLocal:true} );
db.runCommand( { listshards : 1 } );
如果列出(sharding)了以上二個你加的shards,表示shards已經配置成功
7、啟用資料庫的分區
DB分區, 使DB下所有Collection實現資料的橫向切分
db.runCommand( { enablesharding : “test” } );
查看Sharding狀態
use admin;
db.printShardingStatus();
Collection分區, 使單個Collection實現資料的橫向切分
要使單個Collection分區儲存,需要給Collection指定一個分區key。
a. 分區的collection系統會自動建立一個索引(也可使用者提前建立好)
b. 分區的collection只能有一個在分區key上的唯一索引,其它唯一索引不被允許
db.runCommand( { shardcollection : “test.c1″,key : {id: 1} };
可以通過db.c1.stats()來查看分區狀態。
final、生產環境建議使用設定檔來啟動mongod
例: /mongodb/bin/mongod --config /data2/mongodb/shard1/shard1.properties --rest