自己为了测试方便,使用一台机器,将mongo执行在不同端口,并指定了多个目录存放数据

环境准备

  • 安装mongodb,此处不再赘述

  • 创建数据存放目录,例/tmp/mongo/db1/

  • mongo_repset_1

  • 以副本集方式启动mongo服务,根据环境不同可能运行的命令也不相同,但参数都一样

开启各节点服务

28017端口需要提供WEB管理工具,因此不能占用 只有两个节点时,副本集将不具备真正的故障转移能力,故而官方推荐的副本集是至少3个节点.

mongod --replSet {repset_name} --dbpath=/tmp/mong/db1/ --port=30001 > /dev/null 2>&1 & 
mongod --replSet {repset_name} --dbpath=/tmp/mong/db2/ --port=30002 > /dev/null 2>&1 & 
mongod --replSet {repset_name} --dbpath=/tmp/mong/db3/ --port=30003 > /dev/null 2>&1 &
mongod --replSet {repset_name} --dbpath=/tmp/mong/db4/ --port=30004 > /dev/null 2>&1 & #作为仲裁节点,没有仲裁节点无法实现自动切换主从

参数说明: --replSet 以副本集方式运行服务 --dbpath 指定数据存放路径 --port 指定端口

写入配置
service mongodb start #启动服务 
mongo #执行cli工具 
use admin # 
rs.initiate({'_id':'myrst', 'members':[{'_id':0,'host':'127.0.0.1:30001','priority':2}, {'_id':1,'host':'127.0.0.1:30002','priority':1}, {'_id':2,'host':'127.0.0.1:30003','priority':1}, {'_id':3, 'host':'127.0.0.1:30004','priority':1,'arbiterOnly':true}] });
# priority:1 设置优先级, 'arbiterOnly':true 设为仲裁节点

此时将看到如图所示,即表示成功运行

mongo_repset_2

后面登陆副本集的mongo客户端,需要加端口 mongo --port 30001
本地副本集启动脚本

查看运行状态

rs.status()

添加新节点/仲裁节点

  1. 增加新的副本集服务

    mongod --replSet {repset_name} --dbpath=/tmp/mong/db1/ --port=30001 > /dev/null 2>&1 &

  2. 登陆主节点client,进行如下操作

    mongo --port 30001 use admin rs.add("127.0.0.1:30004") #添加新节点 rs.addArb("127.0.0.1:30004") # 添加仲裁节点

删除节点

  1. 查找原有副本集并kill掉其进程

  2. 登陆主节点client,进行如下操作

    mongo --port 30001 use admin rs.remove("127.0.0.1:30004")

设置子节点可读写

rs.slaveOk()

 重新进行主节点选举

     rs.stepDown()

 重新设置节点优先级

此功能亦可实现节点的强制切换

方式1 提高某一节点优先级
config=rs.conf()
config.members[1].priority=2
rs.reconfig(config)
方式2 全部重设
config={"members" : [
   {"_id" : 0,"host" : "127.0.0.1:30001", priority : 1},
   {"_id" : 1,"host" : "127.0.0.1:30002", priority : 2},
   {"_id" : 2,"host" : "127.0.0.1:30003", priority : 1},
   {"_id" : 3,"host" : "127.0.0.1:30004", priority : 1, 'arbiterOnly':true}
]}
rs.reconfig(config)