iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MongoDB副本集的示例分析
  • 763
分享到

MongoDB副本集的示例分析

2024-04-02 19:04:59 763人浏览 独家记忆
摘要

小编给大家分享一下mongoDB副本集的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实验环境使用的Mongodb版本为

小编给大家分享一下mongoDB副本集的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!


实验环境使用的Mongodb版本为mongodb-linux-x86_64-2.6.0
由三台虚拟机搭建,配置为单核,1G内存。
实验环境如下:
MongoDB副本集的示例分析
MongoDB的副本集不同于以往的主从模式。
在集群Master故障的时候,副本集可以自动投票,选举出新的Master,并引导其余的Slave服务器连接新的Master,
而这个过程对于应用是透明的。可以说MongoDB的副本集是自带故障转移功能的主从复制。

1 相对于传统主从模式的优势
传统的主从模式,需要手工指定集群中的Master。
如果Master发生故障,一般都是人工介入,指定新的Master。
这个过程对于应用一般不是透明的,往往伴随着应用重新修改配置文件,重启应用服务器等。
MongoDB副本集的示例分析
而MongoDB副本集,集群中的任何节点都可能成为Master节点。
一旦Master节点故障,则会在其余节点中选举出一个新的Master节点。
并引导剩余节点连接到新的Master节点。这个过程对于应用是透明的。
MongoDB副本集的示例分析

2 Bully选举算法
Bully算法是一种协调者(主节点)竞选算法,主要思想是集群的每个成员都可以声明它是主节点并通知其他节点。
别的节点可以选择接受这个声称或是拒绝并进入主节点竞争。被其他所有节点接受的节点才能成为主节点。
节点按照一些属性来判断谁应该胜出。这个属性可以是一个静态ID,也可以是更新的度量像最近一次事务ID(最新的节点会胜出)
他的选举过程大致如下:
? 得到每个服务器节点的最后操作时间戳。每个mongodb都有oplog机制会记录本机的操作,方便和主服务器进行对比数据是否同步还可以用于错误恢复。
? 如果集群中大部分服务器down机了,保留活着的节点都为 secondary状态并停止,不选举了。
? 如果集群中选举出来的主节点或者所有从节点最后一次同步时间看起来很旧了,停止选举等待人来操作。
? 如果上面都没有问题就选择最后操作时间戳最新(保证数据是最新的)的服务器节点作为主节点。

选举的触发条件
初始化一个副本集时。
副本集和主节点断开连接,可能是网络问题。
主节点挂掉。
人为介入,比如修改节点优先级等

选举还有个前提条件,参与选举的节点数量必须大于副本集总节点数量的一半,如果已经小于一半了所有节点保持只读状态。

3 搭建副本集集群
每个虚拟机都使用如下的配置文件启动实例:
dbpath        =/home/lihuilin/mongodata
smallfiles      =true
replSet        =mvbox
然后在任意一台虚拟机登陆mongo,输入如下设置
config = { _id:"mvbox", members:[
{_id:0,host:"192.168.1.1:27017"},
{_id:1,host:"192.168.1.2:27017"},
{_id:2,host:"192.168.1.3:27017"}]
}
rs.initiate(config);
可以看到副本集已经生效

MongoDB副本集的示例分析

可以使用rs.status()查看集群状态,或者rs.isMaster()
MongoDB副本集的示例分析

4 更改节点优先级
修改节点的优先级可以触发重新选举,这样可以人工指定主节点。
使用如下命令,在主节点登录,将192.168.1.3提升为Master。
rs.conf();
cfg=rs.conf();
cfg.members[0].priority=1
cfg.members[1].priority=1
cfg.members[2].priority=10
rs.reconfig(cfg);
需要注意的是,修改节点优先级需要登录Master节点运行。否则报错。
MongoDB副本集的示例分析

再次查看集群状态,可以看到192.168.1.3已经作为Master运行
MongoDB副本集的示例分析


5 节点类型
MongoDB的节点类型有主节点(Master),副本节点(Slave或者称为Secondary),仲裁节点,Secondary-Only节点,Hidden节点,Delayed节点和Non-Voting节点。

仲裁节点不存储数据,只是负责故障转移的群体投票,这样就少了数据复制的压力。

Secondary-Only:不能成为primary节点,只能作为secondary副本节点,防止一些性能不高的节点成为主节点。

Hidden:这类节点是不能够被客户端制定IP引用,也不能被设置为主节点,但是可以投票,一般用于备份数据。

Delayed:可以指定一个时间延迟从primary节点同步数据。主要用于备份数据,如果实时同步,误删除数据马上同步到从节点。所以延迟复制主要用于避免用户错误。

Non-Voting:没有选举权的secondary节点,纯粹的备份数据节点。

6 设置隐藏节点(Hidden)
隐藏节点可以在选举中投票,但是不能被客户端引用,也不能成为主节点。也就是说这个节点不能用于读写分离的场景。
将192.168.1.3设置为隐藏节点。
注意,只有优先级为0的成员才能设置为隐藏节点。
如果设置优先级不为0的节点为隐藏节点,则报错如下
MongoDB副本集的示例分析

