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
相关推荐
YOU OU17 小时前
Redis基础常识与命令
数据库·redis·缓存
Database_Cool_19 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森19 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
Database_Cool_20 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白21 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
窝子面21 小时前
手搓最简前后端协作-node
javascript·数据库
吳所畏惧21 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh
DFT计算杂谈21 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
HPFBoy21 小时前
log4net 数据库存日志正确配置
数据库