环境:
操作系统:window 10(win7以上应该都可以)
MongoDB:version: 3.0.6
本机ip:192.168.0.114
配置要求:
主机节点 | 本次试验地址 | 作用 |
---|---|---|
Primary节点 | 192.168.0.114:28010 | 对外提供读写服务 |
Secondary节点 | 192.168.0.114:28011 | 备用节点,数据与主节点的数据是完全同步的 |
Secondary节点2 | 192.168.0.114:28012 | 备用节点,数据与主节点的数据是完全同步的 |
仲裁节点( Arbiter) | 192.168.0.114:28012 | 由 Secondary节点2 兼并。主节点挂掉,仲裁节点会投票选出新的主节点。 |
注:现在开发测试没要那么多主机节点,所以就在一台电脑上,用不同的端口替代不同主机进行试验。
节点结构如下图:D:\mongotest\replSet
设置配置文件启动
mongodb的启动方式有三种,本次采用配置文件的启动方式。
注:配置文件的地址在conf中的mongodb.conf。
启动方式:配置文件启动
编辑配置文件:
primary:
replSet = rs1
# 端口
port = 28010
# 日志
logpath = D:\mongotest\replSet\primary\logs\mongodb.log
# 数据库
dbpath = D:\mongotest\replSet\primary\data
secondary:
replSet = rs1
# 端口
port = 28011
# 日志
logpath = D:\mongotest\replSet\secondary\logs\mongodb.log
# 数据库
dbpath = D:\mongotest\replSet\secondary\data
secondary2:
replSet = rs1
# 端口
port = 28012
# 日志
logpath = D:\mongotest\replSet\secondary2\logs\mongodb.log
# 数据库
dbpath = D:\mongotest\replSet\secondary2\data
注:路径都是绝对路径,只要你高兴,也可以都放到一个文件夹。
启动节点
进入到相应节点的bin目录
一:启动各个节点
primary:
mongod --config D:\mongotest\replSet\primary\conf\mongodb.conf
这就是启动成功了,这个提示是我已经存在了mongodb.log文件了,它帮我把之前的移动到另一个地方了,没什么大碍不影响。
在log文件中可以看到启动确实成功了,没有错误提示。
其他节点同理:
分别打开cmd窗口执行语句:
mongod --config D:\mongotest\replSet\secondary\conf\mongodb.conf
mongod --config D:\mongotest\replSet\secondary2\conf\mongodb.conf
二:配置 Primary 节点
进入 primary 节点的 bin 目录打开控制台通过命令:mongo –port 28010 连接到 primary 节点。
输入这条命令配置:
config_rs = {_id : "rs1",members : [ { _id:0, host:"192.168.0.114:28010", priority:1 },{ _id:1, host:"192.168.0.114:28011", priority:1 },{ _id:2, host:"192.168.0.114:28012", priority:1, "arbiterOnly": true } ]}
注:如果分布在不同的机器,host为:”host:’ip:port’”,设置为仲裁节点:”arbiterOnly”: true
#初始化
rs.initiate(config_rs)
返回{ “ok” : 1 }说明成功。
rs.status() 查看下当前状态
出现”stateStr” : “PRIMARY”的为当前主节点,所有数据在这里读写
在主节点数据库插入的数据,会同步到”stateStr” : “SECONDARY”节点上.
当然,”stateStr” : “SECONDARY”节点上是不允许插入数据的….
重启复制集的话:
1. 逐个重启复制集里所有的Secondary节点
2. 对Primary发送stepDown命令,等待primary降级为Secondary
3. 重启降级后的Primary
注: 默认只可以从 primary 节点读写数据,secondary 节点不支持读写,在 secondary 节点执行 rs.slaveOk() 命令可让 secondary 节点支持读写。