使用如下命令设置隐藏节点
cfg=rs.conf();
cfg.members[0].priority=10
cfg.members[1].priority=1
cfg.members[2].priority=0
cfg.members[2].hidden=1
rs.reconfig(cfg);
设置完成之后,使用rs.status()查看该节点还是SECONDARY状态。
但是通过rs.isMaster()和rs.conf()可以看到这个节点的变化。
rs.isMaster()的hosts中192.168.1.3节点已经不可见
MongoDB副本集的示例分析
并且rs.conf()显示该节点状态为hidden

MongoDB副本集的示例分析


7 设置仲裁节点
仲裁节点不存储数据,只是用于投票。所以仲裁节点对于服务器负载很低。
节点一旦以仲裁者的身份加入集群,他就只能是仲裁者,无法将仲裁者配置为非仲裁者,反之也是一样。
另外一个集群最多只能使用一个仲裁者,额外的仲裁者拖累选举新Master节点的速度,同时也不能提供更好的数据安全性。
初始化集群时,设置仲裁者的配置如下
config = { _id:"mvbox", members:[
{_id:0,host:"192.168.1.1:27017"},
{_id:1,host:"192.168.1.2:27017",arbiterOnly:true},
{_id:2,host:"192.168.1.3:27017"}]
}
使用仲裁者主要是因为MongoDB副本集需要奇数成员,而又没有足够服务器的情况。在服务器充足的情况下,不应该使用仲裁者节点。

8 设置延迟复制节点
MongoDB官方没有增量备份方案,只有一个导出的工具mongodump。
他不能像数据库一样,通过binlog或者归档日志将数据推到事故发生的前一刻。
假设每天凌晨2点使用mongodump备份,而下午5点发生事故,数据库损毁,则凌晨2点到下午5点的数据全部都会丢失。
虽然副本集可以一定程度避免这个问题,但是默认情况下不能避免人为的失误。
比如没有指定筛选条件删除了全部的数据。副本节点会应用这个命令,删除所有副本节点的数据。
在这个场景下,可以使用延迟节点,它会延迟应用复制。
如果主节点发生了人为的失误,而这个操作因为延迟的原因,还没有应用在延迟节点。
这个时候,修改延迟节点的优先级为最高级,使他成为新的Master服务器。

延迟节点的优先级必须为0.这个和hidden节点是一样的。
设置192.168.1.2为延迟节点
cfg=rs.conf();
cfg.members[1].priority=0
cfg.members[1].slaveDelay=3600
rs.reconfig(cfg);
slaveDelay的单位是秒
在192.168.1.1主节点删除一个集合所有数据,模拟人为失误。

MongoDB副本集的示例分析
在192.168.1.3查看,发现数据已经全部丢失。
MongoDB副本集的示例分析
而在192.168.1.2延迟节点,可以看到因为延迟复制的缘故,数据还在。
MongoDB副本集的示例分析
这个时候千万不要提升延迟节点的优先级。因为这样他会立即应用原主节点的所有操作,并成为新的主节点。这样误操作就同步到了延迟节点。
首先,关闭副本集中其他的成员,除了延迟节点。
删除其他成员数据目录中的所有数据。确保每个其他成员的数据目录都是空的(除了延迟节点)
重启其他成员,他们会自动从延迟节点中恢复数据。


9 设置Secondary-Only节点
Priority为0的节点永远不能成为主节点,所以设置Secondary-only节点只需要将其priority设置为0.

10 设置Non-Voting节点
假设设置192.168.1.1不能投票,则使用如下命令
cfg=rs.conf();
cfg.members[0].votes=0;
rs.reconfig(cfg);


11 副本集成员状态
副本集成员状态指的是rs.status()的stateStr字段
MongoDB副本集的示例分析
STARTUP:刚加入到复制集中,配置还未加载

STARTUP2:配置已加载完,初始化状态

RECOVERING:正在恢复,不适用读

ARBITER: 仲裁者

DOWN:节点不可到达

UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构,脑裂

REMOVED:移除复制集

ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态

FATAL:出错。查看日志grep “replSet FATAL”找出错原因,重新做同步

PRIMARY:主节点

SECONDARY:备份节点


12 读写分离
如果Master节点读写压力过大,可以考虑读写分离的方案。

MongoDB副本集的示例分析




不过需要考虑一种场景,就是主服务器的写入压力非常的大,所以副本节点复制的写入压力同样很大。
这时副本节点如果读取压力也很大的话,根据MongoDB库级别读写锁的机制,
很可能复制写入程序拿不到写锁,从而导致副本节点与主节点有较大延迟。

如果进行读写分离,首先需要在副本节点声明其为slave,
MongoDB副本集的示例分析
然后在JAVA程序中进行设置
MongoDB副本集的示例分析
其中的ReadRreference有几种设置,


MongoDB副本集的示例分析
primary:默认参数,只从主节点上进行读取操作;

primaryPreferred:大部分从主节点上读取数据,只有主节点不可用时从secondary节点读取数据。

