MongoDB 4.2副本集添加/删除副本(一主一副一仲裁)

一、修改/etc/hosts

172.16.254.131 mongo1
172.16.254.132 mongo2
172.16.254.133 mongo3
172.16.254.134 mongo4

二、添加副本

172.16.254.131

handong1:PRIMARY> rs.add("mongo4:27017")
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1616077141, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1616077141, 1)
}

查看副本集信息:

handong1:PRIMARY> rs.status()
{
	"set" : "handong1",
	"date" : ISODate("2021-03-18T14:19:08.014Z"),
	"myState" : 1,
	"term" : NumberLong(6),
	"syncingTo" : "",
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"majorityVoteCount" : 3,
	"writeMajorityCount" : 3,
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1616077141, 1),
			"t" : NumberLong(6)
		},
		"lastCommittedWallTime" : ISODate("2021-03-18T14:19:01.368Z"),
		"readConcernMajorityOpTime" : {
			"ts" : Timestamp(1616077141, 1),
			"t" : NumberLong(6)
		},
		"readConcernMajorityWallTime" : ISODate("2021-03-18T14:19:01.368Z"),
		"appliedOpTime" : {
			"ts" : Timestamp(1616077141, 1),
			"t" : NumberLong(6)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1616077141, 1),
			"t" : NumberLong(6)
		},
		"lastAppliedWallTime" : ISODate("2021-03-18T14:19:01.368Z"),
		"lastDurableWallTime" : ISODate("2021-03-18T14:19:01.368Z")
	},
	"lastStableRecoveryTimestamp" : Timestamp(1616077095, 1),
	"lastStableCheckpointTimestamp" : Timestamp(1616077095, 1),
	"electionCandidateMetrics" : {
		"lastElectionReason" : "priorityTakeover",
		"lastElectionDate" : ISODate("2021-03-18T13:34:33.453Z"),
		"electionTerm" : NumberLong(6),
		"lastCommittedOpTimeAtElection" : {
			"ts" : Timestamp(1616074466, 1),
			"t" : NumberLong(5)
		},
		"lastSeenOpTimeAtElection" : {
			"ts" : Timestamp(1616074466, 1),
			"t" : NumberLong(5)
		},
		"numVotesNeeded" : 2,
		"priorityAtElection" : 2,
		"electionTimeoutMillis" : NumberLong(10000),
		"priorPrimaryMemberId" : 1,
		"numCatchUpOps" : NumberLong(0),
		"newTermStartDate" : ISODate("2021-03-18T13:34:33.518Z"),
		"wMajorityWriteAvailabilityDate" : ISODate("2021-03-18T13:34:34.476Z")
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "172.16.254.131:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 2690,
			"optime" : {
				"ts" : Timestamp(1616077141, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2021-03-18T14:19:01Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1616074473, 1),
			"electionDate" : ISODate("2021-03-18T13:34:33Z"),
			"configVersion" : 7,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 1,
			"name" : "mongo2:27017",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 2686,
			"optime" : {
				"ts" : Timestamp(1616077141, 1),
				"t" : NumberLong(6)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1616077141, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2021-03-18T14:19:01Z"),
			"optimeDurableDate" : ISODate("2021-03-18T14:19:01Z"),
			"lastHeartbeat" : ISODate("2021-03-18T14:19:07.382Z"),
			"lastHeartbeatRecv" : ISODate("2021-03-18T14:19:07.541Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : 7
		},
		{
			"_id" : 2,
			"name" : "mongo3:27017",
			"health" : 1,
			"state" : 7,
			"stateStr" : "ARBITER",
			"uptime" : 2686,
			"lastHeartbeat" : ISODate("2021-03-18T14:19:07.382Z"),
			"lastHeartbeatRecv" : ISODate("2021-03-18T14:19:07.389Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : 7
		},
		{
			"_id" : 3,
			"name" : "mongo4:27017",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 4,
			"optime" : {
				"ts" : Timestamp(1616077141, 1),
				"t" : NumberLong(6)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1616077141, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2021-03-18T14:19:01Z"),
			"optimeDurableDate" : ISODate("2021-03-18T14:19:01Z"),
			"lastHeartbeat" : ISODate("2021-03-18T14:19:07.382Z"),
			"lastHeartbeatRecv" : ISODate("2021-03-18T14:19:07.680Z"),
			"pingMs" : NumberLong(1),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : 7
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1616077141, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1616077141, 1)
}

可以看到mongo4已经变成了primary的副本。

三、测试副本集

primary插入测试数据:

handong1:PRIMARY> use db3
switched to db db3
handong1:PRIMARY> db.db3.inesrt({"age":"23"})
handong1:PRIMARY> db.db3.find()
{ "_id" : ObjectId("6051d08ac74d627f4b561349"), "name" : "mongodb" }
{ "_id" : ObjectId("6053225bdebdeda2639f026e"), "name" : "mongodb4.2" }
{ "_id" : ObjectId("60533d88504b2400d4ae3091"), "name" : "jianghe" }
{ "_id" : ObjectId("60534e662b429cdfe156324a"), "name" : "dandan" }
{ "_id" : ObjectId("605359a1ab6994b3520da444"), "name" : "doudou" }
{ "_id" : ObjectId("605368ffab6994b3520da445"), "age" : "23" }

在副本查看数据:

172.16.254.132

handong1:SECONDARY> use db3
switched to db db3
handong1:SECONDARY> db.db3.find()
{ "_id" : ObjectId("6051d08ac74d627f4b561349"), "name" : "mongodb" }
{ "_id" : ObjectId("6053225bdebdeda2639f026e"), "name" : "mongodb4.2" }
{ "_id" : ObjectId("60533d88504b2400d4ae3091"), "name" : "jianghe" }
{ "_id" : ObjectId("60534e662b429cdfe156324a"), "name" : "dandan" }
{ "_id" : ObjectId("605359a1ab6994b3520da444"), "name" : "doudou" }
{ "_id" : ObjectId("605368ffab6994b3520da445"), "age" : "23" }

172.16.254.134

handong1:SECONDARY> use db3
switched to db db3
handong1:SECONDARY> db.db3.find()
{ "_id" : ObjectId("6051d08ac74d627f4b561349"), "name" : "mongodb" }
{ "_id" : ObjectId("6053225bdebdeda2639f026e"), "name" : "mongodb4.2" }
{ "_id" : ObjectId("60533d88504b2400d4ae3091"), "name" : "jianghe" }
{ "_id" : ObjectId("605359a1ab6994b3520da444"), "name" : "doudou" }
{ "_id" : ObjectId("60534e662b429cdfe156324a"), "name" : "dandan" }
{ "_id" : ObjectId("605368ffab6994b3520da445"), "age" : "23" }

可以看到两个副本节点数据都已经同步。

四、删除副本

primary

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

查看副本集信息

handong1:PRIMARY> rs.status()
{
	"set" : "handong1",
	"date" : ISODate("2021-03-18T14:58:45.070Z"),
	"myState" : 1,
	"term" : NumberLong(6),
	"syncingTo" : "",
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"majorityVoteCount" : 2,
	"writeMajorityCount" : 2,
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1616079517, 1),
			"t" : NumberLong(6)
		},
		"lastCommittedWallTime" : ISODate("2021-03-18T14:58:37.438Z"),
		"readConcernMajorityOpTime" : {
			"ts" : Timestamp(1616079517, 1),
			"t" : NumberLong(6)
		},
		"readConcernMajorityWallTime" : ISODate("2021-03-18T14:58:37.438Z"),
		"appliedOpTime" : {
			"ts" : Timestamp(1616079517, 1),
			"t" : NumberLong(6)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1616079517, 1),
			"t" : NumberLong(6)
		},
		"lastAppliedWallTime" : ISODate("2021-03-18T14:58:37.438Z"),
		"lastDurableWallTime" : ISODate("2021-03-18T14:58:37.438Z")
	},
	"lastStableRecoveryTimestamp" : Timestamp(1616079507, 1),
	"lastStableCheckpointTimestamp" : Timestamp(1616079507, 1),
	"electionCandidateMetrics" : {
		"lastElectionReason" : "priorityTakeover",
		"lastElectionDate" : ISODate("2021-03-18T13:34:33.453Z"),
		"electionTerm" : NumberLong(6),
		"lastCommittedOpTimeAtElection" : {
			"ts" : Timestamp(1616074466, 1),
			"t" : NumberLong(5)
		},
		"lastSeenOpTimeAtElection" : {
			"ts" : Timestamp(1616074466, 1),
			"t" : NumberLong(5)
		},
		"numVotesNeeded" : 2,
		"priorityAtElection" : 2,
		"electionTimeoutMillis" : NumberLong(10000),
		"priorPrimaryMemberId" : 1,
		"numCatchUpOps" : NumberLong(0),
		"newTermStartDate" : ISODate("2021-03-18T13:34:33.518Z"),
		"wMajorityWriteAvailabilityDate" : ISODate("2021-03-18T13:34:34.476Z")
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "172.16.254.131:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 5067,
			"optime" : {
				"ts" : Timestamp(1616079517, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2021-03-18T14:58:37Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1616074473, 1),
			"electionDate" : ISODate("2021-03-18T13:34:33Z"),
			"configVersion" : 8,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 1,
			"name" : "mongo2:27017",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 5063,
			"optime" : {
				"ts" : Timestamp(1616079517, 1),
				"t" : NumberLong(6)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1616079517, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2021-03-18T14:58:37Z"),
			"optimeDurableDate" : ISODate("2021-03-18T14:58:37Z"),
			"lastHeartbeat" : ISODate("2021-03-18T14:58:44.264Z"),
			"lastHeartbeatRecv" : ISODate("2021-03-18T14:58:44.595Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "172.16.254.131:27017",
			"syncSourceHost" : "172.16.254.131:27017",
			"syncSourceId" : 0,
			"infoMessage" : "",
			"configVersion" : 8
		},
		{
			"_id" : 2,
			"name" : "mongo3:27017",
			"health" : 1,
			"state" : 7,
			"stateStr" : "ARBITER",
			"uptime" : 5063,
			"lastHeartbeat" : ISODate("2021-03-18T14:58:44.266Z"),
			"lastHeartbeatRecv" : ISODate("2021-03-18T14:58:44.263Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : 8
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1616079517, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1616079517, 1)
}

可以看到刚才加入的副本成员mongo4已经删除。

### 配置和运行 MongoDB 4.2 副本使用 Docker Compose 要通过 `docker-compose` 配置并运行 MongoDB 4.2副本,可以按照以下方法完成。以下是完整的配置过程以及注意事项。 #### 1. 创建 `keyFile` 为了确保节点之间的安全通信,需要生成个密钥文件用于身份验证。可以通过以下命令生成: ```bash openssl rand -base64 756 > mongodb-keyfile chmod 400 mongodb-keyfile ``` 此命令生成了个名为 `mongodb-keyfile` 的密钥文件,并将其权限设置为仅允许当前用户读取[^1]。 #### 2. 编写 `docker-compose.yml` 文件 下面是个适用于 MongoDB 4.2 副本的 `docker-compose.yml` 文件示例: ```yaml version: '3.8' services: mongo-primary: image: mongo:4.2 container_name: mongo-primary hostname: mongo-primary volumes: - ./data/primary:/data/db - ./mongodb-keyfile:/etc/mongodb-keyfile environment: - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=password command: mongod --replSet rs0 --bind_ip_all --keyFile /etc/mongodb-keyfile ports: - 27017:27017 restart: always mongo-secondary1: image: mongo:4.2 container_name: mongo-secondary1 hostname: mongo-secondary1 volumes: - ./data/secondary1:/data/db - ./mongodb-keyfile:/etc/mongodb-keyfile environment: - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=password command: mongod --replSet rs0 --bind_ip_all --keyFile /etc/mongodb-keyfile expose: - 27017 restart: always mongo-secondary2: image: mongo:4.2 container_name: mongo-secondary2 hostname: mongo-secondary2 volumes: - ./data/secondary2:/data/db - ./mongodb-keyfile:/etc/mongodb-keyfile environment: - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=password command: mongod --replSet rs0 --bind_ip_all --keyFile /etc/mongodb-keyfile expose: - 27017 restart: always ``` 在此配置中: - 定义了三个服务:`mongo-primary`, `mongo-secondary1`, 和 `mongo-secondary2`。 - 每个服务都绑定了本地磁盘上的数据目录 `/data/[node-name]/` 并挂载了之前生成的 `mongodb-keyfile` 密钥文件。 - 设置了环境变量来定义管理员用户名和密码。 - 使用 `--replSet rs0` 参数指定副本名称为 `rs0`[^3]。 #### 3. 启动容器 启动容器前,请确保已经保存好 `docker-compose.yml` 文件及其关联的数据目录结构。执行以下命令启动所有容器: ```bash docker-compose up -d ``` 这将以分离模式启动所有的 MongoDB 实例[^2]。 #### 4. 初始化副本 旦所有容器成功启动,进入节点 shell 执行初始化脚本: ```bash docker exec -it mongo-primary mongo --username admin --password password <<EOF rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "mongo-primary:27017" }, { _id: 1, host: "mongo-secondary1:27017" }, { _id: 2, host: "mongo-secondary2:27017" } ] }) EOF ``` 这段脚本会在节点上发起个新的副本实例,并将其他两个次级节点加入到该合中[^4]。 --- ### 注意事项 - 如果尝试在启用认证的情况下立即初始化副本,则可能会遇到错误提示无法连接至数据库;此时应先禁用认证再重新添加成员[^2]。 - 确保网络连通性良好以便各节点能够互相发现彼此的服务地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值