专栏首页Linyb极客之路mongodb4.0高可用之副本集

mongodb4.0高可用之副本集

mongodb副本集的定义

副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成。通过Replication,将数据的更新由Primary推送到其他实例上,在一定的延迟之后,每个MongoDB实例维护相同的数据集副本。通过维护冗余的数据库副本,能够实现数据的异地备份,读写分离和自动故障转移

副本集角色

主节点(Primary)

接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。默认读请求也是发到Primary节点处理的,可以通过修改客户端连接配置以支持读取Secondary节点。

副本节点(Secondary)

与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。

仲裁者(Arbiter)

不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器

副本集特征

· N 个节点的集群 · 任何节点可作为主节点 · 所有写入操作都在主节点上 · 自动故障转移 · 自动恢复

搭建副本集的注意点

  1. 最小构成是:primary,secondary,arbiter,一般部署是:primary,2 secondary。
  2. 成员数应该为奇数,如果为偶数的情况下添加arbiter,arbiter不保存数据,只投票。
  3. mongodb4.0+版本,最大50 members,但是只能有 7 voting members,其他是non-voting members。

副本集架构图

由图可以看到客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。我们看一下主服务器挂掉后的架构:

副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。

使用场景

  • 数据冗余,用做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。
  • 读写分离,读的请求分流到副本上,减轻主节点的读压力

副本集搭建

为了快速搭建,我是采用docker-compose来构建mongodb副本集,在用docker-compose构建之前,需要安装一下docker和docker-compose。默认在centos7安装 1、docker安装教程可以查看如下链接

https://www.cnblogs.com/qingyunzong/p/9011006.html

2、docker-compose安装教程可以查看如下链接

https://docs.docker.com/compose/install/

3、docker-compose常用命令 通过docker-compose --help来查看

4、编写docker-compose.yml

version: '2.1'
services:
  master:
    image: docker.io/mongo
    container_name: master
    restart: always
    privileged: true
    ports:
    - 27017:27017
    volumes:
    - ./data/master:/data/db
    command:  mongod --dbpath /data/db --replSet rs --oplogSize 128
  slave1:
    image: docker.io/mongo
    container_name: slave1
    restart: always
    privileged: true
    ports:
    - 27018:27017
    volumes:
    - ./data/slave1:/data/db
    command: mongod --dbpath /data/db --replSet rs --oplogSize 128
  slave2:
    image: docker.io/mongo
    container_name: slave2
    restart: always
    privileged: true
    ports:
    - 27019:27017
    volumes:
    - ./data/slave2:/data/db
    command: mongod --dbpath /data/db --replSet rs --oplogSize 128

5、在 docker-compose.yml 所在路径下执行该命令 compose 就会自动构建镜像并使用镜像启动容器

docker-compose up -d // 后台启动并运行容器

以上就是使用docker-compose构建mongodb副本集的过程,如果对docker-compose不熟的朋友,也可以使用如下链接,直接通过shell操作搭建

https://www.linuxidc.com/Linux/2017-11/148740p3.htm。

或者可以直接通过docker来搭建,具体教程可以参考如下链接

https://blog.csdn.net/dengzhongmingabc/article/details/81188613

副本集的一些操作

rs.status()   //查看成员的运行状态等信息

rs.config()    //查看配置信息

rs.slaveOk()  //允许在SECONDARY节点上进行查询操作,默认从节点不具有查询功能

rs.isMaster()  //查询该节点是否是主节点

rs.add({})   //添加新的节点到该副本集中

rs.remove()   //从副本集中删除节点

总结

本文简要论述mongodb副本集一些基本概念和搭建,写这篇文章的目的,主要是为了下篇文章springboot实战之mongodb事务支持做铺垫。因为mongodb4.0+才支持副本集事务,也就意味着如果想在springboot启用mongodb事务,其mongodb的版本至少要>=4,而且其架构是使用了副本集。不过4.0的事务存在最大修改16MB、事务执行时间不能过长的限制。在我写这篇文章的时候,我发现mongodb的最新版本4.2,已经可以支持分布式事务,包括分片事务,而不仅仅局限于多文档副本集事务,感兴趣的朋友可以关注下

https://docs.mongodb.com/manual/core/transactions/

参考文档

https://docs.mongodb.com/manual/replication/

mongodb副本集的原理及命令

https://blog.csdn.net/caiqiandu/article/details/89928151

mongodb副本集高可用架构

https://www.cnblogs.com/littleatp/p/8562842.html

本文分享自微信公众号 - Linyb极客之路(gh_c420b2cf6b47),作者:linyb极客之路

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 企业级SpringBoot与Dubbo的并用

    SpringBoot越来越热门以至于达到烂大街可见的程度,而Dubbo这个基于二进制的微服务框架又捐献给Apache孵化,如果不会如何使用那么是不是很不好意思呢...

    lyb-geek
  • Spring Boot REST国际化

    正如你看到:响应会根据请求中传递的“ Accept-Language ”标头的值而有所不同。这样,我们不需要检查每个控制器方法中请求中传递的内容,然后将其进一步...

    lyb-geek
  • 使用lazyInit缩短Spring Boot启动时间

    Spring Boot可以进行有助于相关针对项目的设置,包括最常见的默认设置和随时可用的配置,这无疑是很棒的,因为它节省了宝贵的时间 然而,对于框架的新手来说,...

    lyb-geek
  • Flink1.9整合Kafka实战

    我们知道可以自己来开发Source 和 Sink ,但是一些比较基本的 Source 和 Sink 已经内置在 Flink 里。

    王知无
  • Netty 源码深度解析(九) - 编码概述1 抽象类 MessageToByteEncoder2 抽象类 MessageToMessageEncoder一个java对象最后是如何转变成字节流,写到s

    编码器实现了ChannelOutboundHandler,并将出站数据从 一种格式转换为另一种格式,和我们方才学习的解码器的功能正好相反。Netty 提供...

    JavaEdge
  • Flink1.9整合Kafka

    我们知道可以自己来开发Source 和 Sink ,但是一些比较基本的 Source 和 Sink 已经内置在 Flink 里。

    实时计算
  • R语言基础绘图教程——第9章:火山图和QQ图

    DoubleHelix
  • 研究人员探索了对以太坊区块链的日食攻击

    eclipse攻击是对区块链的网络级攻击,攻击者基本上控制了对等网络,模糊了节点对区块链的视图。

    首席架构师智库
  • 用tsunami-udp加速网络传输

    tsunami-udp 是一款专为网络加速诞生的小工具。思路很简单,使用TCP进行传输控制、用UDP进行数据传输。

    用户5807183
  • Hexo之魔法操作

    这篇博文用来记录关于hexo的一些魔法操作,主要针对于NEXT主题。将会在未来很长一段时间内持续更新,希望对大家有所帮助。

    用户2470778

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动