#本次配置时间为 2014-11-06 软件版本为:mongodb-linux-x86_64-2.4.3.tgz
linux :centos 5.9 64bit
##############################################################
本次部署分片的方式,只为测试环境: #
10.8.10.234 10.8.10.235 10.8.10.236 #
shard1 分片 master slaver arbiterOnly #
shard2 分片 master slaver arbiterOnly #
shard3 分片 master slaver arbiterOnly #
#
###############################################################
#每个服务器配置:
mkdir -p /data/mongodb/config/data
mkdir -p /data/mongodb/config/log
mkdir -p /data/mongodb/mongos/log
mkdir -p /data/mongodb/shard1/data
mkdir -p /data/mongodb/shard1/log
mkdir -p /data/mongodb/shard2/data
mkdir -p /data/mongodb/shard2/log
mkdir -p /data/mongodb/shard3/data
mkdir -p /data/mongodb/shard3/log
tar -xvzf mongodb-linux-x86_64-2.4.3.tgz
mv mongodb-linux-x86_64-2.4.3 /data/mongodb/mongodb
#每个服务器配置服务:
/data/mongodb/mongodb/bin/mongod --configsvr --dbpath /data/mongodb/config/data --port 21000 --logpath /data/mongodb/config/log/config.log --fork
#每台服务器 启动分片服务:
/data/mongodb/mongodb/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath /data/mongodb/shard1/data --logpath /data/mongodb/shard1/log/shard1.log --fork --nojournal --oplogSize 10
/data/mongodb/mongodb/bin/mongod --shardsvr --replSet shard2 --port 22002 --dbpath /data/mongodb/shard2/data --logpath /data/mongodb/shard2/log/shard2.log --fork --nojournal --oplogSize 10
/data/mongodb/mongodb/bin/mongod --shardsvr --replSet shard3 --port 22003 --dbpath /data/mongodb/shard3/data --logpath /data/mongodb/shard3/log/shard3.log --fork --nojournal --oplogSize 10
# 1台或者多台服务器启动mongos路由,应用程序连接该路由端口。
#mongos 需要等到3台服务器的配置文件都启动之后 才能启动,否则报错。
/data/mongodb/mongodb/bin/mongos --configdb 10.8.10.234:21000,10.8.10.235:21000,10.8.10.236:21000 --port 20000 --logpath /data/mongodb/mongos/log/mongos.log --fork
#################################
#登入任意服务器执行:
mongo 127.0.0.1:22001
use admin
设置分片1
>config = { _id:"shard1", members:[
{_id:0,host:"10.8.10.234:22001",priority:1},
{_id:1,host:"10.8.10.235:22001",priority:1},
{_id:2,host:"10.8.10.236:22001",arbiterOnly:true}
]
}
>rs.initiate(config);
# ,priority:N 是设置master 优先级 可以不配置,建议把分片的master放置在不同的服务器,实现读写压力分流
# arbiterOnly:true 需要配置。省略后,变成1 master + 2个slaver 与方案不符
############################
mongo 127.0.0.1:22002
use admin
设置分片2
>config = { _id:"shard2", members:[
{_id:0,host:"10.8.10.234:22002",priority:1},
{_id:1,host:"10.8.10.235:22002",priority:1},
{_id:2,host:"10.8.10.236:22002",arbiterOnly:true}
]
}
>rs.initiate(config);
# ,priority:N 是设置master 优先级 可以不配置。建议把分片的master放置在不同的服务器,实现读写压力分流
# arbiterOnly:true 需要配置 。省略后,变成1master + 2个slaver 与方案不符
#############################
mongo 127.0.0.1:22003
use admin
设置分片3
>config = { _id:"shard3", members:[
{_id:0,host:"10.8.10.234:22003",priority:1},
{_id:1,host:"10.8.10.235:22003",priority:1},
{_id:2,host:"10.8.10.236:22003",arbiterOnly:true}
]
}
>rs.initiate(config);
# ,priority:N 是设置master 优先级 可以不配置。建议把分片的master放置在不同的服务器,实现读写压力分流
# arbiterOnly:true 需要配置。省略后,变成1master + 2个slaver 与方案不符
#########################
连接mongs: bin/mongo 127.0.0.1:20000
#使用admin数据库 user admin
串联路由服务器与分配副本集1
db.runCommand( { addshard : "shard1/10.8.10.234:22001,10.8.10.235:22001,10.8.10.236:22001"});
串联路由服务器与分配副本集2
db.runCommand( { addshard : "shard2/10.8.10.234:22002,10.8.10.235:22002,10.8.10.236:22002"});
串联路由服务器与分配副本集3
db.runCommand( { addshard : "shard3/10.8.10.234:22003,10.8.10.235:22003,10.8.10.236:22003"});
#查看分片服务器的配置
db.runCommand( { listshards : 1 } );
备注:每个分片副本集的仲裁节点结果不列出来
##############################
###手动选定master备注:
在配置分片的时候 添加优先级可以手动选择master
分片配置后之后,使用如下命令,在分片的主节点登录,可以将members[1] 提升为Master。
rs.status();
rs.conf();
cfg=rs.conf();
cfg.members[0].priority=1
cfg.members[1].priority=2
#cfg.members[2] 仲裁机不用设置
rs.reconfig(cfg);
创建数据测试:
#指定testdb分片生效
db.runCommand( { enablesharding :"testdb"});
#指定数据库里需要分片的集合和片键
db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )
我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!
bin/mongo 127.0.0.1:20000
#使用testdb use testdb;
#插入测试数据
for (var i = 1; i <= 100000; i++) db.table1.save({id:i,"test1":"testval1"});
#查看分片情况如下,部分无关信息省掉了
db.table1.stats();
看到数据分到3个分片,各自分片数量为: shard1 “count” : 42183,shard2 “count”: 38937,shard3 “count” : 18880。已经成功了!不过分的好像不是很均匀,所以这个分片还是很有讲究的,后续再深入讨论。
为了充分利用3台服务器资源,缓解磁盘Io ,以上方案可以如下变通:
##############################################################
在生产环境中,可以如下部署: #
10.8.10.234 10.8.10.235 10.8.10.236 #
shard1 分片 master slaver arbiterOnly #
shard2 分片 arbiterOnly master slaver #
shard3 分片 slaver arbiterOnly master #
#
###############################################################