mongodb升级、改单节点模式

目前我有三个节点的mongodb,A:主节点,B:此节点,C:投票节点,目前版本号为5.0.16,后续需要把C节点改为单节点mongodb,保留原来集群的数据,并升级到5.0.31版本。

升级版本

这部分较为顺利,直接通过这篇文章就升级完成了

投票节点改为副本节点

由于之前C节点设置了arbiterOnly参数,使得该节点仅能投票,而没有保存数据,所以需要先将该节点升级为副本节点

在主节点执行:

b 复制代码
rs0:PRIMARY> rs.remove("10.6.212.87:27017")
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1746699523, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1746699523, 1)
}

rs0:PRIMARY> rs.add({
...   host: "10.6.212.87:27017",
...   priority: 0,      // 表示不会成为 primary
...   votes: 1          // 正常参与投票
... })
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1746699594, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1746699594, 1)
}

rs0:PRIMARY> rs.status()
......
		{
			"_id" : 2,
			"name" : "10.6.212.87:27017",
			"health" : 1,
			"state" : 5,
			"stateStr" : "STARTUP2",
			"uptime" : 3,
			"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"),
			"lastAppliedWallTime" : ISODate("1970-01-01T00:00:00Z"),
			"lastDurableWallTime" : ISODate("1970-01-01T00:00:00Z"),
			"lastHeartbeat" : ISODate("2025-05-08T10:20:00.987Z"),
			"lastHeartbeatRecv" : ISODate("2025-05-08T10:20:00.043Z"),
			"pingMs" : NumberLong(17),
			"lastHeartbeatMessage" : "",
			"syncSourceHost" : "10.11.206.4:27017",
			"syncSourceId" : 0,
			"infoMessage" : "",
			"configVersion" : 4,
			"configTerm" : 201
		}
......

显示该节点"stateStr" : "STARTUP2",表示该节点正在同步数据,过一会就会变为"stateStr" : "SECONDARY",此时就完成升级为副本节点的工作。

改为单节点

将所有节点终止,再启动

yml 复制代码
version: "3.8"
services:
  mongo:
    container_name: mongo
    #image: mongo:5.0.16
    image: mongo:5.0.31
    expose:
      - 27017
    ports:
      - 27017:27017
    volumes:
      - mongo2:/data/db
    restart: always
    entrypoint:
      [
        "/usr/bin/mongod",
        "--bind_ip_all",
        "--journal"
      ]
    networks:
      - mongo

volumes:
  mongo2:
networks:
  mongo:
    name: mongo

设置账号密码

bash 复制代码
>>> docker exec -it mongo mongo
use admin
db.createUser({
  user: "admin",
  pwd: "your_password",
  roles: [ { role: "root", db: "admin" } ]
})
yaml 复制代码
version: "3.8"
services:
  mongo:
    container_name: mongo
    #image: mongo:5.0.16
    image: mongo:5.0.31
    expose:
      - 27017
    ports:
      - 27017:27017
    volumes:
      - mongo2:/data/db
    restart: always
    entrypoint:
      [
        "/usr/bin/mongod",
        "--bind_ip_all",
        "--journal",
        "--auth"
      ]
    networks:
      - mongo

volumes:
  mongo2:
networks:
  mongo:
    name: mongo
bash 复制代码
>>> docker compose down
>>> docker compose up -d
相关推荐
互联网中的一颗神经元1 天前
小白python入门 - 6. Python 分支结构——逻辑决策的核心机制
开发语言·数据库·python
数据库知识分享者小北1 天前
AI Agent的未来之争:任务规划,该由人主导还是AI自主?——阿里云RDS AI助手的最佳实践
数据库·阿里云·数据库rds
凸头1 天前
MySQL 的四种 Binlog 日志处理工具:Canal、Maxwell、Databus和 阿里云 DTS
数据库·mysql·阿里云
码界奇点1 天前
MongoDB 排序操作详解sort方法使用指南
数据库·mongodb·性能优化
武子康1 天前
Java-155 MongoDB Spring Boot 连接实战 | Template vs Repository(含索引与常见坑)
java·数据库·spring boot·后端·mongodb·系统架构·nosql
武子康1 天前
Java-157 MongoDB 存储引擎 WiredTiger vs InMemory:何时用、怎么配、如何验证 mongod.conf
java·数据库·sql·mongodb·性能优化·系统架构·nosql
野犬寒鸦1 天前
从零起步学习MySQL || 第八章:索引深入理解及高级运用(结合常见优化问题讲解)
java·服务器·数据库·后端·mysql
奥尔特星云大使1 天前
Docker 拉取 MySQL 5.7 镜像、启动容器并进入 MySQL
数据库·mysql·docker·容器
低音钢琴1 天前
【从零开始构建性能测试体系-08】如何诊断性能瓶颈:从服务器到数据库的全方位分析
服务器·数据库·php