一 .集群部署简介
MongoDB 的部署方式十分灵活,可以使用单个 MongoDB 实例,也可以使用复制集和分片集群。在测试开发阶段一般使用单个 MongoDB 实例。由于云数 据中心需要存储海量数据且系统并发访问量大,所以需要使用 MongoDB 分片集 群存储数据,这里将使用三台机器来搭建 MongoDB 分片集群,其部署方式如下图所示。
MongoDB 分片集群包括三个配置服务器,三个 mongos 路由服务器以及三 个分片组成,其中每个分片是由三个节点组成的复制集。 分片集群设备具体参数如下:
主机配置:CPU 2GHZ 内存 4G 硬盘 250G
操作系统:Ubuntu x86_64 GNU/Linux
MongoDB:x86_64 Version 2.4.12
二.机器部署
MongoDB 分片集群部署步骤如下:
1) 创建数据目录
在每台服务器上使用如下脚本创建数据目录
home=/home/yuzhi/MongoDB
if [ ! -f "$home/ShardEnv" ];then
#测试环境目录
mkdir -p $home/ShardEnv
#配置服务器的数据和日志目录
mkdir -p $home/ShardEnv/config/data
mkdir -p $home/ShardEnv/config/log
#mongos 日志目录
mkdir -p $home/ShardEnv/mongos/log
#三个分片服务器的数据和日志目录
mkdir -p $home/ShardEnv/shard1/data
mkdir -p $home/ShardEnv/shard1/log
mkdir -p $home/ShardEnv/shard2/data
mkdir -p $home/ShardEnv/shard2/log
mkdir -p $home/ShardEnv/shard3/data
mkdir -p $home/ShardEnv/shard3/log
fi
由于 mongos 服务器不需要存储数据,只需创建 mongos 服务器的日志目录, 配置服务器和片服务器需要包含数据目录和日志目录。
2) 启动配置服务器进程
在每台服务器上使用如下脚本来启动配置服务器
DataHome=/home/yuzhi/MongoDB/ShardEnv
config_dbpath=$DataHome/config/data
config_logpath=$DataHome/config/log/mongod.log
mongod –configsvr --dbpath $config_dbpath –logpath $config_logpath –logappend --port 20000 --fork
3) 启动 mongos 进程
在每台服务器上运行如下脚本,来启动 mongos 进程
DataHome=/home/yuzhi/MongoDB/ShardEnv
mongos_logpath=$DataHome/mongos/log/mongod.log
config1=node1:20000
config2=node2:20000
config3=node3:20000
mongos --configdb$config1,$config2,$config3 –logpath $mongos_logpath --logappend –port 30000 –fork
4) 启动分片进程
在每台服务器上运行如下脚本,来启动分片进程
DataHome=/home/yuzhi/MongoDB/ShardEnv
shard_dbpath_1=$DataHome/shard1/data
shard_logpath_1=$DataHome/shard1/log/mongod.log
shard_dbpath_2=$DataHome/shard2/data
shard_logpath_2=$DataHome/shard2/log/mongod.log
shard_dbpath_3=$DataHome/shard3/data
shard_logpath_3=$DataHome/shard3/log/mongod.log
mongod--shardsvr--replSetshard1--dbpath$shard_dbpath_1--logpath$shard_logpath _1 --logappend--port22001--fork
mongod--shardsvr--replSetshard2--dbpath$shard_dbpath_2--logpath$shard_logpath _2 --logappend--port22002--fork
mongod--shardsvr--replSetshard3--dbpath$shard_dbpath_3--logpath$shard_logpath _3 --logappend--port22003--fork
5) 配置每个分片的复制集
登陆mongo,添加相应的机器,其中分片 shard1 的配置如下:
yuzhi@node1:~/MongoDB/sh$ mongo node1:22001
MongoDB shell version: 2.4.12
connecting to: node1:22001/test
> config={_id:"shard1",members:[
... {_id:0,host:"node1:22001"},
... {_id:1,host:"node2:22001"},
... {_id:2,host:"node3:22001"}
...]
配置完成后,使用 rs.initiate(config)命令初始化复制集。
添加成功后,可以使用 rs.status()命令查看复制集的状态,如下图所示,说明复制集 shard1 启动成功。
以相同的方式来配置分片 shard2 和 shard3。
6) 分片配置
运行如下命令,将创建好的三个分片添加到集群中
yuzhi@node1:~/MongoDB/sh$ mongo node1:30000
MongoDB shell version: 2.4.12
connecting to: node1:30000/test
mongos> use admin switched to db admin
mongos>db.runCommand( {addshard:"shard1/node1:22001,node2:22001,node3:2 2001" } ) { "shardAdded" : "shard1", "ok" : 1 } mongos>db.runCommand( {addshard:"shard2/node1:22002,node2:22002,node3:2 2002" } ) { "shardAdded" : "shard2", "ok" : 1 } mongos>db.runCommand( {addshard:"shard3/node1:22003,node2:22003,node3:22 003" } ) { "shardAdded" : "shard3", "ok" : 1 }
三 验证分片集群
为了验证分片集群是否正常工作,现将测试数据导入分片集群中, 来查看数据的分布情况。
默认情况下,创建的数据库和集合不会分片。因此,为了验证分片集群,首先创建允许分片的数据库和集合,其创建方式如下:
mongos> db.runCommand( {enablesharding: "GISNew"} )
{ "ok" : 1 }
mongos>db.runCommand( {shardCollection:" GISNew.baidugis",key:{id:1} )
{ "collectionsharded" : "testshard.shardtable", "ok" : 1 }
这里选择 id 作为分片的片键,然后使用 mongorestore 命令导入数据。
使用 mongorestore --host node1 --port 30000 baidugis 导入测试数据,导入完 成后,使用 db.printShardingStatus() 查看数据的分布情况,其结果如下图所示。
可以看到,数据库 GISNew 和集合 baidugis 已经分片, 测试数据分散的存储在 shard1、shard2 和 shard3 上,其中 shard1 和 shard3 上有 4 个数据块,shard2 上有 3 个数据块。