Mongodb---副本及搭建(主从仲)

提示:文章是centos-8服务器搭建MongoDB4.0.10版本的MongoDB副本及一主一从一仲裁

文章目录


前言

MongoDB 的 副本集(Replica Set) 是 MongoDB 高可用性的一种实现方式。副本集由一组节点组成,这些节点通过同步数据确保数据冗余和故障恢复。副本集为数据库提供数据高可用性、容错能力和故障转移能力。

📚 副本集的核心概念:

1、Primary 节点(主节点):

副本集中的主节点负责接收写操作。
在任何时刻,副本集只能有一个主节点。
所有写操作都只能通过主节点进行,主节点会将数据同步到从节点。

2、Secondary 节点(从节点):

从节点是主节点的副本,存储主节点数据的备份。
从节点只进行读取操作,不能直接进行写入。
从节点通过复制主节点的操作日志(oplog)来同步数据。
如果主节点失败,从节点中的一个会被选举为新的主节点(自动故障转移)。

3、Arbiter(仲裁节点):

仲裁节点不存储数据,仅仅用于参与选举过程。
仲裁节点帮助副本集确定选举(即当发生主节点故障时,确定哪个从节点成为主节点)。
它没有数据存储,所以不会承担数据同步的责任。
仲裁节点通常在副本集成员数是偶数时添加,以确保选举时有足够的投票。

4、Oplog(操作日志):

主节点的每次写操作都会记录到操作日志(oplog)中,所有从节点会不断地从主节点的 oplog 中复制数据,从而保持数据同步。

5、Replication(复制):

每个副本集成员都保持一个操作日志(oplog),主节点的每次写操作都会首先记录在自己的 oplog 中,并将这些操作应用到从节点。

📝 副本集架构示意图:

在这里插入图片描述

✅ 副本集的优势:

1、高可用性:

副本集可以自动进行故障转移,如果主节点发生故障,副本集会自动选举出新的主节点,确保服务的持续运行。

2、数据冗余:

数据会被复制到多个节点上,避免了单点故障,提升数据安全性。

3、负载均衡:

读取操作可以从从节点中读取,减轻主节点的负担,提高系统的可伸缩性。

4、自动故障恢复:

如果主节点宕机,副本集会自动触发选举,选出新的主节点,从而确保系统的高可用性。

5、数据一致性:

副本集保证主节点和从节点的数据一致性,所有的数据变化首先会应用到主节点,然后同步到从节点。

MongoDB 副本集中有多个状态:

状态说明
PRIMARY主节点,可读写
SECONDARY从节点,只读
ARBITER仲裁节点
STARTUP第一次启动
STARTUP2正在加入 replica set
RECOVERING恢复中,不可读写
DOWN掉线
ROLLBACK回滚状态
OTHER既不是 PRIMARY,也不是 SECONDARY,也不是 ARBITER

👉 OTHER 常见于:副本集初始化失败、未加入、或配置不正确。


提示:以下是本篇文章正文内容,下面案例可供参考

一、环境需求

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

公网IP内网IP系统服务器规划环境服务
150.158.123.17172.17.48.74centos-8主节点PRIMARYmongodb-linux-x86_64-4.0.10.tgz
101.35.12.56172.17.48.61centos-8仲裁节点(只做选举不做数据存储)ARBITERmongodb-linux-x86_64-4.0.10.tgz
124.220.41.219172.17.48.34centos-8从节点SECONDARYmongodb-linux-x86_64-4.0.10.tgz

二、三台机器同时安装

2.1、下载压缩包

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.10.tgz

2.2、解压到指定路径

tar xvf mongodb-linux-x86_64-4.0.10.tgz -C /usr/local/

2.3、创建软连接

cd /usr/local/
ln -s mongodb-linux-x86_64-4.0.10 mongodb

2.4、进入路径创建目录

cd /usr/local/mongodb && mkdir config

2.5、配置主配置文件

