MongoDB高可用

对于MongoDB,可以支持使用单机模式提供服务,但是在实际的生产环境中,单机模式将面临很大的风险,一旦这个数据库服务出现问题,就会导致线上的服务出现错误甚至崩溃。因此,在实际生产环境下,需要对MongoDB做相应的主备处理,提高数据库服务的可用性。

对于提高可用性,一些博文里提到了使用主从模式(master-slaver)

WARNING:
Deprecated since version 3.2: MongoDB 3.2 deprecates the use of master-slave replication for components of sharded clusters.

主从模式是高可用的一种方案。然而从上面这段警告中可以知道,在高版本的MongoDB(3.2以上)中,官方已经不推荐使用主从模式,取而代之的,是使用复制集(Replica Set)的方式做主备处理。

IMPORTANT:
Replica sets replace master-slave replication for most use cases. If possible, use replica sets rather than master-slave replication for all new production deployments. This documentation remains to support legacy deployments and for archival purposes only.

因此,本文将介绍如何将已有的单机MongoDB数据库拓展为主备模式的复制集,以提高可用性。

复制集 Replica Set

在复制集中,有且只有一个主节点(primary),可以包含一个或多个从节点(secondary),主从节点直接会通过心跳检测来确定节点是否健康或存活。所有的读写操作都是在主节点上进行的,如果要实现读写分离,需要进行相应的处理,这个最后会说。从节点会根据oplog(也就是操作日志)来复制主节点的数据。

MongoDB复制集

除了主从节点外,MongoDB的复制集中还存在着一种叫仲裁者(Arbiter)的角色。一个仲裁者节点是比较轻量级的,因为它不会去复制主库的数据,因此也就不会成为主节点;但是,它的作用是在投票选举阶段——当主节点故障时,仲裁者可以进行投票。一般来说,不建议一个复制集中包含超过一个仲裁者。

当主节点突然故障后,MongoDB有自己的机制,会自动切换,通过选举,在从节点中选出一个节点作为新的主节点。

MongoDB复制集故障处理

如何使用复制集

首先,需要在MongoDB实例的启动参数中加入replSet,指定复制集的名称。

mongod --port 8017 --dbpath /home/work/data/db1 --replSet rstest

对于已有的单机实例,也可以加入该参数并进行重启。此外,我们还需要另外启动两个MongoDB实例作为从节点,注意replSet参数指定的名称需要相同。

mongod --port 8016 --dbpath /home/work/data/db2 --replSet rstest
mongod --port 8015 --dbpath /home/work/data/db2 --replSet rstest

然后,需要通过mongo命令连接MongoDB服务,进入主节点进行初始化。

mongo 127.0.0.1:8017
rs.initiate({  _id:"rstest", // replSet指定的名称
  members:[{    _id:0,    host:"127.0.0.1:8017" // 主节点ip与端口
  }]
})

需要注意的是,如果是将已有单机拓展为复制集,要在连接原单机的实例并在其中运行使其作为主节点。

最后,再将其他两个从节点加入到该复制集中。

rs.add("127.0.0.1:8016")
rs.add("127.0.0.1:8015")

通过rs.status()查看效果,可以看到rstest这个复制集中已经有了三个节点,stateStr指明了节点的类型,health为1表明该节点是健康的。

{    "set" : "rstest",    "date" : ISODate("2017-10-31T13:04:16.704Z"),    "myState" : 1,    "members" : [
        {            "_id" : 0,            "name" : "127.0.0.1:8017",            "health" : 1,            "state" : 1,            "stateStr" : "PRIMARY", // 节点的类型,主节点
            "uptime" : 1508,            "optime" : Timestamp(1509455043, 1),            "optimeDate" : ISODate("2017-10-31T13:04:03Z"),            "electionTime" : Timestamp(1509454568, 2),            "electionDate" : ISODate("2017-10-31T12:56:08Z"),            "configVersion" : 3,            "self" : true
        },
        {            "_id" : 1,            "name" : "127.0.0.1:8016",            "health" : 1,            "state" : 2,            "stateStr" : "SECONDARY",            "uptime" : 25,            "optime" : Timestamp(1509455043, 1),            "optimeDate" : ISODate("2017-10-31T13:04:03Z"),            "lastHeartbeat" : ISODate("2017-10-31T13:04:15.657Z"),            "lastHeartbeatRecv" : ISODate("2017-10-31T13:04:15.108Z"),            "pingMs" : 0,            "syncingTo" : "127.0.0.1:8017",            "configVersion" : 3
        },
        {            "_id" : 2,            "name" : "127.0.0.1:8015",            "health" : 1,            "state" : 2,            "stateStr" : "SECONDARY",            "uptime" : 13,            "optime" : Timestamp(1509455043, 1),            "optimeDate" : ISODate("2017-10-31T13:04:03Z"),            "lastHeartbeat" : ISODate("2017-10-31T13:04:15.657Z"),            "lastHeartbeatRecv" : ISODate("2017-10-31T13:04:15.661Z"),            "pingMs" : 0,            "configVersion" : 3
        }
    ],    "ok" : 1}

连接复制集

由于复制集中的切换机制,在主节点故障的情况下,集群内其他从节点会通过投票方式产生新的主节点,因此,不能像单机情况下那样,直接连接主节点;否则在MongoDB自动切换主节点时,数据库访问就会出问题。因此连接复制集需要特定的连接方式。

