搭建mongo的replica set
搭建mongo的replica set
前言
准备三台机器,相互可以访问的。处理思路,先构建无需认证的集群,然后进入主节点,初始化集群的账号密码。然后开启所有机器的认证。
安装
mongo1
安装mongo
// 下载
# wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.1.tgz
# tar zxvf mongodb-linux-x86_64-rhel70-4.2.1.tgz
# mv mongodb-linux-x86_64-rhel70-4.2.1 /usr/local/mongodb
// 创建db的data目录
# cd /usr/local/mongodb/
# mkdir data
// 存放数据
# mkdir data/db
// 存放log
# mkdir data/logs
# touch data/mongodb.log
# cd data
# mv mongdb.log logs
写入配置文件,vi mongodb.cof
// 端口
port = 27018
bind_ip = 0.0.0.0
#集群名字
replSet = mongos
#数据目录(自己刚才设置的位置)
dbpath = /usr/local/mongodb/data/db
#日志目录(自己刚才设置的位置))
logpath = /usr/local/mongodb/data/logs/mongodb.log
#设置后台运行
fork = true
#日志输出方式
logappend = true
#开启认证
#auth = true
#安全文件地址
#keyFile = /usr/local/mongodb/data/mongodb.key
关于ip
- bind_ip = 192.168.0.136 #如果修改成本机Ip,那除了本机外的机器都可以连接(就是自己连不了、哈哈、蛋疼)
- bind_ip = 0.0.0.0 #改成0,那么大家都可以访问(共赢)
- bind_ip = 127.0.0.1 #改成127,那就只能自己练了(独吞)
所以为了方便其他服务器和自己连接,就把bind_ip
改成0.0.0.0
启动
# ./bin/mongod -f ./data/mongodb.conf
三台机器都安装下
构建副本集
进去其中一台机器
./bin/mongo 192.168.56.101:27018
查看副本集的状态
rs.status()
{
"operationTime" : Timestamp(0, 0),
"ok" : 0,
"errmsg" : "no replset config has been received",
"code" : 94,
"codeName" : "NotYetInitialized",
"$clusterTime" : {
"clusterTime" : Timestamp(0, 0),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
发现没有初始化,然后我们来初始化
rs.initiate({
_id: "mongos",
members: [
{ _id : 0, host : "192.168.56.101:27018" },
{ _id : 1, host : "192.168.56.102:27018" },
{ _id : 2, host : "192.168.56.103:27018" }
]
});
再次查看状态
rs.status()
{
"set" : "mongos",
"date" : ISODate("2020-07-19T14:49:52.387Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1595170188, 2),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2020-07-19T14:49:48.999Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1595170188, 2),
"t" : NumberLong(1)
},
"readConcernMajorityWallTime" : ISODate("2020-07-19T14:49:48.999Z"),
"appliedOpTime" : {
"ts" : Timestamp(1595170188, 2),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1595170188, 2),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2020-07-19T14:49:48.999Z"),
"lastDurableWallTime" : ISODate("2020-07-19T14:49:48.999Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1595170187, 3),
"lastStableCheckpointTimestamp" : Timestamp(1595170187, 3),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2020-07-19T14:49:47.525Z"),
"termAtElection" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1595170176, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(269553681),
"newTermStartDate" : ISODate("2020-07-19T14:49:47.939Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2020-07-19T14:49:48.897Z")
},
"members" : [
{
"_id" : 0,
"name" : "192.168.56.101:27018",
"ip" : "192.168.56.101",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1492,
"optime" : {
"ts" : Timestamp(1595170188, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-07-19T14:49:48Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1595170187, 1),
"electionDate" : ISODate("2020-07-19T14:49:47Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.56.102:27018",
"ip" : "192.168.56.102",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 15,
"optime" : {
"ts" : Timestamp(1595170188, 2),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1595170188, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-07-19T14:49:48Z"),
"optimeDurableDate" : ISODate("2020-07-19T14:49:48Z"),
"lastHeartbeat" : ISODate("2020-07-19T14:49:51.552Z"),
"lastHeartbeatRecv" : ISODate("2020-07-19T14:49:50.817Z"),
"pingMs" : NumberLong(1),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.56.101:27018",
"syncSourceHost" : "192.168.56.101:27018",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.56.103:27018",
"ip" : "192.168.56.103",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 15,
"optime" : {
"ts" : Timestamp(1595170188, 2),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1595170188, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-07-19T14:49:48Z"),
"optimeDurableDate" : ISODate("2020-07-19T14:49:48Z"),
"lastHeartbeat" : ISODate("2020-07-19T14:49:51.555Z"),
"lastHeartbeatRecv" : ISODate("2020-07-19T14:49:50.830Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.56.101:27018",
"syncSourceHost" : "192.168.56.101:27018",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1595170188, 2),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1595170188, 2)
}
发现已经初始化好了
加入认证
进去到PRIMARY节点初始化集群的登录账号和密码信息
# ./bin/mongo 192.168.56.101:27018
# use admin
# db.createUser({user: 'handle', pwd: '123456', roles: ['root']})
生成keyfile
- MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集。
- keyFile的内容必须是6到1024个字符的长度,且副本集所有成员的keyFile内容必须相同。
- 有一点要注意是的:在UNIX系统中,keyFile必须没有组权限或完全权限(也就是权限要设置成X00的形式)。Windows系统中,keyFile权限没有被检查。
- 可以使用任意方法生成keyFile。例如,如下操作使用openssl生成复杂的随机的1024个字符串。然后使用chmod修改文件权限,只给文件拥有者提供读权限。
# 400权限是要保证安全性,否则mongod启动会报错
openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key
然后放到mongodb中的data目录,三台机器keyfile
要一致。我是在一台中生成,然后传到其他的服务器中。
打开认证,三台机器都要执行
#开启认证
auth = true
#安全文件地址
keyFile = /usr/local/mongodb/data/mongodb.key
之后重启mongo
# ./bin/mongo 192.168.56.102:27018
rs.status()
{
"operationTime" : Timestamp(1595212820, 1),
"ok" : 0,
"errmsg" : "command replSetGetStatus requires authentication",
"code" : 13,
"codeName" : "Unauthorized",
"$clusterTime" : {
"clusterTime" : Timestamp(1595212820, 1),
"signature" : {
"hash" : BinData(0,"7N/yM+2RounFZVTIzjbW+rEcZNs="),
"keyId" : NumberLong("6851374857561571330")
}
}
}
不带账号密码登录,提示Unauthorized
# ./bin/mongo 192.168.56.102:27018 -u "handle" -p "123456" --authenticationDatabase "admin"
rs.status()
{
"set" : "mongos",
"date" : ISODate("2020-07-20T02:44:20.836Z"),
"myState" : 1,
"term" : NumberLong(3),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1595213060, 1),
"t" : NumberLong(3)
},
"lastCommittedWallTime" : ISODate("2020-07-20T02:44:20.154Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1595213060, 1),
"t" : NumberLong(3)
},
"readConcernMajorityWallTime" : ISODate("2020-07-20T02:44:20.154Z"),
"appliedOpTime" : {
"ts" : Timestamp(1595213060, 1),
"t" : NumberLong(3)
},
"durableOpTime" : {
"ts" : Timestamp(1595213060, 1),
"t" : NumberLong(3)
},
"lastAppliedWallTime" : ISODate("2020-07-20T02:44:20.154Z"),
"lastDurableWallTime" : ISODate("2020-07-20T02:44:20.154Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1595213010, 1),
"lastStableCheckpointTimestamp" : Timestamp(1595213010, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2020-07-20T01:56:39.170Z"),
"termAtElection" : NumberLong(3),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1595210160, 1),
"t" : NumberLong(2)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(808464432),
"newTermStartDate" : ISODate("2020-07-20T01:56:39.976Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2020-07-20T01:56:40.667Z")
},
"members" : [
{
"_id" : 0,
"name" : "192.168.56.101:27018",
"ip" : "192.168.56.101",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2871,
"optime" : {
"ts" : Timestamp(1595213050, 1),
"t" : NumberLong(3)
},
"optimeDurable" : {
"ts" : Timestamp(1595213050, 1),
"t" : NumberLong(3)
},
"optimeDate" : ISODate("2020-07-20T02:44:10Z"),
"optimeDurableDate" : ISODate("2020-07-20T02:44:10Z"),
"lastHeartbeat" : ISODate("2020-07-20T02:44:19.053Z"),
"lastHeartbeatRecv" : ISODate("2020-07-20T02:44:20.779Z"),
"pingMs" : NumberLong(1),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.56.102:27018",
"syncSourceHost" : "192.168.56.102:27018",
"syncSourceId" : 1,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 1,
"name" : "192.168.56.102:27018",
"ip" : "192.168.56.102",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2873,
"optime" : {
"ts" : Timestamp(1595213060, 1),
"t" : NumberLong(3)
},
"optimeDate" : ISODate("2020-07-20T02:44:20Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1595210199, 1),
"electionDate" : ISODate("2020-07-20T01:56:39Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 2,
"name" : "192.168.56.103:27018",
"ip" : "192.168.56.103",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2831,
"optime" : {
"ts" : Timestamp(1595213050, 1),
"t" : NumberLong(3)
},
"optimeDurable" : {
"ts" : Timestamp(1595213050, 1),
"t" : NumberLong(3)
},
"optimeDate" : ISODate("2020-07-20T02:44:10Z"),
"optimeDurableDate" : ISODate("2020-07-20T02:44:10Z"),
"lastHeartbeat" : ISODate("2020-07-20T02:44:19.069Z"),
"lastHeartbeatRecv" : ISODate("2020-07-20T02:44:19.689Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.56.101:27018",
"syncSourceHost" : "192.168.56.101:27018",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1595213060, 1),
"signature" : {
"hash" : BinData(0,"vWZEW8RyQOU7IwSaLMmrEancUio="),
"keyId" : NumberLong("6851374857561571330")
}
},
"operationTime" : Timestamp(1595213060, 1)
}
账号密码设置成功了
备份数据
备份(mongodump)与恢复(mongorestore)
备份数据到本地
mongodump -h 192.168.56.101:27018 -u handle -p 123456 -o /home/liz/Desktop/mongo-bei
数据恢复
新的集群安装完成之后,恢复数据到Primary节点,集群会自动同步到副本集中
mongorestore -h 192.168.56.101:27018 -u handle -p 123456 /home/liz/Desktop/mongo-bei
注意:更换自己服务器上面的ip和mongo对应的账号密码
分类:
linux
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
2019-07-21 GO中的channel使用小结