MongoDB集群
MongoDB是一个高性能、开源的NoSQL数据库,广泛用于大数据应用和互联网应用中。为了提高数据的可靠性和扩展性,我们可以搭建MongoDB集群。MongoDB集群可以通过复制集和分片两种方式来实现。复制集提供数据的冗余备份和故障转移功能,而分片则将数据分割存储在多个MongoDB实例上,提高数据的负载能力。
复制集
复制集是MongoDB最简单的集群形式,由一个主节点和多个从节点组成。主节点负责处理写操作和读取操作,同时会将写操作同步给从节点。从节点只负责处理读取操作,当主节点宕机时可以选择出一个从节点作为新的主节点,从而实现故障转移。
部署步骤
- 启动主节点
mongod --port 27017 --dbpath /data/db1 --replSet rs0
- 连接主节点,并初始化复制集
mongo --port 27017
> rs.initiate()
- 启动从节点
mongod --port 27018 --dbpath /data/db2 --replSet rs0
- 将从节点加入复制集
mongo --port 27018
> rs.add("localhost:27017")
- 查看复制集状态
mongo --port 27017
> rs.status()
运行结果
{
"set": "rs0",
"myState": 1,
"term": NumberLong(2),
"syncSourceHost": "",
"syncSourceId": -1,
"heartbeatIntervalMillis": NumberLong(2000),
"majorityVoteCount": 2,
"writeMajorityCount": 2,
"votingMembersCount": 2,
"optimes": {
"lastCommittedOpTime": {
"ts": Timestamp(1622486715, 1),
"t": NumberLong(2)
},
"lastCommittedWallTime": ISODate("2021-05-31T08:31:55.605Z"),
"readConcernMajorityOpTime": {
"ts": Timestamp(1622486715, 1),
"t": NumberLong(2)
},
"readConcernMajorityWallTime": ISODate("2021-05-31T08:31:55.605Z"),
"appliedOpTime": {
"ts": Timestamp(1622486715, 1),
"t": NumberLong(2)
},
"durableOpTime": {
"ts": Timestamp(1622486715, 1),
"t": NumberLong(2)
},
"lastAppliedWallTime": ISODate("2021-05-31T08:31:55.605Z"),
"lastDurableWallTime": ISODate("2021-05-31T08:31:55.605Z")
},
"lastStableRecoveryTimestamp": Timestamp(1622486705, 1),
"lastStableCheckpointTimestamp": Timestamp(1622486705, 1),
"electionCandidateMember": {
"attempts": NumberLong(0),
"lastEcho": ISODate("2021-05-31T08:31:54.605Z"),
"electionId": ObjectId("7fffffff0000000000000002")
},
"members": [
{
"_id": 0,
"name": "localhost:27017",
"health": 1,
"state": 1,
"stateStr": "PRIMARY",
"uptoDate": true,
"optime": {
"ts": Timestamp(1622486715, 1),
"t": NumberLong(2)
},
"optimeDate": ISODate("2021-05-31T08:31:55Z"),
"syncingTo": "",
"configVersion": 3,
"self": true,
"lastHeartbeatMessage": ""
},
{
"_id": 1,
"name": "localhost:27018",
"health": 1,
"state": 2,
"stateStr": "SECONDARY",
"uptoDate": true,
"optime": {
"ts": Timestamp(1622486715, 1),
"t": NumberLong(2)
},
"optimeDurable": {
"ts": Timestamp(1622486715, 1),
"t": NumberLong(2)
},
"optimeDate": ISODate("2021-05-31T08:31:55Z"),
"optimeDurableDate": ISODate("2021-05-31T08:31:55Z"),
"lastHeartbeatMessage": ""
}
],
"ok": 1,
"$clusterTime": {
"clusterTime": Timestamp(1622486715, 1),
"signature": {
"hash": BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId": NumberLong(0)
}
},
"operationTime": Timestamp(1622486715, 1)
}
分片
分片是MongoDB的水平扩展方式,将数据分散存储在多台主机上,从而提高数据的查询性能和负载能力。分片集群由三个部分组成:分片(Shard)、路由(Router)、配置服务器(Config Server)。
部署步骤
- 启动配置服务器
mongod --configsvr --replSet configReplSet --port 27019 --dbpath /data/configdb
- 初始化配置服务器复制集
mongo --port 27019
> rs.initiate()
- 启动分片
mongod --shardsvr --replSet shard1 --port 27020 --dbpath /data/shard1
mongod --shardsvr --replSet shard2 --port 27021 --dbpath /data/shard2
- 初始化分片复制集
mongo --port 27020
> rs.initiate()
mongo --port 27021
> rs.initiate()
- 启动路由
mongos --configdb localhost:27019 --port 27022
- 将分片加入到路由中
mongo --port 27022
> sh.addShard("shard1/localhost:27020")
> sh.addShard("shard2/localhost:27021")
运行结果
{
"ok" : 1,
"operationTime" : Timestamp(1622491025, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1622491025, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
总结
MongoDB集群可以通过复制集和分片两种方式实现数据的高可用和横向扩展。复制集提供了数据的冗余备份和故障转移功能,适合小规模应用;而分片可以将数据分散存储在多台主机上,提高了数据的查询性能和负载能力,适合大规模应用。在搭建MongoDB集群时,一定要注意配置参数和监控集群状态,确保数据的安全和可靠性。