secondary:只从secondary节点上进行读取操作,存在的问题是secondary节点的数据会比primary节点数据“旧”。

secondaryPreferred:优先从secondary节点进行读取操作,secondary节点不可用时从主节点读取数据;

nearest:不管是主节点、secondary节点,从网络延迟最低的节点上读取数据。


以上是“MonGoDB副本集的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: MongoDB副本集的示例分析

本文链接: https://www.lsjlt.com/news/65195.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MongoDB副本集的示例分析
    小编给大家分享一下MongoDB副本集的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实验环境使用的Mongodb版本为...
    99+
    2024-04-02
  • MongoDB中副本集的示例分析
    这篇文章主要介绍了MongoDB中副本集的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:replication set复制...
    99+
    2024-04-02
  • MongoDB中副本集丢失数据的示例分析
    这篇文章主要为大家展示了“MongoDB中副本集丢失数据的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MongoDB中副本集丢失数据的示例分析”这篇文...
    99+
    2024-04-02
  • MongoDB 副本集的搭建过程
    目录1、创建节点目录2、创建配置文件,配置文件内容如下:3、启动三个实例4、初始化集群5、登录到实例上,使用rs.conf查看实例状态。7、登录到其中一台节点上,添加默认账号即可8、...
    99+
    2024-04-02
  • 如何为MongoDB添加分片副本集
    目录01 新建副本集02 副本集添加到已有的集群中(addShard)03 添加分片时间标签(addShardTag)04 给打好的标签添加具体的数值范围(addTagRange)0...
    99+
    2024-04-02
  • mongodb如何更换副本集
    要更换MongoDB副本集,需要遵循以下步骤:1. 添加新副本集成员:首先,在新服务器上安装MongoDB,并确保它可以连接到现有的...
    99+
    2023-08-23
    mongodb
  • 怎么在MongoDB中添加分片副本集
    这篇文章将为大家详细讲解有关怎么在MongoDB中添加分片副本集,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。流程:新建分片副本集使用addShard命令将分片副本集添加到集群中使用addS...
    99+
    2023-06-14
  • Mongodb中怎么实现副本集和分片
    这篇文章将为大家详细讲解有关Mongodb中怎么实现副本集和分片,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python只用mongo事务在python中...
    99+
    2024-04-02
  • MongoDB中怎么配置副本集
    MongoDB中怎么配置副本集,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。环境准备三台服务器,地址分别是:192.168.248.128192.168.248.13519...
    99+
    2023-06-19
  • MongoDB中怎么切换副本集
    MongoDB中怎么切换副本集,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。MongoDB 副本集切换方法1、rs.stepD...
    99+
    2024-04-02
  • MongoDB中怎么实现副本集
    MongoDB中怎么实现副本集,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 1、环境节点IP操作系统Mong...
    99+
    2024-04-02
  • springboot怎么连接mongodb副本集
    要连接MongoDB副本集,需要在Spring Boot应用程序中配置MongoDB的副本集连接。以下是连接MongoDB副本集的步...
    99+
    2024-04-17
    springboot mongodb
  • MongoDB中怎么管理副本集
    这期内容当中小编将会给大家带来有关MongoDB中怎么管理副本集,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 1)诊断副本集中的机器,可以...
    99+
    2024-04-02
  • Linux下如何配置MongoDB副本集
    这篇文章给大家分享的是有关Linux下如何配置MongoDB副本集的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MongoDB复制是将数据同步在多个服务器的过程。复制提供了数据的冗余备份,并在多个服务器上存储数据...
    99+
    2023-06-27
  • MongoDB 使用副本集备份添加新的辅助副本成员
    问题描述: 在生产环境中,当辅助副本成员的读压力很大时,可通过添加新的辅助副本成员来缓解压力。为了能实现主副本成员不停机,并减轻主副本成员的压力,可在辅助副本成员上mongodump备份数据;为了...
    99+
    2024-04-02
  • MongoDB副本集的常用操作及原理
    下面的操作主要分为两个部分: 修改节点状态 主要包括: 将Primary节点降级为Secondary节点冻结Secondary节点强制Secondary节点进入维护模式2. 修改副本集的配置 添加节点删...
    99+
    2024-04-02
  • 如何进行MongoDB副本集搭建
    如何进行MongoDB副本集搭建,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们之前的案例都是在单个节点上实现的,在生产环境中这种做法是有风险的,如果服务宕机...
    99+
    2023-06-19
  • 怎么搭建一个MongoDB 副本集
    怎么搭建一个MongoDB 副本集?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、创建节点目录mkdir -p /data/mongo_28018/{...
    99+
    2023-06-14
  • MongoDB如何删除添加副本集并修改副本集IP等信息
    本篇文章为大家展示了MongoDB如何删除添加副本集并修改副本集IP等信息,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。MongoDB 删除,添加副本集,并修改副本...
    99+
    2024-04-02
  • MongoDB中固定集合capped collection的示例分析
    这篇文章将为大家详细讲解有关MongoDB中固定集合capped collection的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一 . 什么是固定集合Mon...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作