【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官方已经不建议使用主从模式 ...
随机推荐
- lodash已死?radash库方法介绍及源码解析 —— 判断方法篇
前言 大家好,我是阿瓜.一个励志分享更多技术的前端瓜 ~ 我们已经分享了 radash 库中数组.对象等相关的方法,大家感兴趣的可以前往主页查看阅读: 或许你最近在某个地方听过或者看过 radash ...
- 算法学习笔记(13): Manacher算法
Manacher算法 形象的被译为马拉车算法 这个算法用于处理简单的回文字符串的问题.可以在 \(O(n)\) 的复杂度内处理出每一个位置为中心的回文串的最长长度. 为了避免出现偶数长度的回文串,导致 ...
- kettle从入门到精通 第五十二课 ETL之kettle Avro output
1.上一节课我们学习了avro input,本节课我们一起学习下avro out步骤. 本节课通过json input 加载json文件,通过avro out 生成avro二进制文件,写日志步骤打印日 ...
- Ubuntu Server LTS 修改网卡ip地址、固定IP
Ubuntu Server LTS 修改网卡ip地址方式.固定IP. 18.04 之前版本通过修改/etc/network/interfaces 方式,18.04 版本开始通过netplan 方式: ...
- vitual box 安装centos7
vitual box下载地址: https://www.virtualbox.org/wiki/Downloads centos7下载地址: CentOS Linux 选择7-2009,x86-64 ...
- EF 从设计器改为 DB First时遇到 Keyword not supported: 'data source'.
EF 从设计器改为 DB First时遇到 Keyword not supported: 'data source'. 解决方法: 把providerName="System.Data.En ...
- SpringBoot启动报错:Parameter 0 of method hmset in com.qcby.rbac.util.RedisUtils required a bean of type
SpringBoot启动报错,报错信息如下: 报错是由于A类中定义了含参数的构造函数,Spring自动构造和注入时未为该Bean传入参数,引起报错. 查了很多资料,最后发现,我是因为注释的时候没有把@ ...
- 企业快速落地IT服务管理体系的六大关键步骤
许多企业在实施信息化战略时,一味地追求"技术高消费"而忽视了对信息技术的管理和内部业务流程的变革,侧重点仍然只是事后的技术支持和故障解决方面,随着企业对于信息技术的依赖程度的加重, ...
- Oh-My-Zsh 提示符只显示当前路径,不需要修改主题文件
我真是服了.就这么一个简单的小问题我在网上找了一个多小时,一大堆 CSDN 文章都是抄 同一篇博客 的教程,所有的博客都要我去把 ~/.oh-my-zsh/themes/*.zsh-theme 文件里 ...
- Stable Diffusion 生成个性图片指南
在当今人工智能领域,midjourney无疑是生成图片的王者,但是苦于付费才能使用,今天我就给大家分享一下midjourney平替stable diffusion,实现本地生成不逊色于midjourn ...