准备:
1、创建数据文件、日志路径目录及复制集key文件
mkdir -p /app/mongo/mongodb/data/sets/r0
mkdir -p /app/mongo/mongodb/data/sets/r1
mkdir -p /app/mongo/mongodb/data/sets/r2
mkdir -p /app/mongo/mongodb/data/sets/key/
mkdir -p /app/mongo/mongodb/data/sets/log/
echo "test sets" > /app/mongo/mongodb/data/sets/key/r0
echo "test sets" > /app/mongo/mongodb/data/sets/key/r1
echo "test sets" > /app/mongo/mongodb/data/sets/key/r2
chmod 600 /app/mongo/mongodb/data/sets/key/r*
2、启动3个mongodb实例模拟3个节点服务器:
/app/mongo/mongodb/bin/mongod --replSet rs1 --keyFile /app/mongo/mongodb/data/sets/key/r0 --port 28010 --dbpath=/app/mongo/mongodb/data/sets/r0 --logpath=/app/mongo/mongodb/data/sets/log/r0.log --logappend --fork
/app/mongo/mongodb/bin/mongod --replSet rs1 --keyFile /app/mongo/mongodb/data/sets/key/r1 --port 28011 --dbpath=/app/mongo/mongodb/data/sets/r1 --logpath=/app/mongo/mongodb/data/sets/log/r2.log --logappend --fork
/app/mongo/mongodb/bin/mongod --replSet rs1 --keyFile /app/mongo/mongodb/data/sets/key/r2 --port 28012 --dbpath=/app/mongo/mongodb/data/sets/r2 --logpath=/app/mongo/mongodb/data/sets/log/r3.log --logappend --fork
3、初始化Replica Sets环境
[mongodb@ST03SN01 mongo]$ /app/mongo/mongodb/bin/mongo -port 28010 //连接
>config_rs={_id:'rs1',members:[{_id:0,host:'localhost:28010'},{_id:1,host:'localhost:28011'},{_id:2,host:'localhost:28012'}]}
>rs.initiate(config_rs);
4、查看复制集状态,分析复制集的各项运行指标,如图所示:
ok,安装Replica Sets就成功了!下面我们在了解一下有关Replica Sets管理信息:
主从操作日志:
通过一个primary数据库的日志表来存储写操作,日志表oplog.rs,固定Capped Collection,位于local数据库,可以通过启动参数oplogSize改变
PRIMARY> db.oplog.rs.find()
{ "ts" : { "t" : 1339511556000, "i" : 1 }, "h" : NumberLong(0), "op" : "n", "ns" : "", "o" : { "msg" : "initiating set" } }
PRIMARY> db.printReplicationInfo()
configured oplog size:配置的oplog文件大小
log length start to end:oplog日志的启用时间段
oplog first event time:第一个事务日志产生时间
oplog last event time:最后一个事务日志产生时间
now:现在的时间
查看复制集的同步状态:
source:从库的IP及端口
syncedTo:目前同步情况及最后一次同步时间
主从配置信息:
在local库system.replset集合保存了所有Replica Sets的配置信息,如下:
PRIMARY> db.system.replset.find()
{ "_id" : "rs1", "version" : 1, "members" : [
{ "_id" : 0, "host" : "localhost:28010" },
{ "_id" : 1, "host" : "localhost:28011" },
{ "_id" : 2, "host" : "localhost:28012" } ]
}
管理Replica Sets
1、主从切换测试:
环境:
端口 当前成员角色 目标成员角色
28010 主 从
28011 从 从
28012 从 主
1)除了现在的主实例(端口28010)和目标主实例(端口28012)以外,其他实例全部为“冰冻”状态(即非主状态),代码如下:
[mongodb@ST03SN01 mongo]$ /app/mongo/mongodb/bin/mongo -port 28011
SECONDARY> rs.fressze(30) --代表30秒内不参加内部选举工作
2)将当前主库的实例“降级”(stepDown),代码如下:
[mongodb@ST03SN01 mongo]$ /app/mongo/mongodb/bin/mongo -port 28010
rs.stepDown(30) ---30秒内这个实例不会把自己选为primary角色
3)查看复制集状态,状态就切换了,如下显示:
2、读写分离测试:根据性能进行分配到不同的机器,然后进行快速的数据同步
1)先向主库插入一条测试数据,代码如下:
2)在从库里是不让查看的,如图所示:
3)让从库可以读,以分担主库的压力
3、故障转移测试
1)杀掉28010端口的Mongodb进程,如下图所示:
2)查看复制集的状态
3)继续服务:
4、增加节点,Mongodb提供了两种方法添加节点:一种是通过oplog增加节点,另一种通过数据库快照和oplog添加节点
1)通过oplog增加节点:数据同步完全依赖于oplog,即oplog中有多少操作日志,都需要在新节点执行一遍,以达到数据同步,优点操作简单且无需人工干预,但是oplog是Capped collection,所以会导致数据不全和不一致
a、启动一个新节点
mkdir -p /app/mongo/mongodb/data/sets/r3
echo "test sets" > /app/mongo/mongodb/data/sets/key/r3
chmod 600 /app/mongo/mongodb/data/sets/key/r3
/app/mongo/mongodb/bin/mongod --replSet rs1 --keyFile /app/mongo/mongodb/data/sets/key/r3 --port 28013 --dbpath=/app/mongo/mongodb/data/sets/r3 --logpath=/app/mongo/mongodb/data/sets/log/r3.log --logappend --fork
b、添加新节点到现有Replica Set是中,如:
rs.add("localhost:28013")
c、查看复制状态,可以看到新节点,但状态为不可用,因为还为数据同步
d、执行数据同步(自动)
e、使用新节点查询数据,如图:
2)通过数据库快照和oplog增加节点:取某一个复制集成员的物理文件作为初始化数据,剩余的部分用oplog日志来补充,达到数据一致性,步骤如下:
a、取某一个复制集成员的物理文件作为初始化数据,操作如下:
scp -r /app/mongo/mongodb/data/sets/r3 /app/mongo/mongodb/data/sets/r4
echo "test Sets" > /app/mongo/mongodb/data/sets/key/r4
chmod 600 /app/mongo/mongodb/data/sets/key/r4
b、为了验证用oplog日志来补充数据,我们在主库c1集合插入一个新记录,如下:
c、启动28014端口给新的节点,如下所示:
/app/mongo/mongodb/bin/mongod --replSet rs1 --keyFile /app/mongo/mongodb/data/sets/key/r4 --port 28014 --dbpath=/app/mongo/mongodb/data/sets/r4 --logpath=/app/mongo/mongodb/data/sets/log/r4.log --logappend --fork
d、添加28014节点到现有的复制集中,如下所示:
PRIMARY> rs.add("localhost:28014")
{ "ok" : 1 }
PRIMARY>
e、验证数据已经同步。查看是否一个记录从物理文件同步过来的,一条是从操作日志同步过来的,如下所示:
5、减少节点是减少成本,减少节点很简单,只需调用rs.remove()就行,比如:我们要移除28013和28014,操作如下:
PRIMARY> rs.remove("localhost:28013")
PRIMARY> rs.remove("localhost:28014")