在MongoDB的连接字符串(connection url)中可以进行指定。

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

其中可以指定多个host:port,用英文逗号连接,并在最后的option中支持replicaSet参数,用于指定连接的复制集。例如:

mongodb://127.0.0.1:8017,127.0.0.1:8016,127.0.0.1:8015/books?replicaSet=rstest

这样就可以连接上复制集中的books这个数据库。

总结

MongoDB复制集的故障机制切换是它自身来保障,在部署好上面一系列的服务后,我们可以测试一下当主节点故障时,集群中的节点状态与服务可用性。通过kill主节点MongoDB进程,使用rs.status()可以发现,其中一个从节点已经升级为了主节点(这部分在从节点的日志中也有体现)。此外,数据查询依然可以进行,不会因为主节点的宕机而导致数据服务不可用。

mongodb复制集Replica Set使用简介的更多相关文章

  1. MongoDB 复制集节点增加移除及节点属性配置

    复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机 ...

  2. MongoDB 复制集 (一) 成员介绍

       一 MongoDB 复制集简介          MongoDB的复制机制主要分为两种:          Master-Slave    (主从复制)      这个已经不建议使用       ...

  3. MongoDb复制集实现故障转移,读写分离

    前言 数据库技术是信息系统的一个核心技术,发展很快,各种功能类型数据库层出不穷,之前工作中使用过关系型数据库(mysql.oracle等).面相对象数据库(db4o).key-value存储(Memc ...

  4. mongodb 复制集

    mongodb 复制集 复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写 ...

  5. Raft与MongoDB复制集协议比较

    在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...

  6. MongoDB复制集

    1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...

  7. MongoDB复制集技术

    复制集搭建 没毛病: https://www.cnblogs.com/nicolegxt/p/6841442.html?utm_source=itdadao&utm_medium=referr ...

  8. MongoDB复制集成员及状态转换

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 复制集(Replica Set)是MongoDB核心组件,相比早期版本采用的主从(Master-Slave) ...

  9. 关于 MongoDB 复制集

    为什么要使用复制集 1.备份数据通过自带的 mongo_dump/mongo_restore 工具也可以实现备份,但是毕竟没有复制集的自动同步备份方便. 2.故障自动转移部署了复制集,当主节点挂了后, ...

随机推荐

  1. JVM GC-----3、垃圾标记算法(二)

    在上一篇文章中,介绍了在GC机制中,GC是以什么标准判定对象可以被标记的,以及最有效最常用的可达性分析法.今天介绍另外一种非常常用的标记算法,它的应用面也相当广泛.这就是:引用计数法 Referenc ...

  2. 短网址服务(TinyURL)生成算法

          前不久做了一个优惠劵的分享功能,其中一个功能就是生成一个优惠劵分享短链接.生成的短链接要求每个链接都是唯一的,并且长度尽可能短.在网上查了一下相关的思路,发现了一个不错的算法.这个算法的思 ...

  3. python使用 requirements.txt 管理所需的包

    使用 requirements.txt 管理所需的包 2019/01/28 作者 若要与其他人共享项目.使用生成系统,或打算将项目复制到需要在其中还原环境的其他任何位置,必须指定项目需要的外部包. 建 ...

  4. supervisor 管理 celery

    安装supervisor [root@ipv6-api ~]# pip3 install  supervisor 生成配置文件 [root@ipv6-api ~]#echo_supervisord_c ...

  5. 线程安全地获取插入mysql的条目的id

    在往mysql中插入条目时有时会希望能得到该插入条目的id,一种方式是再执行一个select语句条件为max(id)来获取,但这种形式在并发环境里并不是线程安全的,因为在你完成插入到再执行一个sele ...

  6. bzoj5312: 冒险(势能均摊线段树)

    题目链接 BZOJ5312: 冒险 题解 如果一次操作对区间& 和 区间| 产生的影响是相同的,那么该操作对整个区间的影响都是相同的 对于每次操作,在某些位上的值,对于整个区间影响是相同的,对 ...

  7. Vijos.lxhgww的奇思妙想(k级祖先 长链剖分)

    题目链接 https://blog.bill.moe/long-chain-subdivision-notes/ http://www.cnblogs.com/zzqsblog/p/6700133.h ...

  8. HDU.4352.XHXJ's LIS(数位DP 状压 LIS)

    题目链接 \(Description\) 求\([l,r]\)中有多少个数,满足把这个数的每一位从高位到低位写下来,其LIS长度为\(k\). \(Solution\) 数位DP. 至于怎么求LIS, ...

  9. POJ.1160.Post Office(DP 四边形不等式)

    题目链接 \(Description\) 一条直线上有n个村庄,位置各不相同.选择p个村庄建邮局,求每个村庄到最近邮局的距离之和的最小值. \(Solution\) 先考虑在\([l,r]\)建一个邮 ...

  10. hack the box-Access Writeup

    一.摘要 Acces是搭建在Windows平台上的一道CTF题目,探究服务器上的渗透测试 二.信息搜集 题目就只给出一个IP:10.10.10.98 首先通过Nmap进行端口方面的探测 nmap -s ...