mongodb在双活(主备)机房的部署方案和切换方案设计「建议收藏」

mongodb在双活(主备)机房的部署方案和切换方案设计「建议收藏」mongodb的双机房部署方案和切换方案设计

mongodb在双活(主备)机房的部署方案和切换方案设计

1. 概述

现在很多高可用系统为了应对极端情况,比如主机宕机、网络故障以及机房宕机等灾难的发生,通常会部署主备架构(双机房),或者双活架构(双机房),甚至多活架构(三个机房或者以上),mongodb天然就适合部署双机房或者多机房,但是在发生机房宕机灾难时,也会遇到无法选举主节点的问题,本文重点讨论在主备或者双活架构下的mongodb的部署方案和切换方案,下文中的讨论以主备架构为例(双活同理)。

2. 主备架构网络部署图

在主备架构部署方案中,用户请求都是路由到主机房,备用机房无用户请求,为了简化示意,这里先把cdn、dns、waf等部分略去,重点突出应用和mongo集群内部节点的部署结构,如下图:

mongodb在双活(主备)机房的部署方案和切换方案设计「建议收藏」

从上图可以看到,负载均衡和应用服务部分都是主备架构,mongodb集群是一体的(两边都会处理请求),没有主备之分,只是部署在两个机房而已。

当然,这种方式下,mongodb集群的资源利用率会高一些,不存在上层备用机房的应用服务的资源闲置浪费的问题。

3. mongodb的主备架构痛点

在主备架构环境中,mongodb的高可用部署方案,推荐复制组内的节点数是奇数(比如3个节点,1主2从),此时存在一个机房部署2个节点,一个机房部署1个节点,当部署2个节点的机房宕机时,由于另外一个机房只有1个节点,而mongodb的选举协议是raft一致性协议,此时是无法选举出主节点的(要求存活节点数大于原节点数的1/2),导致mongodb服务的不可用,示意图如下:

mongodb在双活(主备)机房的部署方案和切换方案设计「建议收藏」

 

4. mongodb主备部署方案

 针对章节3中遇到的问题,我们调整了部署方案,即在备用机房准备一个备用节点,平时是不启动的,仅在主机房灾难发生时,才启动该备用节点,示意图如下:

mongodb在双活(主备)机房的部署方案和切换方案设计「建议收藏」

 

5. mongodb的主备切换方案

部署方案已经有了,下面谈一下主备切换方案,当主机房发生灾难时,我们要解决两个问题:

1. 怎么启动先前的备用节点。

2. 怎么让刚刚启动的备用节点加入到复制组中,否则是无法参与主节点选举的。

启动备用节点

在备用节点上准备好启动脚本,然后使用运维软件(例如saltstack)发送启动命令,即可启动备用节点。

备用节点加入复制组

 我们知道如果要把一个新的节点加入复制组,是需要在主节点执行rs.add命令的,但是在灾难发生时,由于还没有主节点,是无法使用这个办法的,因此需要换一个思路,即让备用节点“替换”原主机房的从节点,这里的“替换”是指让复制组的其他成员认为该备用节点,就是原来的从节点,技术方案如下:

1. 首先复制组内的成员,在加入复制组时,使用域名替换ip的方式,例如:rs.add(“shardA1.mongodb.net:27017”),同时修改mongodb集群所有服务器的/etc/hosts文件,配置shardA1.mongodb.net和IP的映射关系。

2. 在灾难发生时,先把mongodb集群内所有服务器的/etc/hosts中shardA1.mongodb.net对应的IP修改为备用节点的IP,再启动备用节点,此时复制组内的其他节点能快速连上新的节点。

解释一下,为什么把域名和IP的映射关系配置到hosts文件而不是配置到dns服务器,主要是考虑到修改hosts文件生效更快,从而快速选举出主节点。

小结

1. 该方案比较大的亮点是通过修改/etc/hosts文件的方式,让新的节点可以加入集群,从而快速完成主节点选举。

2. 该方案是一个比较通用的方案,适合很多分布式的系统使用,比如zookeeper等。

当然,在实施时,需要考虑主备双向切换,主备切换后监控原主机房的原从节点是否被启动等异常情景。

以上方案有任何不妥之处,欢迎斧正。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6025.html

(0)
上一篇 2023-04-18
下一篇 2023-04-19

相关推荐

  • 关于用python读取tle根数的信息

    关于用python读取tle根数的信息方法/步骤

    2023-10-31
    122
  • 日志同步工具_日志数据库

    日志同步工具_日志数据库本文主要针对日志数据接入数据仓库场景进行设计, 同时介绍了下在设计接入时的一些细节,针对可能出现的问题进行必要的处理.

    2023-05-04
    163
  • MySQL事务隔离级别中可重复读与幻读「建议收藏」

    MySQL事务隔离级别中可重复读与幻读「建议收藏」每次谈到数据库的事务隔离级别,大家一定会看到这张表. 其中,可重复读这个隔离级别,有效地防止了脏读和不可重复读,但仍然可能发生幻读,可能发生幻读就表示可重复读这个隔离级别防不住幻读吗? 我不管从数据…

    2023-03-13
    156
  • MySQL 间隙锁导致的死锁场景分析[亲测有效]

    MySQL 间隙锁导致的死锁场景分析[亲测有效]mysql间隙锁引起的死锁分析

    2023-06-18
    149
  • Python实现HTML文件自动生成

    Python实现HTML文件自动生成在现代化的互联网时代,网站和应用程序经常需要动态地生成HTML代码协作网页的呈现。在Python中,我们可以轻松地使用HTML模板来自动生成HTML文件,减少手动开发HTML文件的时间和人力成本。

    2023-12-05
    125
  • Python Tuples: 简洁高效的多元素数据结构

    Python Tuples: 简洁高效的多元素数据结构Python中的元组(Tuples)是一个有序的多元素集合,可以存储不同类型的数据。与列表相比,元组是一个不可变对象,即一旦创建就不能修改内容。元组被广泛应用于函数返回多个值或者在字典作为键使用的情况等。下面我们将通过如何创建、访问、修改以及结合其他对象使用等多个方面对Python元组进行详细讲解。

    2024-03-16
    77
  • Python工程师技能要求

    Python工程师技能要求在当前的软件开发行业中,Python已经成为了最热门的语言之一。Python与其它语言相比,具有易读易学的特点,并且拥有非常丰富的库和工具可以使用。在这篇文章中,我们将会介绍Python工程师的技能要求。

    2024-06-15
    65
  • Python异常抛出

    Python异常抛出Python是一种高级语言,在编写代码时会存在各种潜在的错误,例如语法错误、拼写错误、逻辑错误等。在程序运行过程中也会存在各种异常情况,如文件读写异常、网络连接异常等。为了使程序能够更好地处理这些异常情况,Python提供了异常处理机制,允许开发者对异常进行捕获和处理。

    2024-09-12
    27

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注