1.创建三个节点数据存储目录
# mkdir -p /data/data/r0
# mkdir -p /data/data/r1
# mkdir -p /data/data/r2
2.创建三个节点日志存储目录
# mkdir -p /data/log/
3.创建和配置三个节点复制集key文件
# mkdir -p /data/key
# echo "this is rs1 super secret key" > /data/key/r0
# echo "this is rs1 super secret key" > /data/key/r1
# echo "this is rs1 super secret key" > /data/key/r2
# chmod 600 /data/key/r*
4.启动复制集的三个mongodb实例
# /usr/local/mongodb/bin/mongod --replSet rs1 --keyfile /data/key/r0 --fork --port 28010 --dbpath /data/data/r0 --logpath=/data/log/r0.log --logappend
# /usr/local/mongodb/bin/mongod --replSet rs1 --keyfile /data/key/r1 --fork --port 28011 --dbpath /data/data/r1 --logpath=/data/log/r1.log --logappend
# /usr/local/mongodb/bin/mongod --replSet rs1 --keyfile /data/key/r2 --fork --port 28012 --dbpath /data/data/r2 --logpath=/data/log/r2.log --logappend
5.配置和初始化复制集环境
# cd /usr/local/mongodb/bin
# ./mongo --port 28010
> config_rs1={_id:‘rs1‘,members:[{_id:0,host:‘localhost:28010‘},{_id:1,host:‘localhost:28011‘},{_id:2,host:‘localhost:28012‘}]}
> rs.initiate(config_rs1);
6.查看复制集状态
> rs.status();
> rs.isMaster();
7.查看主从操作日志及状态
# cd /usr/local/mongodb/bin
# ./mongo --port 28010
> show databases;
> use local;
> show collections;
> db.oplog.rs.find()
> db.printReplicationInfo()
> db.printSlaveReplicationInfo()
8.查看主从配置信息
# cd /usr/local/mongodb/bin
# ./mongo --port 28010
> show databases;
> use local;
> show collections;
> db.system.replset.find()
9.管理复制集
1)主从切换
--将当前主实例(28010)和目标主实例(28012)外的其他实例(28011)都设置为"冰冻"状态,这里冰冻30秒
# cd /usr/local/mongodb/bin
# ./mongo --port 28011
> rs.freeze(30)
--将当前主实例(28010)“降级”,这里为降级30秒
# cd /usr/local/mongodb/bin
# ./mongo --port 28010
> rs.stepDown(30)
--查看复制集状态
# cd /usr/local/mongodb/bin
# ./mongo --port 28010
> rs.status()
2)读写分离
--先向主库插入一条数据
# cd /usr/local/mongodb/bin
# ./mongo --port 28010
> db.c1.insert({age:30})
> db.c1.find()
--登陆从库查看
# cd /usr/local/mongodb/bin
# ./mongo --port 28011
> show collections
--此时从库查询报错
--设置从库可读
# cd /usr/local/mongodb/bin
# ./mongo --port 28011
> db.getMongo().setSlaveOk()
> show collections
> db.c1.find()
3)故障转移
--kill掉28010主实例
# ps -ef|grep mong
# kill -2 pid or kill -15 pid or kill -9 pid
--kill -9可能导致mongodb崩溃,尽量别用
--登陆从节点查看复制集状态
# cd /usr/local/mongodb/bin
# ./mongo --port 28011
> rs.status();
4)增删节点
--通过oplog增加节点
# mkdir -p /data/data/r3
# echo "this is rs1 super secret key" > /data/key/r3
# chmod 600 /data/key/r3
# /usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r3 --fork --port 28013 --dbpath /data/data/r3 --logpath=/data/log/r3.log --logappend
# # cd /usr/local/mongodb/bin
# ./mongo --port 28010
> rs.add("localhost:28013")
--连续查看复制集状态
> rs.status()
--errmsg状态从初始化(still initializing)-->数据同步(initial sync need a member to be primary or secondary to do our initial sync)-->初始化同步完成(initial sync done)-->节点添加完成(errmsg消失;stateStr变为second)
--通过数据库快照和oplog增加节点
--取一个复制集成员的物理文件作为初始化数据
# scp -r /data/data/r3 /data/data/r4
# echo "this is rs1 super secret key" > /data/key/r4
# chmod 600 /data/key/r4
--快照获取完毕后,向主库c1中插入一条记录,用于验证后续同步操作
# cd /usr/local/mongodb/bin
# ./mongo --port 28010
> db.c1.find()
> db.c1.insert({age:20})
> db.c1.find()
--启用28014新实例
# /usr/local/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r4 --fork --port 28014 --dbpath /data/data/r4 --logpath=/data/log/r4.log --logappend
--登录主库实例,添加28014实例
# cd /usr/local/mongodb/bin
# ./mongo --port 28010
> rs.add("localhost:28014")
--登录28014实例验证同步
# cd /usr/local/mongodb/bin
# ./mongo --port 28014
> rs.slaveOk()
> db.c1.find()
5)减少节点
--登录主库节点
# cd /usr/local/mongodb/bin
# ./mongo --port 28010
> rs.status()
> rs.remove("localhost:28014")
> rs.remove("localhost:28013")
> rs.status()
原文:https://www.cnblogs.com/lhdz_bj/p/12124772.html