【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官方已经不建议使用主从模式 ...
随机推荐
- 安装配置intelli IDEA
效果 操作 去官网下载安装包 下载 Intelli IDEA 下载插件 插件下载 打开IDEA安装目录下的bin目录,找到idea64.exe.vmoptions配置文件 添加配置 打开indea,添 ...
- css3颜色模式 圆角的实现 width的属性值 触发怪异盒模型
Css颜色模式: rgb(255,0,0) rgba(255,0,0,0.5)(0.5是透明度) hsl(58%,56%)色彩饱和度 hala() border-image url(路径) 向内偏 ...
- 三维API sheder 基础
这个shader 是靠三维数学 影响 二维像素 导致像素颜色改变 它是每个像素走一遍脚本算法 写的时候注意 语言格式 写错了 shader脚本是不能用的,根本就不好使这个 可以用区域 用xyz y为0 ...
- OOM异常的4种可能分析及常见的OOM异常演示
OOM异常的4种可能分析及常见的OOM异常演示 OOM异常: OutOfMemoryError 1.JAVA堆溢出JAVA堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到这些对象之间 ...
- C#/.NET/.NET Core拾遗补漏合集(24年6月更新)
前言 在这个快速发展的技术世界中,时常会有一些重要的知识点.信息或细节被忽略或遗漏.<C#/.NET/.NET Core拾遗补漏>专栏我们将探讨一些可能被忽略或遗漏的重要知识点.信息或细节 ...
- LangChain结合LLM做私有化文档搜索
我们知道LLM(大语言模型)的底模是基于已经过期的公开数据训练出来的,对于新的知识或者私有化的数据LLM一般无法作答,此时LLM会出现"幻觉".针对"幻觉"问题 ...
- 剖析 Kafka 消息丢失的原因
目录 前言 一.生产者导致消息丢失的场景 场景1:消息体太大 解决方案 : 1.减少生产者发送消息体体积 2.调整参数max.request.size 场景2:异步发送机制 解决方案 : 1.使用带回 ...
- CentOS7离线安装devtoolset-9并编译redis6.0.5
首先参照https://www.cnblogs.com/wdw984/p/13330074.html,来进行如何安装Centos和离线下载rpm包. 离线下载jemalloc,上传到CentOS的/d ...
- 算法金 | 来了,pandas 2.0
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今日 210+/10000,内含 Pandas 是一个强大的数据分析库,广泛应用于科学 ...
- 聊天chat封装
说明:连接状态,客户端ID,在线状态,连接中,当前聊天会话ID,当前聊天对象ID,总未读数, 聊天功能实现首先要保证当前用户已经登录状态 监听登录时更新会话列表 监听退出时更新会话列表 发起聊天的时候 ...