Mongo复制集的搭建

标签: mongo  

在本地机器上运行3个实例来搭建一个最简单的复制集。

准备

  • 安装最新的 MongoDB 版本
  • Windows 系统请事先配置好 MongoDB 可执行文件的环境变量
  • Linux 和 Mac 系统请配置 PATH 变量
  • 确保有 10GB 以上的硬盘空间

创建数据目录

  • MongoDB 启动时将使用一个数据目录存放所有数据文件。我们将为3个复制集节 点创建各自的数据目录。

  • Linux/MacOS:

    mkdir -p ~/data/db{1,2,3}
    

准备配置文件

复制集的每个mongod进程应该位于不同的服务器。我们现在在一台机器上运行3个进程,因此要 为它们各自配置:

  • 不同的端口。示例中将使用28017/28018/28019

  • 不同的数据目录

    ~/data/db1
    ~/data/db2
    ~/data/db3
    
  • 不同日志文件路径。

    ~/data/db1/mongod.log
    ~/data/db2/mongod.log
    ~/data/db3/mongod.log
    

配置文件如下:

# ~/data/db1/mongod.conf

systemLog:
  destination: file
  path: /Users/bo.liang/data/db1/mongod.log    # log path
  logAppend: true
storage:
  dbPath: /Users/bo.liang/data/db1 # data directory
net:
  bindIp: 127.0.0.1
  port: 28017 # port
replication:
  replSetName: rs0
processManagement:
  fork: true

启动MongoDB进程

mongod -f ~/data/db1/mongod.conf
mongod -f ~/data/db2/mongod.conf 
mongod -f ~/data/db3/mongod.conf

查看MongoDB进程

bo.liang          8911   0.1  0.2  5576252  27356   ??  S     7:21PM   0:00.56 mongod -f /Users/bo.liang/data/db3/mongod.conf
bo.liang          8760   0.1  0.2  5601200  30796   ??  S     7:19PM   0:00.96 mongod -f /Users/bo.liang/data/db1/mongod.conf
bo.liang          8889   0.1  0.2  5593800  27668   ??  S     7:21PM   0:00.58 mongod -f /Users/bo.liang/data/db2/mongod.conf

配置复制集

方法1

mongo localhost:28017

rs.initiate()
rs.add("HOSTNAME:28018")
rs.add("HOSTNAME:28019")

注意:此方式hostname 需要能被解析

> hostname -f
CNbo.liang

所以:
rs.add("CNbo.liang:28018")
rs.add("CNbo.liang:28019")

或者
rs.add("127.0.0.1:28018")
rs.add("127.0.0.1:28019")
rs0:PRIMARY> rs.status()
{
	"set" : "rs0",
	"date" : ISODate("2020-03-10T11:29:47.821Z"),
	"myState" : 1,
	"term" : NumberLong(1),
	"syncingTo" : "",
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"majorityVoteCount" : 2,
	"writeMajorityCount" : 2,
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1583839785, 1),
			"t" : NumberLong(1)
		},
		"lastCommittedWallTime" : ISODate("2020-03-10T11:29:45.024Z"),
		"readConcernMajorityOpTime" : {
			"ts" : Timestamp(1583839785, 1),
			"t" : NumberLong(1)
		},
		"readConcernMajorityWallTime" : ISODate("2020-03-10T11:29:45.024Z"),
		"appliedOpTime" : {
			"ts" : Timestamp(1583839785, 1),
			"t" : NumberLong(1)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1583839785, 1),
			"t" : NumberLong(1)
		},
		"lastAppliedWallTime" : ISODate("2020-03-10T11:29:45.024Z"),
		"lastDurableWallTime" : ISODate("2020-03-10T11:29:45.024Z")
	},
	"lastStableRecoveryTimestamp" : Timestamp(1583839762, 1),
	"lastStableCheckpointTimestamp" : Timestamp(1583839762, 1),
	"electionCandidateMetrics" : {
		"lastElectionReason" : "electionTimeout",
		"lastElectionDate" : ISODate("2020-03-10T11:23:21.032Z"),
		"electionTerm" : NumberLong(1),
		"lastCommittedOpTimeAtElection" : {
			"ts" : Timestamp(0, 0),
			"t" : NumberLong(-1)
		},
		"lastSeenOpTimeAtElection" : {
			"ts" : Timestamp(1583839400, 1),
			"t" : NumberLong(-1)
		},
		"numVotesNeeded" : 1,
		"priorityAtElection" : 1,
		"electionTimeoutMillis" : NumberLong(10000),
		"newTermStartDate" : ISODate("2020-03-10T11:23:22.079Z"),
		"wMajorityWriteAvailabilityDate" : ISODate("2020-03-10T11:23:22.136Z")
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "127.0.0.1:28017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 607,
			"optime" : {
				"ts" : Timestamp(1583839785, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2020-03-10T11:29:45Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1583839401, 1),
			"electionDate" : ISODate("2020-03-10T11:23:21Z"),
			"configVersion" : 3,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 1,
			"name" : "127.0.0.1:28018",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 8,
			"optime" : {
				"ts" : Timestamp(1583839785, 1),
				"t" : NumberLong(1)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1583839785, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2020-03-10T11:29:45Z"),
			"optimeDurableDate" : ISODate("2020-03-10T11:29:45Z"),
			"lastHeartbeat" : ISODate("2020-03-10T11:29:47.027Z"),
			"lastHeartbeatRecv" : ISODate("2020-03-10T11:29:47.031Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "127.0.0.1:28017",
			"syncSourceHost" : "127.0.0.1:28017",
			"syncSourceId" : 0,
			"infoMessage" : "",
			"configVersion" : 3
		},
		{
			"_id" : 2,
			"name" : "127.0.0.1:28019",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 2,
			"optime" : {
				"ts" : Timestamp(1583839785, 1),
				"t" : NumberLong(1)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1583839785, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2020-03-10T11:29:45Z"),
			"optimeDurableDate" : ISODate("2020-03-10T11:29:45Z"),
			"lastHeartbeat" : ISODate("2020-03-10T11:29:47.027Z"),
			"lastHeartbeatRecv" : ISODate("2020-03-10T11:29:47.325Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : 3
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1583839785, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1583839785, 1)
}

方法2

mongo localhost:28017

rs.initiate({
	_id: "rs0", 
	members: [{ 
		_id: 0,
		host: "localhost:28017" 
	},{
		_id: 1,
		host: "localhost:28018" 
	},{
		_id: 2,
		host: "localhost:28019" 
  }]
})

验证

MongoDB 主节点进行写入

mongo localhost:28017

db.test.insert({ a:1 })

db.test.insert({ a:2 })

MongoDB 从节点进行读

mongo localhost:28018
rs.slaveOk()
db.test.find()

总结

  • MongoDB 的生产环境要求搭建复制集
  • MongoDB 复制集的搭建非常简单
  • 实际环境要分三个物理(虚拟机)节点 (或以上

「真诚赞赏,手留余香」

请我喝杯咖啡?

使用微信扫描二维码完成支付

相关文章