参考

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

Published

2016-02-24

Categories


Tags