安装mongodb服务
参考:Mongodb4.2+Centos7 liunx单机版部署_RunTimeExcepti0n的博客-CSDN博客
此步骤需在三台服务器同时进行。
修改配置文件
进入配置文件目录 cd /opt/software/mongodb4.2/mongodb/config
修改配置文件增加集群配置:vim mongodb.conf
systemLog:
destination: file
path: /opt/software/mongodb4.2/mongodb/log/mongodb.log #日志文件存放目录
logAppend: true
storage:
dbPath: /opt/software/mongodb4.2/mongodb/data/db #数据文件存放目录
net:
bindIp: 0.0.0.0 # 配置任意地址可以连接
port: 28017 # port
#复制集群配置
replication:
replSetName: rs0
processManagement:
fork: true #后台进程启动
分别启动mongodb数据库
任意目录下执行: mongod --config /opt/software/mongodb4.2/mongodb/config/mongodb.conf
增加集群配置
因为mongodb集群各节点具有同等地址,在任一节点执行如下命令mongo 连接数据库
执行如下命令:
命令中 rs0 为上面配置文件中的集群名称:replSetName
host 为虚拟机IP
rs.initiate({
_id: "rs0",
members: [{
_id: 0,
"host": "192.168.0.105:27017"
},{
_id: 1,
"host": "192.168.0.106:27017"
},{
_id: 2,
"host": "192.168.0.108:27017"
}]
})
再按一次enter 可能会发生节点类型变化,可能的意思是,当前节点可能会成为PRIMARY,也可能不会
在另外两台服务器上用mongo 命令连接数据库,查看此时节点的状态
在任一节点查看集群状态
rs.status()
返回如下结果:
rs0:PRIMARY> rs.status()
{
"set" : "rs0",
"date" : ISODate("2021-09-16T17:07:03.614Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1631812014, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2021-09-16T17:06:54.127Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1631812014, 1),
"t" : NumberLong(1)
},
"readConcernMajorityWallTime" : ISODate("2021-09-16T17:06:54.127Z"),
"appliedOpTime" : {
"ts" : Timestamp(1631812014, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1631812014, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2021-09-16T17:06:54.127Z"),
"lastDurableWallTime" : ISODate("2021-09-16T17:06:54.127Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1631811984, 1),
"lastStableCheckpointTimestamp" : Timestamp(1631811984, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2021-09-16T17:00:23.989Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1631811613, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2021-09-16T17:00:24.042Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2021-09-16T17:00:25.210Z")
},
"members" : [
{
"_id" : 0,
"name" : "192.168.0.105:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 732,
"optime" : {
"ts" : Timestamp(1631812014, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-09-16T17:06:54Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1631811623, 1),
"electionDate" : ISODate("2021-09-16T17:00:23Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.0.106:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 409,
"optime" : {
"ts" : Timestamp(1631812014, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1631812014, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-09-16T17:06:54Z"),
"optimeDurableDate" : ISODate("2021-09-16T17:06:54Z"),
"lastHeartbeat" : ISODate("2021-09-16T17:07:02.536Z"),
"lastHeartbeatRecv" : ISODate("2021-09-16T17:07:01.704Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.0.105:27017",
"syncSourceHost" : "192.168.0.105:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.0.108:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 409,
"optime" : {
"ts" : Timestamp(1631812014, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1631812014, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-09-16T17:06:54Z"),
"optimeDurableDate" : ISODate("2021-09-16T17:06:54Z"),
"lastHeartbeat" : ISODate("2021-09-16T17:07:02.537Z"),
"lastHeartbeatRecv" : ISODate("2021-09-16T17:07:01.697Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.0.105:27017",
"syncSourceHost" : "192.168.0.105:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1631812014, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1631812014, 1)
}
rs0:PRIMARY>
members中记录了集群各个节点的信息,例:
stateStr: 节点属性,PRIMARY还是SECONDARY
uptime: 节点运行时间
optime: 从节点同步时间戳,这个在集群选举时有重要用处,Mongodb复制集群与选举中有说到。
新增删除节点
// 删除复制节点
rs.remove("192.168.0.108:27017")
// 插入新的复制节点
rs.add("192.168.0.108:27017")
数据验证
在PRIMARY节点新增数据
db.test.insert({a:"PRIMARY INSERT"})
在任一SECONDARY节点读取数据
报错,意思是当前是从节点,不支持读操作。
解决,执行如下命令:
rs.slaveOk() 或者 rs.secondaryOk() 再执行查询操作
这里rs.slaveOk() 已经不推荐使用了(很多集群都慢慢的摒弃了slave的说法,例如redis.kafka)
可以看到SECONDARY节点查询OK
完结
若没有三台服务器的可以在同一条服务器启动三个实例,但是需要配置不同的 dbpath 和config文件,此处不做赘述。
至此,mongodb复制集群宣告搭建完成。