标签:命令 image mkdir host dock cond failover mongod 快速
标签(空格分隔): MongoDB
本实验的ReplicaSet集群为 1*Primary, 1*Secondary, n*Arbiter。
目的是为了验证:
使用docker快速生成三个容器模拟三台主机。

| Name | Port | Role(Experted) | 
|---|---|---|
| mongo-c1 | 37017 | Primary | 
| mongo-c2 | 47017 | Secondary | 
| mongo-c3 | 57017 | Arbiter | 
在发生故障,且mongo数据节点不能够自身选举出Primary的时候,就需要Arbiter节点介入了,(否则不介入)。
修改三个节点中的配置文件
replication:
  replSetName: rep1
重启各个节点
获取各个节点docker容器IP(docker inspect),这里采用宿主机IP和映射端口。
通过客户端连接到任何一个节点。
./mongo
输入:
rs.initiate({
    _id:"rep1",members:[
        {_id:1,host:"192.16.8.105:37017", priority:10},
        {_id:2,host:"192.16.8.105:47017", priority:5},
        {_id:3,host:"192.16.8.105:57017", arbiterOnly:true}
    ]
})
之后将会返回响应:
{ "ok" : 1 }
通过rs.status();命令可以看到集群状态

通过直接关闭Primary所在的容器,来观察Secondary的角色变化。
docker stop mongo-c1
关闭后通过rs.status()查看,发现mongo已经auto-failover了。

发现该节点作为Secondary加入。

等待一会,发现该节点又变为了Primary。

可正常工作。
节点状态无影响,可正常工作。
原Primary变为Secondary,无法正常工作。
通过docker,重新生成两个容器模拟两个主机。
| Name | Port | Role(Experted) | 
|---|---|---|
| mongo-c1 | 37017 | Primary | 
| mongo-c2 | 47017 | Secondary | 
| mongo-c2 | 57017 | Arbiter | 
也就是在Secondary机器上运行一个Aribiter实例即可。
docker run -d -p 37017:27017 --name mongo-c1 tung/mongo:1.0
docker run -d -p 47017:27017 -p 57017:27018 --name mongo-c2 tung/mongo:1.0
replication:
    replSetName: rep1
复制一份mongod.conf为mongod2.conf
修改里面的日志路径,数据路径(预先mkdir),端口27018,pid文件路径
/opt/mongo/bin/mongod -f /opt/mongod.conf
/opt/mongo/bin/mongod -f /opt/mongod2.conf
关闭后,Primary变为了Secondary。无法工作。
能够进行auto-failover,可正常工作。

1Primary 1Secondary 2*Arbiter
| Name | Port | Role(Experted) | 
|---|---|---|
| mongo-c1 | 27017 | Primary | 
| mongo-c1 | 37017 | Arbiter | 
| mongo-c2 | 47017 | Secondary | 
| mongo-c2 | 57017 | Arbiter | 
初始化命令:
rs.initiate({
    _id:"rep1",members:[
        {_id:1,host:"192.16.8.105:27017", priority:10},
        {_id:2,host:"192.16.8.105:37017", arbiterOnly:true},
        {_id:3,host:"192.16.8.105:47017", priority:5},
        {_id:4,host:"192.16.8.105:57017", arbiterOnly:true}
    ]
})
关闭一个Arbiter, 数据节点没有影响,可正常工作。
再关闭一个Arbiter,也就是关闭所有Arbiter, 数据节点全部变为Secondary,无法正常工作。
没有影响,可正常工作。
Primary变为Secondary.哪怕仍然有一个Arbiter存活,无法正常工作。
Secondary进行auto-failover。可正常工作。
在双机环境下,应该无法保证宕机时的HA。至少需要三机。


标签:命令 image mkdir host dock cond failover mongod 快速
原文地址:https://www.cnblogs.com/tung7/p/14878045.html