配置MongoDB分片群集
Sharding cluster介紹
這是一種可以水平擴展的模式,在數(shù)據(jù)量很大時特給力,數(shù)據(jù)量很大時一般會采用這種架構(gòu)去構(gòu)建monodb系統(tǒng)。
創(chuàng)新互聯(lián)公司服務(wù)項目包括閬中網(wǎng)站建設(shè)、閬中網(wǎng)站制作、閬中網(wǎng)頁制作以及閬中網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,閬中網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到閬中省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
要構(gòu)建一個 MongoDB Sharding Cluster,需要三種角色:
Shard Server: mongod 實例,用于存儲實際的數(shù)據(jù)塊,實際生產(chǎn)環(huán)境中一個shard server角色可由幾臺機器組個一個relica set承擔(dān),防止主機單點故障
Config Server: mongod 實例,存儲了整個 Cluster Metadata,其中包括 chunk 信息。
Route Server: mongos 實例,前端路由,客戶端由此接入,且讓整個集群看上去像單一數(shù)據(jù)庫,前端應(yīng)用可以透明使用。
Sharding架構(gòu)圖:
實際環(huán)境架構(gòu)
本例架構(gòu)示例圖:
1.分別在10.10.1.[107~109]機器運行一個mongod實例(稱為mongod shard11,mongod shard12,mongod shard13)組織replica set1,作為cluster的shard1
2.分別在10.10.1.[107~109]機器運行一個mongod實例(稱為mongod shard21,mongod shard22,mongod shard23)組織replica set2,作為cluster的shard2
3.分別在10.10.2.[89~91]機器運行一個mongod實例(稱為mongod shard31,mongod shard32,mongod shard33)組織replica set3,作為cluster的shard3
4.分別在10.10.2.[89~91]機器運行一個mongod實例(稱為mongod shard41,mongod shard42,mongod shard43)組織replica set4,作為cluster的shard4
5.1.107、1.108、2.89機器運行一個mongod實例,作為3個config server
6.每臺機器運行一個mongs進(jìn)程,用于客戶端連接
主機 IP 端口信息
Server1 10.10.1.107 mongod shard11:27017
mongod shard21:27018
mongod config1:20000
mongs1:30000
Server2 10.10.1.108 mongod shard12:27017
mongod shard22:27018
mongod config2:20000
mongs2:30000
Server3 10.10.1.109 mongod shard13:27017
mongod shard23:27018
mongs3:30000
Server4 10.10.2.89 mongod shard31:27017
mongod shard41:27018
mongod config3:20000
mongs4:30000
Server5 10.10.2.90 mongod shard32:27017
mongod shard42:27018
mongs5:30000
Server6 10.10.2.91 mongod shard33:27017
mongod shard43:27018
mongs6:30000
各節(jié)點hosts文件添加
#shard1
10.10.1.107 MongoDB_shard11.itings.com
10.10.1.108 MongoDB_shard12.itings.com
10.10.1.109 MongoDB_shard13.itings.com
#shard2
10.10.1.107 MongoDB_shard21.itings.com
10.10.1.108 MongoDB_shard22.itings.com
10.10.1.109 MongoDB_shard23.itings.com
#shard3
10.10.2.89 MongoDB_shard31.itings.com
10.10.2.90 MongoDB_shard32.itings.com
10.10.2.91 MongoDB_shard33.itings.com
#shard4
10.10.2.89 MongoDB_shard41.itings.com
10.10.2.90 MongoDB_shard42.itings.com
10.10.2.91 MongoDB_shard43.itings.com
#config1
10.10.1.107 MongoDB_config1.itings.com
10.10.1.108 MongoDB_config2.itings.com
10.10.2.89 MongoDB_config3.itings.com
#mongos
10.10.1.107 MongoDB_mongos1.itings.com
10.10.1.108 MongoDB_mongos2.itings.com
10.10.1.109 MongoDB_mongos3.itings.com
10.10.2.89 MongoDB_mongos4.itings.com
10.10.2.90 MongoDB_mongos5.itings.com
10.10.2.91 MongoDB_mongos6.itings.com
軟件準(zhǔn)備
1.安裝monodb軟件
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tgz
tar xvzf mongodb-linux-x86_64-2.4.9.tgz
mv mongodb-linux-x86_64-2.4.9 /usr/local/mongodb
安裝好后,目錄結(jié)構(gòu)如下:
tree mongodb-linux-x86_64-2.4.9
mongodb-linux-x86_64-1.6.2
|-- GNU-AGPL-3.0
|-- README
|-- THIRD-PARTY-NOTICES-- bin
-- mongostat
|-- bsondump
|-- mongo
|-- mongod
|-- mongodump
|-- mongoexport
|-- mongofiles
|-- mongoimport
|-- mongorestore
|-- mongos
|-- mongosniff
1 directory, 14 files
2.創(chuàng)建數(shù)據(jù)目錄
根據(jù)本例sharding架構(gòu)圖所示,在各臺sever上創(chuàng)建shard數(shù)據(jù)文件目錄
Server1:
mkdir -p /data/mongodb/data/shard11
mkdir -p /data/mongodb/data/shard21
Server2:
mkdir -p /data/mongodb/data/shard12
mkdir -p /data/mongodb/data/shard22
Server3:
mkdir -p /data/mongodb/data/shard13
mkdir -p /data/mongodb/data/shard23
Server4:
mkdir -p /data/mongodb/data/shard31
mkdir -p /data/mongodb/data/shard41
Server5:
mkdir -p /data/mongodb/data/shard32
mkdir -p /data/mongodb/data/shard42
Server6:
mkdir -p /data/mongodb/data/shard33
mkdir -p /data/mongodb/data/shard43
配置relica sets
1.配置replica sets:
Server1:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/mongodb/data/shard11 --oplogSize 8192 --logpath /data/mongodb/data/shard11.log --logappend --fork
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/mongodb/data/shard21 --oplogSize 8192 --logpath /data/mongodb/data/shard21.log --logappend --fork
Server2:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/mongodb/data/shard12 --oplogSize 8192 --logpath /data/mongodb/data/shard12.log --logappend --fork
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/mongodb/data/shard22 --oplogSize 8192 --logpath /data/mongodb/data/shard22.log --logappend --fork
Server3:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/mongodb/data/shard13 --oplogSize 8192 --logpath /data/mongodb/data/shard13.log --logappend --fork
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/mongodb/data/shard23 --oplogSize 8192 --logpath /data/mongodb/data/shard23.log --logappend --fork
Server4:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard3 --port 27017 --dbpath /data/mongodb/data/shard31 --oplogSize 8192 --logpath /data/mongodb/data/shard31.log --logappend --fork
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard4 --port 27018 --dbpath /data/mongodb/data/shard41 --oplogSize 8192 --logpath /data/mongodb/data/shard41.log --logappend --fork
Server5:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard3 --port 27017 --dbpath /data/mongodb/data/shard32 --oplogSize 8192 --logpath /data/mongodb/data/shard32.log --logappend --fork
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard4 --port 27018 --dbpath /data/mongodb/data/shard42 --oplogSize 8192 --logpath /data/mongodb/data/shard42.log --logappend --fork
Server6:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard3 --port 27017 --dbpath /data/mongodb/data/shard33 --oplogSize 8192 --logpath /data/mongodb/data/shard33.log --logappend --fork
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard4 --port 27018 --dbpath /data/mongodb/data/shard43 --oplogSize 8192 --logpath /data/mongodb/data/shard43.log --logappend --fork
初始化replica set
用mongo連接其中一個mongod,執(zhí)行:
/usr/local/mongodb/bin/mongo --host 10.10.1.107 --port 27017
config = {_id: 'shard1', members: [
{_id: 0, host: 'MongoDB_shard11.itings.com:27017'},
{_id: 1, host: 'MongoDB_shard12.itings.com:27017'},
{_id: 2, host: 'MongoDB_shard13.itings.com:27017'}]
}
rs.initiate(config);
/usr/local/mongodb/bin/mongo --host 10.10.1.107 --port 27018
config = {_id: 'shard2', members: [
{_id: 0, host: 'MongoDB_shard21.itings.com:27018'},
{_id: 1, host: 'MongoDB_shard22.itings.com:27018'},
{_id: 2, host: 'MongoDB_shard23.itings.com:27018'}]
}
rs.initiate(config);
初始化節(jié)點
/usr/local/mongodb/bin/mongo --host 10.10.2.89 --port 27017
config = {_id: 'shard3', members: [
{_id: 0, host: 'MongoDB_shard31.itings.com:27017'},
{_id: 1, host: 'MongoDB_shard32.itings.com:27017'},
{_id: 2, host: 'MongoDB_shard33.itings.com:27017'}]
}
rs.initiate(config);
/usr/local/mongodb/bin/mongo --host 10.10.2.89 --port 27018
初始化節(jié)點
config = {_id: 'shard4', members: [
{_id: 0, host: 'MongoDB_shard41.itings.com:27018'},
{_id: 1, host: 'MongoDB_shard42.itings.com:27018'},
{_id: 2, host: 'MongoDB_shard43.itings.com:27018'}]
}
rs.initiate(config);
配置三臺config server
Server1機器
mkdir -p /data/mongodb/data/config
啟動configserver1
/usr/local/mongodb/bin/mongod --configsvr --dbpath /data/mongodb/data/config --port 20000 --logpath /data/mongodb/data/config.log --logappend --fork
Server2機器
mkdir -p /data/mongodb/data/config
啟動configserver2
/usr/local/mongodb/bin/mongod --configsvr --dbpath /data/mongodb/data/config --port 20000 --logpath /data/mongodb/data/config.log --logappend --fork
Server4機器
mkdir -p /data/mongodb/data/config
啟動configserver3
/usr/local/mongodb/bin/mongod --configsvr --dbpath /data/mongodb/data/config --port 20000 --logpath /data/mongodb/data/config.log --logappend --fork
配置mongs
所有機器都啟動mongos
/usr/local/mongodb/bin/mongos --configdb MongoDB_config1.itings.com:20000,MongoDB_config2.itings.com:20000,MongoDB_config3.itings.com:20000 --port 30000 --chunkSize 5 --logpath /data/mongodb/data/mongos.log --logappend --fork
#mongs不需要dbpath
Configuring the Shard Cluster
連接到其中一個mongos進(jìn)程,并切換到admin數(shù)據(jù)庫做以下配置
1.連接到mongs,并切換到admin
/usr/local/mongodb/bin/mongo MongoDB_mongos1.itings.com:30000/admin
2.加入shards
db.runCommand( { addshard : "shard1/MongoDB_shard11.itings.com:27017,MongoDB_shard12.itings.com:27017,MongoDB_shard13.itings.com:27017",name:"s1"} );
db.runCommand( { addshard : "shard2/MongoDB_shard21.itings.com:27018,MongoDB_shard22.itings.com:27018,MongoDB_shard23.itings.com:27018",name:"s2"} );
db.runCommand( { addshard : "shard3/MongoDB_shard31.itings.com:27017,MongoDB_shard32.itings.com:27017,MongoDB_shard33.itings.com:27017",name:"s3"} );
db.runCommand( { addshard : "shard4/MongoDB_shard41.itings.com:27018,MongoDB_shard42.itings.com:27018,MongoDB_shard43.itings.com:27018",name:"s4"} );
獲得分片概要信息:
db.printShardingStatus();
3.可選參數(shù)
Name:用于指定每個shard的名字,不指定的話系統(tǒng)將自動分配
maxSize:指定各個shard可使用的最大磁盤空間,單位megabytes
樣例:
db.runCommand( { addshard : "shard1/MongoDB_shard11.itings.com:27017,MongoDB_shard12.itings.com:27017,MongoDB_shard13.itings.com:27017",name:"s1",maxSize: 512000} );
獲得分片概要信息:
db.printShardingStatus();
db.user.getShardDistribution();
db.runCommand( { listshards : 1 } );
查看各collection的狀態(tài)
db.printCollectionStats()
激活分片樣例
db.runCommand({"enablesharding" : "kaola_play"});
db.runCommand( { shardcollection : "kaola_play.user",key : {_id: 1} } );
附錄:mongodb運行模式介紹
?單機模式
?Replication模式,這又可分為Master-Slave Replication和Replica Sets
?Sharding模式
1.單機模式
這里有目前的mongodb 1.6.2版本作介紹,mongodb安裝后目錄結(jié)構(gòu)如下圖所示非常簡單,所占空間也不到100M
通過執(zhí)行bin/mongod –dbpath <數(shù)據(jù)文件目錄>就可以啟動mongodb實例(暫且也稱為實例),與MySQL類似,一個mongodb實例里可以創(chuàng)建多個數(shù)據(jù)庫。同一臺主機也可以起多個mongodb實例
1.Replication模式
MongoDB提供在sever之間異步數(shù)據(jù)復(fù)制功能,用于failover和數(shù)據(jù)冗余。從1.6版本起多了replica sets功能,1.6版本之前只有Master/Slave replication結(jié)構(gòu)
?Mster-Slave Relication 跟mysql的M/S結(jié)構(gòu)很類似
?Relica Sets 1.6版本開始推出的新功能,能自動故障切換
關(guān)于Mster-Slave Relication和 Relica Sets,怎么選擇呢?
Which should I use?
?if using
?if using --auth (security) or --slavedelay : for now, master/slave 想指定slave延遲時間,就用M/S
?if using sharding : either, but replica sets are best for clusters that are not small 用sharding架構(gòu)時
?if risk averse : master/slave (replica sets are new to v1.6.0) 顧慮風(fēng)險的話,用m/s
個人理解,從1.6版本推出relica sets開始,逐漸推薦用relica sets這種模式,能自動故障恢復(fù),sharding模式中也會用到
2.Sharding模式
這是一種可以水平擴展的模式,在數(shù)據(jù)量很大時特給力,一般企業(yè)級應(yīng)用中都會采用這種架構(gòu)去構(gòu)建monodb系統(tǒng)。
要構(gòu)建一個 MongoDB Sharding Cluster,需要三種角色:
Shard Server: mongod 實例,用于存儲實際的數(shù)據(jù)塊,實際生產(chǎn)環(huán)境中一個shard server可由幾臺機器組個一個relica set承擔(dān),防止主機單點故障
Config Server: mongod 實例,存儲了整個 Cluster Metadata,其中包括 chunk 信息。
Route Server: mongos 實例,前端路由,客戶端由此接入,且讓整個集群看上去像單一數(shù)據(jù)庫,前端應(yīng)用可以透明使用。