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
相关推荐
鸠摩智首席音效师15 分钟前
MySQL ERROR 1114 (HY000): The table is full
数据库·mysql
数据大魔方19 分钟前
【期货量化实战】豆粕期货量化交易策略(Python完整代码)
开发语言·数据库·python·算法·github·程序员创富
Codeking__39 分钟前
Redis的value类型介绍——zset
数据库·redis·缓存
muddjsv41 分钟前
SQLite3 核心命令全解析 (从入门到精通)
数据库
難釋懷1 小时前
认识NoSQL
数据库·nosql
亿坊电商1 小时前
利于SEO优化的CMS系统都有哪些特点?
前端·数据库
阿阿阿安1 小时前
MySQL(一)数据库风险操作场景总结
数据库·mysql
心丑姑娘1 小时前
使用ClickHouse时的劣质SQL样例
数据库·sql·clickhouse
什么都不会的Tristan1 小时前
redis篇
数据库·redis·缓存
only°夏至besos1 小时前
MySQL 运维实战:常见问题排查与解决方案
运维·数据库·mysql