1. 概述

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

2. 主备架构网络部署图

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

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

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

3. mongodb的主备架构痛点

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

4. mongodb主备部署方案

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

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等。

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

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

mongodb在双活(主备)机房的部署方案和切换方案设计的更多相关文章

  1. MongoDB入门三步曲3--部署技术:主备、副本集和数据分片

    mongodb部署--主备.副本及数据分片 主备复制 副本集 数据分片 主备复制 主备复制是最基本的一种多点部署方案,在读写分离.热备份.数据恢复等方面具有重要作用. 在真实的生产环境,主备库肯定需要 ...

  2. LVS+MYCAT+读写分离+MYSQL主备同步部署手册

    LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1          配置MYSQL主备同步…. 2 1.1       测试环境… 2 1.2       配置主数据库… 2 1.2.1  ...

  3. 【转载】LVS+MYCAT+读写分离+MYSQL主备同步部署手册(邢锋)

    LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1          配置MYSQL主备同步…. 2 1.1       测试环境… 2 1.2       配置主数据库… 2 1.2.1  ...

  4. POSTGRESQL主备部署模式

    一.预期目的 主数据库(Primary pg ,假定主机名为A,后文不再赘述)和备用数据库(Standby pg,假定主机名为B,后文不再赘述)之间的数据能够相互备份. 主数据库发生故障时备用数据库可 ...

  5. 阿里云ECS部署Redis主备哨兵集群遇到的问题

    一.部署 详细部署步骤:https://blog.csdn.net/lihongtai/article/details/82826809 Redis5.0版本需要注意的参数配置:https://www ...

  6. Centos7.6部署k8s v1.16.4高可用集群(主备模式)

    一.部署环境 主机列表: 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 master01 7.6. ...

  7. Oracle Dataguard HA (主备,灾备)方案部署调试

    包括: centos6.5 oracle11gR2 DataGuard安装 dataGuard 主备switchover角色切换 数据同步测试 <一,>DG数据库数据同步测试1,正常启动主 ...

  8. Oracle 11.2.0.4.0 Dataguard部署和日常维护(5)-Datauard 主备切换和故障转移篇

    1. dataguard主备切换   1.1. 查看当前主备库是否具备切换条件 on slave select sequence#,first_time,next_time,archived,appl ...

  9. KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(异机复制)

    案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...

随机推荐

  1. C语言编译器开发之旅(开篇)

    编译器写作之旅   最近在Github上看到一个十分有趣的项目acwj(A Compiler Writing Journey),一个用C语言编写编译器的项目.身为一个程序员,这在我看来是一件十分酷的事 ...

  2. Django(46)drf序列化类的使用(ModelSerializer)

    前言 我们上篇文章使用到了Serializer类,可能有小伙伴说太过复杂,那么本篇就为大家带来更加简便的序列化类ModelSerializer ModelSerializer 先来看下ModelSer ...

  3. [leetcode] 75. 分类颜色(常数空间且只扫描一次算法)

    75. 分类颜色 我们直接按难度最高的要求做:你能想出一个仅使用常数空间的一趟扫描算法吗? 常数空间 只能扫描一趟.注意,是一趟,而不是O(n) 题中只会出现3个数字:0,1,2.换句话说,0肯定在最 ...

  4. 多平台Gstreamer Multiplatform

    多平台Gstreamer Multiplatform GStreamer可在所有主要操作系统上运行,例如Linux,Android,Windows,Max OS X,iOS,以及大多数BSD,商业Un ...

  5. 从单一图像中提取文档图像:ICCV2019论文解读

    从单一图像中提取文档图像:ICCV2019论文解读 DewarpNet: Single-Image Document Unwarping With Stacked 3D and 2D Regressi ...

  6. OFRecord 数据格式

    OFRecord 数据格式 深度学习应用需要复杂的多阶段数据预处理流水线,数据加载是流水线的第一步,OneFlow 支持多种格式数据的加载,其中 OFRecord 格式是 OneFlow 原生的数据格 ...

  7. 深度学习LiDAR定位:L3-Net

    深度学习LiDAR定位:L3-Net 摘要 本文提出L3-Net--一种新颖的基于学习的LiDAR定位系统,可实现厘米级的定位,与现有最高水平的传统定位算法相媲美.与传统定位算法不同,本文创新地实现了 ...

  8. NVIDIA GPUs上深度学习推荐模型的优化

    NVIDIA GPUs上深度学习推荐模型的优化 Optimizing the Deep Learning Recommendation Model on NVIDIA GPUs 推荐系统帮助人在成倍增 ...

  9. 利用NVIDIA-NGC中的MATLAB容器加速语义分割

    利用NVIDIA-NGC中的MATLAB容器加速语义分割 Speeding Up Semantic Segmentation Using MATLAB Container from NVIDIA NG ...

  10. 什么是视觉Visual SLAM

    什么是视觉Visual SLAM What Is Visual SLAM? What are the origins of visual SLAM? and what are some other a ...