搭建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对应的账号密码

搭建mongo的replica set的更多相关文章

  1. 【MongoDB】windows平台搭建Mongo数据库复制集(类似集群)(转)

    原文链接:[MongoDB]windows平台搭建Mongo数据库复制集(类似集群)(一) Replica  Sets(复制集)是在mongodDB1.6版本开始新增的功能,它可以实现故障自动切换和自 ...

  2. MongoDB:搭建三节点 Replica Set 环境

    今天学习了搭建 MongDB 复制环境,实验环境是在虚拟机上同一系统,并搭建三节点 Replica Set,根据文档上的描述,mongodb 复制配置简单,并且能够自动 failover,这些高级特性 ...

  3. 【MongoDB】windows平台搭建Mongo数据库复制集(相似集群)(三)

    关于windows平台搭建Mongo数据库复制集这个话题,我已经在前面写了两篇博客 第一篇: 怎样在windows平台搭建Mongo数据库复制集 第二篇: 数据同步和故障自适应測试 在本篇里面,咱们重 ...

  4. Mongodb集群搭建之 Sharding+ Replica Sets集群架构(2)

    参考http://blog.51cto.com/kaliarch/2047358 一.概述 1.1 背景 为解决mongodb在replica set每个从节点上面的数据库均是对数据库的全量拷贝,从节 ...

  5. Mongodb集群搭建之 Sharding+ Replica Sets集群架构

    1.本例使用1台Linux主机,通过Docker 启动三个容器 IP地址如下: docker run -d -v `pwd`/data/master:/mongodb -p 27017:27017 d ...

  6. Mongo的Replica Sets (复制集)的配置全过程和心得体会

    http://blog.csdn.net/bloggongchang/article/details/7272403 一.MongoDB Replica Sets(副本集)简单的说就是有自动故障恢复功 ...

  7. 从零搭建mongo分片集群的简洁方法

    一.目录 1.mongo路径,config数据路径,shard数据路径

  8. 【MongoDB】windows平台搭建Mongo数据库复制集(相似集群)(一)

    Replica  Sets(复制集)是在mongodDB1.6版本号開始新增的功能.它能够实现故障自己主动切换和自己主动修复功能成员节点的功能,各个DB之间的数据全然一致,大大减少了单点故障的风险. ...

  9. mongo 原理 Replica Set Oplog

    [客户的写请求全部发送至主节点] Primary. The primary receives all write operations. Secondaries. Secondaries replic ...

  10. windows平台搭建Mongo数据库复制集(类似集群)(三)

    在本篇里面,咱们重点总结一下复制集,以及分析一下它的工作原理 一.常见场景 应用程序和数据库之间的网络连接丢失 计划停机.断电.数据库服务硬盘故障等等 复制可以进行故障转移,复制能让你在副本间均衡读负 ...

随机推荐

  1. 微软的一些公开课,Python、机器学习、SQL、AI,全部免费

    大家好,我是老章,刷X看到一位博主Alif Hossain@alifcoder总结了微软的一些公开课,全部免费,蛮不错的.感兴趣可以学一波,还能领徽章. 1. 机器学习简介 本课程是学习机器学习基础知 ...

  2. 在Windows上D盘上安装Docker

    Reference https://www.willh.cn/articles/2022/07/13/1657676401964.html Docker默认安装在C盘: "C:\Progra ...

  3. Codeforces Round #663 (Div. 2) (A~C题,C题 Good)

    比赛链接:Here 1391A. Suborrays 简单构造题, 把 \(n\) 放最前面,接着补 \(1\) ~ \(n - 1\) 即可 1391B. Fix You \((1,1)\) -&g ...

  4. 第三届云原生编程挑战赛正式启动,Serverless 赛道邀你参加!

    据<云原生开发现状报告>显示,全球云原生开发人员达 680 万,与 2020 年 5 月报告的云原生开发者数量 470 万相比,全球云原生开发人员数量正极速增长,越来越多开发者加入到云原生 ...

  5. vscode如何优雅的拥抱eslint

    https://www.toutiao.com/a6826129210260587019/?tt_from=weixin&utm_campaign=client_share&wxsha ...

  6. 操作系统OS学习总结

    操作系统OS笔记 操作系统概述 操作系统定义 操作系统,是计算机系统中最基本.最重要的系统软件,是其它软件的支撑.控制和管理计算机系统的硬件和软件资源,合理的组织计算机工作流程,并为用户使用计算机提供 ...

  7. 【SHELL】百分比进度指示,原地踏步

    百分比进度指示,原地踏步效果实现主要利用退格'\b',同行'\c' #!/bin/bash function percentage_progress() { progress=$(($1*100/$2 ...

  8. android studio 如何把依赖导出成 jar

    反编译工具 dex-tools-2.1-SNAPSHOT 第一步 用一个普通的app工程,引用所有的库,然后生成apk文件 第二步 把apk文件,改扩展名为zip,解压后,里面有几个*.dex文件,拷 ...

  9. udp编程及udp常见问题处理

    前言 UDP协议是User Datagram Protocol的缩写,它是无连接,不可靠的网络协议.一般使用它进行实时性数据的传输,主要是因为它快,但因为它是不可靠的一种传输协议,所以不可避免的会出现 ...

  10. [转帖]Always-on Profiling for Production Systems

    https://0x.tools/ 0x.tools (GitHub) is a set of open-source utilities for analyzing application perf ...