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
相关推荐
睡不醒男孩0308231 小时前
第七篇:揭秘 PostgreSQL 数据库内核级管控:CLup 深度架构设计与高可用底座技术白皮书
数据库·postgresql·clup
cmes_love2 小时前
Level 2逐笔成交历史数据下载方法笔记
数据库·笔记·oracle
swordbob2 小时前
MySQL字符集陷阱:从Oracle迁移踩坑到utf8mb4强制规范
数据库·sql
牛油果子哥q3 小时前
【C++ STL string 】C++ STL string 终极精讲:底层原理、内存机制、全套API、深浅拷贝、易错坑点与工程实战规范
数据库·c++
十五年专注C++开发3 小时前
MySql中各种功能用sql语句实现总结
数据库·sql·mysql
数据库小学妹3 小时前
AI时代数据库怎么选?多模融合、数据统一存储与选型实战指南
数据库·人工智能·经验分享·ai
Albert Edison3 小时前
【Redis】Centos7.9 安装 Redis 5 教程
数据库·redis·缓存
云计算磊哥@3 小时前
运维开发宝典026-MySQL02数据库表操作
运维·数据库·运维开发
小二·4 小时前
Redis 内存溢出(OOM)排查与恢复实战
数据库·redis·bootstrap
pqk6V6Vep4 小时前
Redis 分布式锁进阶第一篇讲解
数据库·redis·分布式