cd config
vim mongodb-27017.conf
添加如下配置
bind_ip = 0.0.0.0   ##设置0.0.0.0是都可以连接如果想本机连接的话设置127.0.0.1
port = 27017        ##定义端口号
dbpath = /usr/local/mongodb/27017   ##数据存放路径
logpath = /usr/local/mongodb/mongodb_27017.log  ##日志存放路径
logappend = true   ##日志使用追加的方式
fork = true   ##以守护进程的方式运行MongoDB,创建服务器进程
auth = true  ##启用验证,true是启用验证false是不启用
directoryperdb = true  ## 设置每个数据库将被保存在一个单独的目录
storageEngine = wiredTiger
shardsvr=true   ##如果不添加这项,后续进行分片不成功
replSet = test  ##副本集名称一个副本集(主从仲)三台机器名称一样
#keyFile = /usr/local/mongodb/config/mongodb-keyfile  ##高版本不需要配置密钥

2.6、创建存储和日志路径

[root@VM-48-41-centos config]# mkdir -p /usr/local/mongodb/27017

2.7、创建命令软链接

[root@VM-48-41-centos config]# ln -s /usr/local/mongodb/bin/* /usr/local/bin/

2.8、启动、关闭mongdb

[root@VM-48-41-centos config]# mongod -f /usr/local/mongodb/config/mongodb-27017.conf
[root@VM-48-41-centos config]# mongod -f /usr/local/mongodb/config/mongodb-27017.conf --shutdown

三、以下操作在任意一台机器操作(本人在106.54.228.229机器上操作)

3.1、登录mongodb,创建副本集

