mongodb-Deploy a Sharded Cluster
2个Standard节点+1个Arbiter节点 搭建MongoDB Replication Sets
1,创建目录
[root@localhost ~]# mkdir -p /data/replset/r0
[root@localhost ~]# mkdir -p /data/replset/r1
[root@localhost ~]# mkdir -p /data/replset/r2
[root@localhost ~]# mkdir -p /data/replset/key
[root@localhost ~]# mkdir -p /data/replset/log
2,创建KEY
[root@localhost ~]# echo "replset1 key" > /data/replset/key/r0
[root@localhost ~]# echo "replset1 key" > /data/replset/key/r1
[root@localhost ~]# echo "replset1 key" > /data/replset/key/r2
[root@localhost ~]# chmod 600 /data/replset/key/r* //600,防止其它程序改写此KEY
mongod --dbpath=/data/replset/r0 --replSet replset1 --keyFile /data/replset/key/r0 --port 28010//一定要加keyFile!!!
mongod --dbpath=/data/replset/r1 --replSet replset1 --keyFile /data/replset/key/r1 --port 28011
mongod --dbpath=/data/replset/r2 --replSet replset1 --keyFile /data/replset/key/r2 --port 28012
初始化复本集:
mongo --port 28010
config_replset1 = {
_id:"replset1",
members:
[
{_id:0,host:"127.0.0.1:28010",priority:4},
{_id:1,host:"127.0.0.1:28011",priority:2},
{_id:2,host:"127.0.0.1:28012",arbiterOnly : true}
]
}
注意arbiter仲裁节点只投票,不接收复制的数据!
rs.initiate(config_replset1);
配置SECONDARY的slaveOk,使其读:
mongo --port 28011
rs.slaveOk()
//向PRIMARY写入一条数据 SECONDARY 同步
//SECONDARY不能写,而设置slaveOk后,可以从SECONDARY读取数据
默认情况下SECONDARY不能读写,要设定db.getMongo().setSlaveOk();才可以从SECONDARY读取
replset1:SECONDARY> db.mydb.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
执行: rs.slaveOk()即可
replSet里只能有一个Primary库,只能从Primary写数据,不能向SECONDARY写数据
启动Config Server:
Config Server : 40000
mkdir -p /data/mixreplset/shard/config
mongod --dbpath /data/mixreplset/shard/config --configsvr --port 40000 --directoryperdb --rest
启动Route Process:
Route Process : 50000
/Apps/mongo/bin/mongos --port 50000 --configdb 127.0.0.1:40000 --chunkSize 1
--chunkSize 1 (MB)指定分片的最小单位容量,这里设置1M,方便查看效果
连接到mongos配置Sharding
用Mongo Shell 登录 Route Process
/Apps/mongo/bin/mongo --port 50000
use admin (记得执行这一点,切换到admin数据库)
//添加分片节点,将副本集作为一个节点添加
注意添加副本集作为一个分片时,格式有点不同!
mongos> db.runCommand({addshard:"replset1/127.0.0.1:28010,127.0.0.1:28011,127.0.0.1:28012",allowLocal:true})
(allowLocal:true仅仅开发时才将分片配置到本地)
故障切换能力测试
use mydb
db.users.insert({name:"jack",age:0,addr:"guangzhou",country:"China"})
测试插入100万条数据
for(var i=1; i<=1000000; i++) db.users.insert({name:"jack",age:i,addr:"guangzhou",country:"China"})
然后插入到30万条时停止28010(Primary)的进程
然后replset1马上切换到28012(PRIMARY)注:选择主服务器是随机的所以我这边没有直接变成28011
(杀掉28010端口的Mongodb进程:ps -ef |grep mongod)
增加节点:(一种是通过oplog增加节点,另一种通过数据库快照和oplog添加节点)
1,通过oplog增加节点
a,启动一个新节点
b, 添加新节点到现有Replica Set是中,如:rs.add("localhost:28013")
c、查看复制状态,可以看到新节点,但状态为不可用,因为还未数据同步
d、执行数据同步(自动) 之后新节点即可使用
2,通过数据库快照和oplog增加节点:
a、取某一个复制集成员的物理文件作为初始化数据,操作如下:
scp -r /app/mongo/mongodb/data/sets/r3 /app/mongo/mongodb/data/sets/r4 // /app/mongo/mongodb/data/sets/r3为dbpath
echo "test Sets" > /app/mongo/mongodb/data/sets/key/r4
chmod 600 /app/mongo/mongodb/data/sets/key/r4
b,新开28014端口,然后插入查询数据,再新插入一条再查询
c,添加28014节点到现有的复制集中,如下所示:
PRIMARY> rs.add("localhost:28014")
减少节点:
rs.remove("localhost:28013")
blog comments powered by Disqus