【MongoDB】Re04 副本集 ReplicationSet
(1)冗余和数据可用性
(2)MongoDB中的复制
(3)主从复制和副本集区别
副本集有两种类型三种角色
两种类型:
三种角色:
您可以将额外的mongod实例添加到副本集作为仲裁者。 仲裁者不维护数据集。
仲裁者的目的是通过响应其他副本集成员的心跳和选举请求来维护副本集中的仲裁。
因为它们不存储数据集,所以仲裁器可以是提供副本集仲裁功能的好方法,其资源成本比具有数据集的全功能副本集成员更便宜。
如果您的副本集具有偶数个成员,请添加仲裁者以获得主要选举中的“大多数”投票。 仲裁者不需要专用硬件。
仲裁者将永远是仲裁者,而主要人员可能会退出并成为次要人员,而次要人员可能成为选举期间的主要人员。
如果你的副本+主节点的个数是偶数,建议加一个仲裁者,形成奇数,容易满足大多数的投票。
如果你的副本+主节点的个数是奇数,可以不加仲裁者。
Docker搭建MongoDB副本集
https://www.cnblogs.com/cowboys/p/9264494.html
拉镜像
docker pull mongo
创建副本集实例的容器,指定副本集名称一样:
# 创建3个容器,指定副本集名称
docker run --name primary -p 27117:27017 -d mongo --replSet "rs"
docker run --name replicate1 -p 27217:27017 -d mongo --replSet "rs"
docker run --name arbiter -p 27317:27017 -d mongo --replSet "rs"
登陆的注意事项
# 从主节点登陆
docker exec -it primary /bin/bash # 注意IP只能写本机具体IP值,映射名称不解析
mongo --host 192.168.101.14 --port 27117
1主 2从 直接配置
var config={
_id:"rs",
members:[
{_id:0,host:"192.168.101.14:27117"},
{_id:1,host:"192.168.101.14:27217"},
{_id:2,host:"192.168.101.14:27317"}
]};
要改成 1主 1从 1裁只需要更改配置项:
var config={
_id:"rs",
members:[
{_id:0,host:"192.168.101.14:27117"},
{_id:1,host:"192.168.101.14:27217"},
{_id:2, host:"192.168.101.14:27317", arbiterOnly:true}
]};
初始化执行
rs.initiate(config)
状态信息检查:
副本集配置信息:
rs.conf()
########################################################################
rs:SECONDARY> rs.conf()
{
"_id" : "rs",
"version" : 1,
"term" : 1,
"members" : [
{
"_id" : 0,
"host" : "192.168.101.14:27117",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : { },
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.101.14:27217",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : { },
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.101.14:27317",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : { },
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
}
],
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : { },
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("61fa5c42f42465c5c09dbab8")
}
}
rs:PRIMARY>
########################################################################
rs:PRIMARY> rs.status()
{
"set" : "rs",
"date" : ISODate("2022-02-02T10:28:23.296Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"votingMembersCount" : 3,
"writableVotingMembersCount" : 3,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1643797701, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2022-02-02T10:28:21.788Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1643797701, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1643797701, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1643797701, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2022-02-02T10:28:21.788Z"),
"lastDurableWallTime" : ISODate("2022-02-02T10:28:21.788Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1643797681, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2022-02-02T10:26:21.692Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(1643797570, 1),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1643797570, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2022-02-02T10:26:21.750Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2022-02-02T10:26:23.225Z")
},
"members" : [
{
"_id" : 0,
"name" : "192.168.101.14:27117",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 485,
"optime" : {
"ts" : Timestamp(1643797701, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-02-02T10:28:21Z"),
"lastAppliedWallTime" : ISODate("2022-02-02T10:28:21.788Z"),
"lastDurableWallTime" : ISODate("2022-02-02T10:28:21.788Z"),
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1643797581, 1),
"electionDate" : ISODate("2022-02-02T10:26:21Z"),
"configVersion" : 1,
"configTerm" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.101.14:27217",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 132,
"optime" : {
"ts" : Timestamp(1643797701, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1643797701, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-02-02T10:28:21Z"),
"optimeDurableDate" : ISODate("2022-02-02T10:28:21Z"),
"lastAppliedWallTime" : ISODate("2022-02-02T10:28:21.788Z"),
"lastDurableWallTime" : ISODate("2022-02-02T10:28:21.788Z"),
"lastHeartbeat" : ISODate("2022-02-02T10:28:21.820Z"),
"lastHeartbeatRecv" : ISODate("2022-02-02T10:28:21.333Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "192.168.101.14:27117",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 1
},
{
"_id" : 2,
"name" : "192.168.101.14:27317",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 132,
"optime" : {
"ts" : Timestamp(1643797701, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1643797701, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-02-02T10:28:21Z"),
"optimeDurableDate" : ISODate("2022-02-02T10:28:21Z"),
"lastAppliedWallTime" : ISODate("2022-02-02T10:28:21.788Z"),
"lastDurableWallTime" : ISODate("2022-02-02T10:28:21.788Z"),
"lastHeartbeat" : ISODate("2022-02-02T10:28:21.820Z"),
"lastHeartbeatRecv" : ISODate("2022-02-02T10:28:21.333Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "192.168.101.14:27117",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1643797701, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1643797701, 1)
}
########################################################################
测试副本集配置是否成功?
主节点创建数据
# 创建文章库
rs:PRIMARY> use articledb
switched to db articledb # 查看当前库
rs:PRIMARY> db
articledb # 插入数据
rs:PRIMARY> db.comment.insert({"articleid":"100000","content":"今天天气真好,阳光 明媚","userid":"1001","nickname":"Rose","createdatetime":new Date()})
WriteResult({ "nInserted" : 1 })
# 查询数据
rs:PRIMARY> db.comment.find()
{ "_id" : ObjectId("61fa681f159c1f7349b6ba43"), "articleid" : "100000", "content" : "今天天气真好,阳光 明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2022-02-02T11:16:47.403Z") }
rs:PRIMARY>
从节点登陆
docker exec -it replicate1 /bin/bash
mongo --host 192.168.101.14 --port 27217
查看DB发现报错:
rs:SECONDARY> show dbs;
uncaught exception: Error: listDatabases failed:{
"topologyVersion" : {
"processId" : ObjectId("61fa6758306bf1b65a46f320"),
"counter" : NumberLong(4)
},
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotPrimaryNoSecondaryOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1643800672, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1643800672, 1)
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs/<@src/mongo/shell/mongo.js:145:19
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:97:12
shellHelper.show@src/mongo/shell/utils.js:956:13
shellHelper@src/mongo/shell/utils.js:838:15
@(shellhelp2):1:1
rs:SECONDARY>
rs:SECONDARY> rs.slaveOk(true)
WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.
rs:SECONDARY>
语法已过世,需要更改成
rs.secondaryOk()
现在可以查看了:
rs:SECONDARY> show dbs;
admin 0.000GB
articledb 0.000GB
config 0.000GB
local 0.000GB
从节点插入数据发现还是被禁止了
rs:SECONDARY> use articledb
switched to db articledb
rs:SECONDARY> db.comment.find()
{ "_id" : ObjectId("61fa681f159c1f7349b6ba43"), "articleid" : "100000", "content" : "今天天气真好,阳光 明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2022-02-02T11:16:47.403Z") }
rs:SECONDARY> db.comment.insert({"_id":"1","articleid":"100001","content":"我们 不应该把清晨浪费在手机上,健康很重要,k一杯温水幸福你我 他。","userid":"1002","nickname":"相忘于江湖","createdatetime":new Date("2019-08- 05T22:08:15.522Z"),"likenum":NumberInt(1000),"state":"1"})
WriteCommandError({
"topologyVersion" : {
"processId" : ObjectId("61fa6758306bf1b65a46f320"),
"counter" : NumberLong(4)
},
"ok" : 0,
"errmsg" : "not master",
"code" : 10107,
"codeName" : "NotWritablePrimary",
"$clusterTime" : {
"clusterTime" : Timestamp(1643801243, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1643801243, 1)
})
rs:SECONDARY>
取消从节点读权限:
rs:SECONDARY> rs.slaveOk(false)
WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.
rs:SECONDARY> db.comment.find()
Error: error: {
"topologyVersion" : {
"processId" : ObjectId("61fa6758306bf1b65a46f320"),
"counter" : NumberLong(4)
},
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotPrimaryNoSecondaryOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1643801363, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1643801363, 1)
}
rs:SECONDARY>
仲裁节点里面只存放副本集的配置信息:
但是查看和从节点一样不允许
rs:ARBITER> show dbs
uncaught exception: Error: listDatabases failed:{
"topologyVersion" : {
"processId" : ObjectId("61fa675921f7d83dcdf21a72"),
"counter" : NumberLong(2)
},
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotPrimaryNoSecondaryOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs/<@src/mongo/shell/mongo.js:145:19
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:97:12
shellHelper.show@src/mongo/shell/utils.js:956:13
shellHelper@src/mongo/shell/utils.js:838:15
@(shellhelp2):1:1
rs:ARBITER>
mongoDB配置文件
sudo vim /etc/mongod.conf
# mongod.conf # for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/ # where to write logging data. 指定日志输出的配置
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log # Where and how to store data. 指定数据存储的位置
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
# engine:
# wiredTiger: # how the process runs 进程号文件配置
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo # network interfaces 网络接口配置
net:
port: 27017
bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting. #security: #operationProfiling: #replication: #sharding: ## Enterprise-Only Options #auditLog: #snmp:
【MongoDB】Re04 副本集 ReplicationSet的更多相关文章
- [DataBase] MongoDB (8) 副本集
MongoDB 创建副本集 MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从 ...
- mongodb创建副本集命令
mongodb创建副本集命令 ./mongod --replSet spock --dbpath ../data --smallfiles > config ={... "_id&qu ...
- MongoDB之副本集
MongoDB之副本集 一.简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库 ...
- MongoDB 复制(副本集)
MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从硬件故障和服务中断中恢复数据. ...
- Mongodb主从复制/ 副本集/分片集群介绍
前面的文章介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 Master-Slave 模式(主从复制),一种是 Replica Sets 模式(副本集). Mong ...
- MongoDB分片副本集生产环境部署-Windows版本
title: MongoDB分片副本集生产环境部署(Windows版本) date: 2022-10-29 17:21:11 tags: - 运维 系统架构 配置环境 系统都是windows 10 专 ...
- MongoDB 搭建副本集
副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成.通过Replication,将数据的更新由Primary ...
- [原创]在Docker上部署mongodb分片副本集群。
一.安装docker. 请参考:http://www.cnblogs.com/hehexiaoxia/p/6150584.html 二.编写dockerfile. 1.在根目录下创建mongod的do ...
- mongodb(副本集)
副本集是mongo下的一种集群配置方式: 1.通过oplog的方式将主节点数据同步到副本节点,oplog不记录查询语句(因为不改变数据): 2.mongo的副本集可以有一个主节点,多个副本节点,主节点 ...
- MongoDb的副本集搭建教程(个人操作笔记)
很多公司都在用MongoDb ,一直没有时间研究,最近好好的整了一下,做下笔记,直接上操作步骤,关于Mongodb的理论知识可以搜索其他资料,也可以联系我索取 mongoDB官方已经不建议使用主从模式 ...
随机推荐
- 🐞vue兄弟组件中方法互相调用
场景:父组件中同时引入两个子组件(A和B),此时B组件点击按钮需要调用A组件里面的方法 方案1:vue的事件总线 方案2:自定义事件($emit) 最终方案:方案2 父组件 具体操作 B组件上添加一个 ...
- 2023 Hive 面试宝典
先说一些废话 总结一下Hive面试宝典,方便读者快速过一遍Hive面试所需要的知识点 Hive的介绍 Hive和Hadoop的关系 Hive利用hdfs存储数据,利用MapReduce查询数据 Hiv ...
- 获取URL中查询参数 URL中动态参数
通过 req.query 对象,可以访问到客户端通过查询字符串的形式发送到服务器的参数 app.get('/',(req,res)=>{ console.log(req.query) }) .U ...
- LeetCode 332. Reconstruct Itinerary重新安排行程 (C++/Java)
题目: Given a list of airline tickets represented by pairs of departure and arrival airports [from, to ...
- ETL工具-nifi干货系列 第十七讲 nifi Input Port&Out Port 实战教程
1.端口(Port),包含输入端口(Input Port)和输出端口(Out Port ) 使用一个或多个处理组构建的数据流需要一种方式将处理组连接到其他数据流组件. 处理组和处理组之间可以通过使用端 ...
- bean反射比较两个bean属性值的修改明细
1.期望:将[username]从'111'改成'222';将[address]从'这是一个测试数据'改成'这是一个真实数据'; 2.导入jar <dependency> <grou ...
- es语法 rest api 模拟根据歌手,歌名,歌词来搜索demo
#创建索引songs_v1 PUT { - "acknowledged": true, "shards_acknowledged": true, "i ...
- Postman 的 Basic Auth 如何通过 Feign 实现
Postman 的 Basic Auth: 分析 根据以上图片分析: Postman 的 Authorization 实际为: header 中添加 Authorization: ******* ** ...
- scala实现二分查找
package day04.scala/** * Description: 使用二分查找法,查找元素为"70"的索引值 java */object Demo2SecondaySea ...
- 如何将自己的网站从 HTTP 的转换为 HTTPS 的
1. 获取 SSL/TLS 证书 首先,你需要获得一个 SSL/TLS 证书.你可以从以下来源之一获取证书: 免费证书: Let's Encrypt:一个免费的.自动化的证书颁发机构(CA),广泛使用 ...