[root@VM-48-74-centos config]# mongo --port 27017
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f474bf2f-e8de-4755-9d3d-a706e0a55f40") }
MongoDB server version: 4.0.10
Server has startup warnings: 
2025-11-14T16:06:33.144+0800 I STORAGE  [initandlisten] 
2025-11-14T16:06:33.144+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2025-11-14T16:06:33.144+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2025-11-14T16:06:33.355+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2025-11-14T16:06:33.355+0800 I CONTROL  [initandlisten] 
2025-11-14T16:06:33.355+0800 I CONTROL  [initandlisten] 
2025-11-14T16:06:33.355+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2025-11-14T16:06:33.355+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2025-11-14T16:06:33.355+0800 I CONTROL  [initandlisten] 
2025-11-14T16:06:33.355+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 6628 processes, 100001 files. Number of processes should be at least 50000.5 : 0.5 times number of files.
2025-11-14T16:06:33.355+0800 I CONTROL  [initandlisten] 
> config = {_id: "test", members: [] }   ##创建副本及
{ "_id" : "test", "members" : [ ] }
> config.members.push({_id: 0, host: "172.17.48.74:27017", "priority": 1})   ## 一定要注意三个 _id只能唯一,不能一样
1
> config.members.push({_id: 1, host: "172.17.48.61:27017", "priority": 1})
2
> config.members.push({_id: 2, host: "172.17.48.34:27017", "priority": 1})
3
> rs.initiate(config)
{
        "ok" : 1,
        "operationTime" : Timestamp(1763107708, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1763107708, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

注意:SECONDARY:为从节点、PRIMARY:为主节点、ARBITER:为仲裁节点

3.2、查看副本及状态

test:SECONDARY> 
test:PRIMARY> 
test:PRIMARY>  rs.status()
{
        "set" : "test",
        "date" : ISODate("2025-11-14T08:10:21.107Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1763107820, 1),
                        "t" : NumberLong(1)
                },
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1763107820, 1),
                        "t" : NumberLong(1)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1763107820, 1),
                        "t" : NumberLong(1)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1763107820, 1),
                        "t" : NumberLong(1)
                }
        },
        "lastStableCheckpointTimestamp" : Timestamp(1763107780, 1),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "172.17.48.74:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",     ## 可以看出172.17.48.74这台机器是主节点
                        "uptime" : 228,
                        "optime" : {
                                "ts" : Timestamp(1763107820, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2025-11-14T08:10:20Z"),
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "could not find member to sync from",
                        "electionTime" : Timestamp(1763107719, 1),
                        "electionDate" : ISODate("2025-11-14T08:08:39Z"),
                        "configVersion" : 1,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                },
                {
                        "_id" : 1,
                        "name" : "172.17.48.61:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",    ## 可以看出172.17.48.61这台机器是从节点
                        "uptime" : 112,
                        "optime" : {
                                "ts" : Timestamp(1763107810, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1763107810, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2025-11-14T08:10:10Z"),
                        "optimeDurableDate" : ISODate("2025-11-14T08:10:10Z"),
                        "lastHeartbeat" : ISODate("2025-11-14T08:10:19.220Z"),
                        "lastHeartbeatRecv" : ISODate("2025-11-14T08:10:19.185Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "172.17.48.74:27017",
                        "syncSourceHost" : "172.17.48.74:27017",
                        "syncSourceId" : 0,
                        "infoMessage" : "",
                        "configVersion" : 1
                },
                {
                        "_id" : 2,
                        "name" : "172.17.48.34:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",    ## 可以看出172.17.48.34这台机器是从节点
                        "uptime" : 112,
                        "optime" : {
                                "ts" : Timestamp(1763107810, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1763107810, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2025-11-14T08:10:10Z"),
                        "optimeDurableDate" : ISODate("2025-11-14T08:10:10Z"),
                        "lastHeartbeat" : ISODate("2025-11-14T08:10:19.219Z"),
                        "lastHeartbeatRecv" : ISODate("2025-11-14T08:10:20.144Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "172.17.48.61:27017",
                        "syncSourceHost" : "172.17.48.61:27017",
                        "syncSourceId" : 1,
                        "infoMessage" : "",
                        "configVersion" : 1
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1763107820, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1763107820, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

注意:从以上的状态可以看出,10.10.1.3是主节点,10.10.1.5和10.10.1.6是从节点,为此我们需要做的是一主一从一仲裁步骤如下:
注意:在高版本以后 3.x 或 4.x 需要提前创建账号才能使用 rs.add()

四、创建账号密码

4.1、以下结果在主节点上操作:

test:PRIMARY> use admin
switched to db admin
test:PRIMARY> db.createUser({user:"root",pwd:"root",roles:[{role:"root",db:"admin"}]});
Successfully added user: {
        "user" : "root",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}

4.2、增加节点->primary 执行(先验证账号密码)。

test:PRIMARY> use admin
switched to db admin
test:PRIMARY> db.auth('root','root')
1

注意:查看后会有两个从节点选一台服务做仲裁点在添加仲裁节点之前必须要先进入admin下,具体操作如下:

五、创建仲裁节点

注意:在主节点下操作进入admin后执行

5.1、删除从裁点

test:PRIMARY> rs.remove("172.17.48.61:27017")
{
        "ok" : 1,
        "operationTime" : Timestamp(1763108229, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1763108229, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

5.2、添加仲裁点

test:PRIMARY> rs.addArb("172.17.48.61:27017") 
{
        "ok" : 1,
        "operationTime" : Timestamp(1763108440, 2),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1763108440, 2),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

5.3、再次查看状态

test:PRIMARY> rs.status()
{
        "set" : "test",
        "date" : ISODate("2025-11-14T08:27:30.420Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1763108840, 1),
                        "t" : NumberLong(1)
                },
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1763108840, 1),
                        "t" : NumberLong(1)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1763108840, 1),
                        "t" : NumberLong(1)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1763108840, 1),
                        "t" : NumberLong(1)
                }
        },
        "lastStableCheckpointTimestamp" : Timestamp(1763108800, 1),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "172.17.48.74:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 1257,
                        "optime" : {
                                "ts" : Timestamp(1763108840, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2025-11-14T08:27:20Z"),
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "electionTime" : Timestamp(1763107719, 1),
                        "electionDate" : ISODate("2025-11-14T08:08:39Z"),
                        "configVersion" : 3,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                },
                {
                        "_id" : 2,
                        "name" : "172.17.48.34:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 1141,
                        "optime" : {
                                "ts" : Timestamp(1763108840, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1763108840, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2025-11-14T08:27:20Z"),
                        "optimeDurableDate" : ISODate("2025-11-14T08:27:20Z"),
                        "lastHeartbeat" : ISODate("2025-11-14T08:27:28.860Z"),
                        "lastHeartbeatRecv" : ISODate("2025-11-14T08:27:28.862Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "172.17.48.74:27017",
                        "syncSourceHost" : "172.17.48.74:27017",
                        "syncSourceId" : 0,
                        "infoMessage" : "",
                        "configVersion" : 3
                },
                {
                        "_id" : 3,
                        "name" : "172.17.48.61:27017",
                        "health" : 0,
                        "state" : 8,
                        "stateStr" : "(not reachable/healthy)",    ##出现报错(无法到达/正常)
                        "uptime" : 0,
                        "lastHeartbeat" : ISODate("2025-11-14T08:27:29.955Z"),
                        "lastHeartbeatRecv" : ISODate("2025-11-14T08:20:40.865Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "Error connecting to 172.17.48.61:27017 :: caused by :: Connection refused",
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "configVersion" : -1
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1763108840, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1763108840, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}
不用担心此时不要慌退出mongodb执行以下命令
注意:先关闭在重启先重启主节点在重启添加仲裁节点,也可以先登录mongodb如果出现以下提示,直接启动
在101.35.12.56机器上操作:
[root@VM-48-61-centos config]# mongod -f /usr/local/mongodb/config/mongodb-27017.conf
about to fork child process, waiting until server is ready for connections.
forked process: 23224
child process started successfully, parent exiting
[root@VM-48-61-centos config]# mongo --port 27017
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("3ac76d4f-315c-49a9-8ea2-15fc106c075a") }
MongoDB server version: 4.0.10
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
Server has startup warnings: 
2025-11-14T16:30:32.498+0800 I STORAGE  [initandlisten] 
2025-11-14T16:30:32.498+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2025-11-14T16:30:32.498+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2025-11-14T16:30:32.704+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2025-11-14T16:30:32.704+0800 I CONTROL  [initandlisten] 
2025-11-14T16:30:32.704+0800 I CONTROL  [initandlisten] 
2025-11-14T16:30:32.704+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2025-11-14T16:30:32.704+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2025-11-14T16:30:32.704+0800 I CONTROL  [initandlisten] 
2025-11-14T16:30:32.704+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 6628 processes, 100001 files. Number of processes should be at least 50000.5 : 0.5 times number of files.
2025-11-14T16:30:32.704+0800 I CONTROL  [initandlisten] 
2025-11-14T16:30:32.717+0800 I REPL     [replexec-0] 
2025-11-14T16:30:32.717+0800 I REPL     [replexec-0] ** WARNING: This replica set uses arbiters, but readConcern:majority is enabled 
2025-11-14T16:30:32.717+0800 I REPL     [replexec-0] **          for this node. This is not a recommended configuration. Please see 
2025-11-14T16:30:32.717+0800 I REPL     [replexec-0] **          https://dochub.mongodb.org/core/psa-disable-rc-majority-4.0
2025-11-14T16:30:32.717+0800 I REPL     [replexec-0] 
test:ARBITER> 
可以看出变成了仲裁节点

5.4、150.158.123.17主节点查看状态

test:PRIMARY> rs.status()
{
        "set" : "test",
        "date" : ISODate("2025-11-14T08:32:45.607Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1763109160, 1),
                        "t" : NumberLong(1)
                },
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1763109160, 1),
                        "t" : NumberLong(1)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1763109160, 1),
                        "t" : NumberLong(1)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1763109160, 1),
                        "t" : NumberLong(1)
                }
        },
        "lastStableCheckpointTimestamp" : Timestamp(1763109160, 1),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "172.17.48.74:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",     ## 主节点
                        "uptime" : 1572,
                        "optime" : {
                                "ts" : Timestamp(1763109160, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2025-11-14T08:32:40Z"),
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "electionTime" : Timestamp(1763107719, 1),
                        "electionDate" : ISODate("2025-11-14T08:08:39Z"),
                        "configVersion" : 3,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                },
                {
                        "_id" : 2,
                        "name" : "172.17.48.34:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",    ## 从节点
                        "uptime" : 1456,
                        "optime" : {
                                "ts" : Timestamp(1763109160, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1763109160, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2025-11-14T08:32:40Z"),
                        "optimeDurableDate" : ISODate("2025-11-14T08:32:40Z"),
                        "lastHeartbeat" : ISODate("2025-11-14T08:32:44.860Z"),
                        "lastHeartbeatRecv" : ISODate("2025-11-14T08:32:44.862Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "172.17.48.74:27017",
                        "syncSourceHost" : "172.17.48.74:27017",
                        "syncSourceId" : 0,
                        "infoMessage" : "",
                        "configVersion" : 3
                },
                {
                        "_id" : 3,
                        "name" : "172.17.48.61:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",      ## 仲裁节点
                        "uptime" : 131,
                        "lastHeartbeat" : ISODate("2025-11-14T08:32:44.007Z"),
                        "lastHeartbeatRecv" : ISODate("2025-11-14T08:32:44.719Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "configVersion" : 3
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1763109160, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1763109160, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

六、验证主从宕机,101.35.12.56机器是否选举124.220.41.219作为主

6.1、在150.158.123.17机器主节点操作

[root@VM-48-74-centos config]#  mongod -f /usr/local/mongodb/config/mongodb-27017.conf --shutdown
killing process with pid: 13376

6.2、在124.220.41.219机器上操作,查看集群状态

[root@VM-48-34-centos config]# mongo --port 27017
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("7fedca55-0386-4105-807a-778da3bdf525") }
MongoDB server version: 4.0.10
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
Server has startup warnings: 
2025-11-14T16:06:40.386+0800 I STORAGE  [initandlisten] 
2025-11-14T16:06:40.386+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2025-11-14T16:06:40.386+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2025-11-14T16:06:40.593+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2025-11-14T16:06:40.593+0800 I CONTROL  [initandlisten] 
2025-11-14T16:06:40.593+0800 I CONTROL  [initandlisten] 
2025-11-14T16:06:40.593+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2025-11-14T16:06:40.593+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2025-11-14T16:06:40.593+0800 I CONTROL  [initandlisten] 
2025-11-14T16:06:40.593+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 6628 processes, 100001 files. Number of processes should be at least 50000.5 : 0.5 times number of files.
2025-11-14T16:06:40.593+0800 I CONTROL  [initandlisten] 
test:PRIMARY>  rs.status()   ##其实在你登录之后就可以看出已经是主节点了(test:PRIMARY)
{
        "set" : "test",
        "date" : ISODate("2025-11-14T08:37:40.151Z"),
        "myState" : 1,
        "term" : NumberLong(3),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1763109360, 1),
                        "t" : NumberLong(1)
                },
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1763109360, 1),
                        "t" : NumberLong(1)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1763109455, 1),
                        "t" : NumberLong(3)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1763109455, 1),
                        "t" : NumberLong(3)
                }
        },
        "lastStableCheckpointTimestamp" : Timestamp(1763109360, 1),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "172.17.48.74:27017",
                        "health" : 0,
                        "state" : 8,
                        "stateStr" : "(not reachable/healthy)",    ##已经宕机了
                        "uptime" : 0,
                        "optime" : {
                                "ts" : Timestamp(0, 0),
                                "t" : NumberLong(-1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(0, 0),
                                "t" : NumberLong(-1)
                        },
                        "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                        "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
                        "lastHeartbeat" : ISODate("2025-11-14T08:37:38.558Z"),
                        "lastHeartbeatRecv" : ISODate("2025-11-14T08:36:02.860Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "Error connecting to 172.17.48.74:27017 :: caused by :: Connection refused",
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "configVersion" : -1
                },
                {
                        "_id" : 2,
                        "name" : "172.17.48.34:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",   ## 变成主节点
                        "uptime" : 1860,
                        "optime" : {
                                "ts" : Timestamp(1763109455, 1),
                                "t" : NumberLong(3)
                        },
                        "optimeDate" : ISODate("2025-11-14T08:37:35Z"),
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "could not find member to sync from",
                        "electionTime" : Timestamp(1763109374, 1),
                        "electionDate" : ISODate("2025-11-14T08:36:14Z"),
                        "configVersion" : 3,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                },
                {
                        "_id" : 3,
                        "name" : "172.17.48.61:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",    
                        "uptime" : 426,
                        "lastHeartbeat" : ISODate("2025-11-14T08:37:38.553Z"),
                        "lastHeartbeatRecv" : ISODate("2025-11-14T08:37:38.718Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "configVersion" : 3
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1763109455, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1763109455, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

6.3、在回到150.158.123.17机器上模拟故障解决

[root@VM-48-74-centos config]#  mongod -f /usr/local/mongodb/config/mongodb-27017.conf
about to fork child process, waiting until server is ready for connections.
forked process: 25469
child process started successfully, parent exiting

6.4、再次回到124.220.41.219机器查看集群状态

test:PRIMARY> rs.status()
{
        "set" : "test",
        "date" : ISODate("2025-11-14T08:40:27.321Z"),
        "myState" : 1,
        "term" : NumberLong(3),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1763109625, 1),
                        "t" : NumberLong(3)
                },
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1763109625, 1),
                        "t" : NumberLong(3)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1763109625, 1),
                        "t" : NumberLong(3)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1763109625, 1),
                        "t" : NumberLong(3)
                }
        },
        "lastStableCheckpointTimestamp" : Timestamp(1763109585, 1),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "172.17.48.74:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",    ##看出172.17.48.74机器之前是主故障恢复后变成从了
                        "uptime" : 56,
                        "optime" : {
                                "ts" : Timestamp(1763109625, 1),
                                "t" : NumberLong(3)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1763109625, 1),
                                "t" : NumberLong(3)
                        },
                        "optimeDate" : ISODate("2025-11-14T08:40:25Z"),
                        "optimeDurableDate" : ISODate("2025-11-14T08:40:25Z"),
                        "lastHeartbeat" : ISODate("2025-11-14T08:40:26.561Z"),
                        "lastHeartbeatRecv" : ISODate("2025-11-14T08:40:26.811Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "172.17.48.34:27017",
                        "syncSourceHost" : "172.17.48.34:27017",
                        "syncSourceId" : 2,
                        "infoMessage" : "",
                        "configVersion" : 3
                },
                {
                        "_id" : 2,
                        "name" : "172.17.48.34:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",    ## 可以看出172.17.48.34是主
                        "uptime" : 2027,
                        "optime" : {
                                "ts" : Timestamp(1763109625, 1),
                                "t" : NumberLong(3)
                        },
                        "optimeDate" : ISODate("2025-11-14T08:40:25Z"),
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "electionTime" : Timestamp(1763109374, 1),
                        "electionDate" : ISODate("2025-11-14T08:36:14Z"),
                        "configVersion" : 3,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                },
                {
                        "_id" : 3,
                        "name" : "172.17.48.61:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",
                        "uptime" : 593,
                        "lastHeartbeat" : ISODate("2025-11-14T08:40:26.553Z"),
                        "lastHeartbeatRecv" : ISODate("2025-11-14T08:40:26.718Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "configVersion" : 3
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1763109625, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1763109625, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

由以上得出结论:在主宕机之后会选举从未主节点,但是之前的主当即后回复,不会再变成主,而是从。

七、开启账号密码认证(可选)因为本人在4.2章节创建了

7.1、三台机器关闭

mongod -f /usr/local/mongodb/config/mongodb-27017.conf --shutdown

7.2、因为之前的主配置文件里面有一个修改三台机器

vim mongodb-27017.conf
添加如下配置
bind_ip = 0.0.0.0
port = 27017
dbpath = /usr/local/mongodb/27017
logpath = /usr/local/mongodb/mongodb_27017.log
logappend = true
fork = true
auth = false ##将false 变为true
directoryperdb = true
storageEngine = wiredTiger
shardsvr=true
replSet = test
keyFile = /usr/local/mongodb/config/mongodb-keyfile  ##去掉注释

7.3、配置mongodb-keyfile 秘钥,在150.158.123.17机器主节点上操作

[root@VM-48-74-centos config]# openssl rand -base64 756 > /usr/local/mongodb/config/mongodb-keyfile
[root@VM-48-74-centos config]# chmod 600 /usr/local/mongodb/config/mongodb-keyfile
[root@VM-48-74-centos config]# scp /usr/local/mongodb/config/mongodb-keyfile root@172.17.48.61:/usr/lo
cal/mongodb/config/
[root@VM-48-74-centos config]# scp /usr/local/mongodb/config/mongodb-keyfile root@172.17.48.34:/usr/lo
cal/mongodb/config/

7.4、101.35.12.56和124.220.41.219机器上操作

chmod 600 /usr/local/mongodb/config/mongodb-keyfile

7.5、三台机器启动

mongod -f /usr/local/mongodb/config/mongodb-27017.conf

7.6、三台机器登录查看状态

登录mongodb
mongo --port 27017 -u root -p root --authenticationDatabase admin

注意:进入后你才能看到 PRIMARY / SECONDARY,否则只能进入 OTHER。

7.6.1、150.158.123.17机器查看

[root@VM-48-74-centos config]# mongo --port 27017 -u root -p root --authenticationDatabase admin
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?authSource=admin&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("a08b6689-af02-4f03-92d3-ef9137ca19d4") }
MongoDB server version: 4.0.10
Server has startup warnings: 
2025-11-14T17:44:28.804+0800 I STORAGE  [initandlisten] 
2025-11-14T17:44:28.804+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2025-11-14T17:44:28.804+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2025-11-14T17:44:28.923+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2025-11-14T17:44:28.923+0800 I CONTROL  [initandlisten] 
2025-11-14T17:44:28.923+0800 I CONTROL  [initandlisten] 
2025-11-14T17:44:28.923+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2025-11-14T17:44:28.923+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2025-11-14T17:44:28.923+0800 I CONTROL  [initandlisten] 
2025-11-14T17:44:28.923+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 6628 processes, 100001 files. Number of processes should be at least 50000.5 : 0.5 times number of files.
2025-11-14T17:44:28.923+0800 I CONTROL  [initandlisten] 
test:PRIMARY>  ## 主节点

7.6.2、101.35.12.56机器查看

[root@VM-48-61-centos config]# mongo --port 27017 -u root -p root --authenticationDatabase admin
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?authSource=admin&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("2fd829e9-6ba8-436d-b62d-eba6d53ee1b2") }
MongoDB server version: 4.0.10
Server has startup warnings: 
2025-11-14T17:23:46.211+0800 I STORAGE  [initandlisten] 
2025-11-14T17:23:46.211+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2025-11-14T17:23:46.211+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2025-11-14T17:23:46.451+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2025-11-14T17:23:46.451+0800 I CONTROL  [initandlisten] 
2025-11-14T17:23:46.451+0800 I CONTROL  [initandlisten] 
2025-11-14T17:23:46.451+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2025-11-14T17:23:46.451+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2025-11-14T17:23:46.451+0800 I CONTROL  [initandlisten] 
2025-11-14T17:23:46.451+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 6628 processes, 100001 files. Number of processes should be at least 50000.5 : 0.5 times number of files.
2025-11-14T17:23:46.451+0800 I CONTROL  [initandlisten] 
2025-11-14T17:23:46.483+0800 I REPL     [replexec-0] 
2025-11-14T17:23:46.483+0800 I REPL     [replexec-0] ** WARNING: This replica set uses arbiters, but readConcern:majority is enabled 
2025-11-14T17:23:46.483+0800 I REPL     [replexec-0] **          for this node. This is not a recommended configuration. Please see 
2025-11-14T17:23:46.483+0800 I REPL     [replexec-0] **          https://dochub.mongodb.org/core/psa-disable-rc-majority-4.0
2025-11-14T17:23:46.483+0800 I REPL     [replexec-0] 
test:ARBITER>   ##仲裁节点

7.6.3、124.220.41.219机器查看

[root@VM-48-34-centos config]# mongo --port 27017 -u root -p root --authenticationDatabase admin
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?authSource=admin&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f43052f1-8de3-489a-a74c-69fe7e7fab86") }
MongoDB server version: 4.0.10
Server has startup warnings: 
2025-11-14T17:45:53.925+0800 I STORAGE  [initandlisten] 
2025-11-14T17:45:53.925+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2025-11-14T17:45:53.925+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2025-11-14T17:45:54.161+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2025-11-14T17:45:54.161+0800 I CONTROL  [initandlisten] 
2025-11-14T17:45:54.161+0800 I CONTROL  [initandlisten] 
2025-11-14T17:45:54.161+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2025-11-14T17:45:54.161+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2025-11-14T17:45:54.161+0800 I CONTROL  [initandlisten] 
2025-11-14T17:45:54.161+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 6628 processes, 100001 files. Number of processes should be at least 50000.5 : 0.5 times number of files.
2025-11-14T17:45:54.161+0800 I CONTROL  [initandlisten] 
2025-11-14T17:45:54.195+0800 I REPL     [replexec-0] 
2025-11-14T17:45:54.195+0800 I REPL     [replexec-0] ** WARNING: This replica set uses arbiters, but readConcern:majority is enabled 
2025-11-14T17:45:54.195+0800 I REPL     [replexec-0] **          for this node. This is not a recommended configuration. Please see 
2025-11-14T17:45:54.195+0800 I REPL     [replexec-0] **          https://dochub.mongodb.org/core/psa-disable-rc-majority-4.0
2025-11-14T17:45:54.195+0800 I REPL     [replexec-0] 
test:SECONDARY>    ##从节点

总结

MongoDB 副本集是高可用性架构的核心组件,能够提供数据冗余、容错和自动故障转移能力。通过设置主节点、从节点和仲裁节点,可以保证数据的高可用性并实现数据自动同步。

副本集非常适合需要高可用性的生产环境,特别是当需要确保系统在单个节点发生故障时仍然能继续运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值