8.MongoDB系列之创建副本集(一)
1. 复制简介
在MongoDB中,创建副本集后就可以使用复制功能了,副本集是一组服务器,其中一个是用于处理写操作的主节点,还有多个用于保存主节点的数据副本的从节点,如果主节点崩溃了,则从节点会从中选举中一个新的主节点
2. 创建副本集
mongod --replSet study --dbpath /home/data/rs1 --port 27018 --bind_ip_all --oplogSize 200
mongod --replSet study --dbpath /home/data/rs2 --port 27019 --bind_ip_all --oplogSize 200
mongod --replSet study --dbpath /home/data/rs3 --port 27020 --bind_ip_all --oplogSize 200
# 可以看到副本集已创建
# ps -ef|grep mongod
root 247 228 1 13:13 pts/2 00:00:00 mongod --replSet study --dbpath /home/data/rs1 --port 27018 --bind_ip_all --oplogSize 200
root 283 240 3 13:13 pts/3 00:00:00 mongod --replSet study --dbpath /home/data/rs2 --port 27019 --bind_ip_all --oplogSize 200
root 336 323 9 13:14 pts/4 00:00:00 mongod --replSet study --dbpath /home/data/rs3 --port 27020 --bind_ip_all --oplogSize 200
在MongoDB3.6中,mongod仅在默认情况下绑定到localhost(127.0.0.1),为了使副本集中每个成员都可以与其他成员进行通信,还必须绑定其他成员可以访问到的IP,如下
mongod --bind_ip localhost,192.168.0.12 --replSet study --dbpath /home/data/rs1 --port 27018 --oplogSize 200
到目前为止,每个mongod都不知道其他mongod的存在。为了能够彼此交互,需要创建一个包含每个成员的配置,并将此配置发送给其中一个mongod进程。它负责将此配置传播给其他成员
# 连接mongod
mongo --port 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)
}
}
}
# 创建配置并初始化配置
> rsconf = {_id: "study", members: [{_id:0, host:"localhost:27018"},{_id:1, host:"localhost:27019"},{_id:2, host:"localhost:27020"}]}
> rs.initiate(rsconf)
# 再次查看状态
study:SECONDARY> rs.status()
{
"set" : "study",
"date" : ISODate("2022-07-10T05:36:36.198Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1657431395, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2022-07-10T05:36:35.602Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1657431395, 1),
"t" : NumberLong(1)
},
"readConcernMajorityWallTime" : ISODate("2022-07-10T05:36:35.602Z"),
"appliedOpTime" : {
"ts" : Timestamp(1657431395, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1657431395, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2022-07-10T05:36:35.602Z"),
"lastDurableWallTime" : ISODate("2022-07-10T05:36:35.602Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1657431394, 3),
"lastStableCheckpointTimestamp" : Timestamp(1657431394, 3),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2022-07-10T05:36:34.192Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1657431383, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2022-07-10T05:36:34.225Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2022-07-10T05:36:35.558Z")
},
"members" : [
{
"_id" : 0,
"name" : "localhost:27018",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", // 主节点
"uptime" : 1369,
"optime" : {
"ts" : Timestamp(1657431395, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-07-10T05:36:35Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1657431394, 1),
"electionDate" : ISODate("2022-07-10T05:36:34Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "localhost:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", // 从节点
"uptime" : 12,
"optime" : {
"ts" : Timestamp(1657431383, 1),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(1657431383, 1),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("2022-07-10T05:36:23Z"),
"optimeDurableDate" : ISODate("2022-07-10T05:36:23Z"),
"lastHeartbeat" : ISODate("2022-07-10T05:36:34.202Z"),
"lastHeartbeatRecv" : ISODate("2022-07-10T05:36:35.519Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "localhost:27020",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 12,
"optime" : {
"ts" : Timestamp(1657431383, 1),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(1657431383, 1),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("2022-07-10T05:36:23Z"),
"optimeDurableDate" : ISODate("2022-07-10T05:36:23Z"),
"lastHeartbeat" : ISODate("2022-07-10T05:36:34.202Z"),
"lastHeartbeatRecv" : ISODate("2022-07-10T05:36:35.521Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1657431395, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1657431395, 1)
}
3. 观察副本集
study:PRIMARY> use test
switched to db test
study:PRIMARY> for (i=0;i <1000;i++){db.coll.insert({count:i})}
WriteResult({ "nInserted" : 1 })
# 查看主节点
study:PRIMARY> db.isMaster()
{
"hosts" : [
"localhost:27018",
"localhost:27019",
"localhost:27020"
],
"setName" : "study",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "localhost:27018",
"me" : "localhost:27018",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1657431964, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2022-07-10T05:46:04Z"),
"majorityOpTime" : {
"ts" : Timestamp(1657431964, 1),
"t" : NumberLong(1)
},
"majorityWriteDate" : ISODate("2022-07-10T05:46:04Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2022-07-10T05:46:07.631Z"),
"logicalSessionTimeoutMinutes" : 30,
"connectionId" : 1,
"minWireVersion" : 0,
"maxWireVersion" : 8,
"readOnly" : false,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1657431964, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1657431964, 1)
}
// 新开一个shell连接从节点
mongo --port 27020
study:SECONDARY> use test
switched to db test
// 执行查询可看到如下报错
study:SECONDARY> db.coll.find({})
Error: error: {
"operationTime" : Timestamp(1657432094, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1657432094, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
从节点可能会落后主节点(延迟)而缺少最新的写入,所以默认情况下从节点会拒绝读请求,以防止读取过期数据,如果想让从节点查询,则可以设置
study:SECONDARY> db.setSlaveOk()
study:SECONDARY> db.coll.count({})
1000
从节点不接受写操作。从节点只能通过复制功能写入数据,不接受客户端的写请求
study:SECONDARY> db.coll.insert({count: 33})
WriteCommandError({
"operationTime" : Timestamp(1657432434, 1),
"ok" : 0,
"errmsg" : "not master",
"code" : 10107,
"codeName" : "NotMaster",
"$clusterTime" : {
"clusterTime" : Timestamp(1657432434, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
})
让主节点停止,发现从节点27020成为了主节点,实现了自动选举主节点
study:PRIMARY> db.adminCommand({'shutdown': 1})
study:SECONDARY> db.isMaster()
{
"hosts" : [
"localhost:27018",
"localhost:27019",
"localhost:27020"
],
"setName" : "study",
"setVersion" : 1,
"ismaster" : false,
"secondary" : true,
"primary" : "localhost:27019",
"me" : "localhost:27020",
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1657432711, 1),
"t" : NumberLong(2)
},
"lastWriteDate" : ISODate("2022-07-10T05:58:31Z"),
"majorityOpTime" : {
"ts" : Timestamp(1657432711, 1),
"t" : NumberLong(2)
},
"majorityWriteDate" : ISODate("2022-07-10T05:58:31Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2022-07-10T05:58:34.144Z"),
"logicalSessionTimeoutMinutes" : 30,
"connectionId" : 20,
"minWireVersion" : 0,
"maxWireVersion" : 8,
"readOnly" : false,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1657432711, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1657432711, 1)
}
4. 更改副本集配置
// 添加副本集
study:PRIMARY> rs.add('localhost:27021')
// 移除副本集
study:PRIMARY> rs.remove('localhost:27018')
// 查看配置是否生效
study:PRIMARY> rs.config()
{
"_id" : "study",
"version" : 3,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 1,
"host" : "localhost:27019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "localhost:27020",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "localhost:27021",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("62ca6557fe65de5513877e3c")
}
}
# 修改配置
study:PRIMARY> var config = rs.config()
study:PRIMARY> config.members[0].host = 'localhost:27019'
localhost:27019
8.MongoDB系列之创建副本集(一)的更多相关文章
- 9.MongoDB系列之创建副本集(二)
1. 如何设计副本集 大多数:选取主节点时需要由大多数决定,主节点只有在得到大多数支持时才能继续作为主节点,写操作被复制到大多数成员时就是安全的写操作.这里的大多数定义为"副本集中一半以上的 ...
- Mongodb 笔记05 创建副本集
创建副本集 1. 副本集:副本集时一组服务器,其中有一个主服务器(primary),用于处理客户端请求:还有多个备份服务器(secondary),用于保存主服务器的数据副本.如果主服务器崩溃了,备份服 ...
- MongoDB系列之三(副本集配置)
今天我测试了一下MongoDB的副本集的配置. 首先从概念上说一下MongoDB副本集和主从复制的区别.其实副本集(Replica Set)是主从复制的高级形式.高级在哪里呢?主动复制实现了数据备份+ ...
- mongodb 系列 ~ mongo的副本集(3)
一 简介:今天咱们来聊聊mongodb复制的具体一些案例 二 副本集 1 当mongodb采用全量复制时,如何观察全量复制的进度 对比文件本身和primary大小 2 mongodb全量复制的过程 旧 ...
- mongodb 系列 ~ mongo的副本集(2)
一 简介:来试试更改副本集的oplog问题二 背景: oplog的作用类似于mysql的binlog,传递增量操作到从节点 三 oplog介绍 1 oplog在local库: 1 mas ...
- 11.MongoDB系列之连接副本集
1. Python连接副本集 from pymongo import MongoClient from bson.codec_options import CodecOptions from retr ...
- mongodb创建副本集命令
mongodb创建副本集命令 ./mongod --replSet spock --dbpath ../data --smallfiles > config ={... "_id&qu ...
- MongoDB 带访问控制的副本集部署
当你需要用到一个MongoDB 副本集集群,用于开发测试时, 可以通过下面的步骤简单完成. 版本及环境 MongoDB4.4 Centos6.5 一. 下载安装 MongoDB Server 及 ...
- MongoDB 删除,添加副本集,并修改副本集IP等信息
MongoDB 删除,添加副本集,并修改副本集IP等信息 添加副本,在登录到主节点下输入 rs.add("ip:port"); 删除副本 rs.remove("ip:po ...
随机推荐
- 万答#12,MGR整个集群挂掉后,如何才能自动选主,不用手动干预
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 本文转载自微信公众号"老叶茶馆" MGR整个集群挂掉后,如能 ...
- 从贡献第一个 pr 开始,我的开源之路正式开启
点击上方蓝字关注我们 1 我是一名开源爱好者 我是李进勇,Github Id:JinyLeeChina,目前就职于政采云,专注于大数据平台及数仓领域,是开源项目爱好者. 2 我与小海豚的不解之缘 记得 ...
- RISC-CPU设计和 FPGA 实现
摸鱼的时候找到一份单周期和多周期的riscv的fpga实现,还是挺符合我的预期的 知乎专栏地址:https://www.zhihu.com/column/c_1530950608688910336
- kali下安装Nessus
Kali安装Nessus 说明 Nessus是一款基于插件的系统漏洞扫描和分析软件 一.安装 1.下载安装包 https://www.tenable.com/downloads/nessus 查看ka ...
- pre 预格式化文本标签
预格式化指的是保留文本在源代码中的格式,页面中显示的和源代码中的效果完全一致.例如,原封不动地保留文本中的空白.空格.制表符等. 除非使用<pre/>标签包裹的文本,否则,浏览器不显示和源 ...
- 垃圾收集器 参阅<<深入理解JAVA虚拟机>>
一.新生代 1.Serial收集器 新生代单线程复制算法GC(暂停工作线程)---------- 支持组合老年代Serial odl和CMS 2.ParNew Serial多线程版本 支持组合cms| ...
- python金牌班第五周周末总结
python金牌班第五周周末总结 常见内置函数 1.abs # 求绝对值,将负数变为整数,并且得出的值只有正数print(abs(-999)) # 999 2.all # 当在经历条件判断时所有的返回 ...
- Cannot resolve method 'println(java.lang.String)'
jsp文件中println爆红 <% int sum = 0; for (int i = 1; i <=100 ; i++) { sum+=i; } out.println("& ...
- 如何通过C#/VB.NET设置Word文档段落缩进
缩进是指调整文本与页面边界之间的距离.在水平标尺,有四个段落缩进滑块:首行缩进.悬挂缩进.左缩进以及右缩进.在对于word文档的录入时,常常需要注意录入的格式,通过合理地设置段落格式,可以让文稿看起来 ...
- 解决:Error downloading packages: containerd.io-1.6.4-3.1.el7.x86_64: [Errno 256] No more mirrors to try.
问题描述: 今天在安装Docker-ce的时候,安装了半天最后提示下载出错还提示下载速度太慢. 报错如下: 下载软件包时出错:containerd.io-1.6.4-3.1.el7.x86_64:[E ...