配置mongodb分片群集
Sharding cluster介绍
这是一种可以水平扩展的模式,在数据量很大时特给力,数据量很大时一般会采用这种架构去构建monodb系统。
要构建一个 MongoDB Sharding Cluster,需要三种角色:
Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障
Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。
Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
Sharding架构图:
实际环境架构
本例架构示例图:
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进程,用于客户端连接
主机 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
各节点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
软件准备
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
安装好后,目录结构如下:
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.创建数据目录
根据本例sharding架构图所示,在各台sever上创建shard数据文件目录
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,执行:
/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);
初始化节点
/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
初始化节点
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进程,并切换到admin数据库做以下配置
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.可选参数
Name:用于指定每个shard的名字,不指定的话系统将自动分配
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的状态
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安装后目录结构如下图所示非常简单,所占空间也不到100M
通过执行bin/mongod –dbpath <数据文件目录>就可以启动mongodb实例(暂且也称为实例),与mysql类似,一个mongodb实例里可以创建多个数据库。同一台主机也可以起多个mongodb实例
1.Replication模式
MongoDB提供在sever之间异步数据复制功能,用于failover和数据冗余。从1.6版本起多了replica sets功能,1.6版本之前只有Master/Slave replication结构
Mster-Slave Relication 跟mysql的M/S结构很类似
Relica Sets 1.6版本开始推出的新功能,能自动故障切换
关于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架构时
if risk averse : master/slave (replica sets are new to v1.6.0) 顾虑风险的话,用m/s
个人理解,从1.6版本推出relica sets开始,逐渐推荐用relica sets这种模式,能自动故障恢复,sharding模式中也会用到
2.Sharding模式
这是一种可以水平扩展的模式,在数据量很大时特给力,一般企业级应用中都会采用这种架构去构建monodb系统。
要构建一个 MongoDB Sharding Cluster,需要三种角色:
Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server可由几台机器组个一个relica set承担,防止主机单点故障
Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。
Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。