mongodb复制集(replica set)搭建及管理

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()

猜你喜欢

转载自www.cnblogs.com/lhdz_bj/p/12124772.html