热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDB高可用架构:深入解析ReplicaSet机制

MongoDB的高可用架构主要依赖于其ReplicaSet机制。ReplicaSet通过多个mongod节点的协同工作,实现了数据的冗余存储和故障自动切换,确保了系统的高可用性和数据的一致性。本文将深入解析ReplicaSet的工作原理及其在实际应用中的配置和优化方法,帮助读者更好地理解和实施MongoDB的高可用架构。

为什么80%的码农都做不了架构师?>>>   hot3.png

mongodb高可用性架构---Replica Set Replica Set使用的是n个mongod节点,构建具备自动的容错功能(auto-failover),自动恢复的(auto-recovery)的高可用方案。 使用Replica Set来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。 对于Replica Set中的secondary 节点默认是不可读的。 环境如下: 192.168.198.131 192.168.198.129 192.168.198.132 分别在三台服务器上安装mongod服务,安装如下: # wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.3.tgz # tar zxvf mongodb-linux-x86_64-2.0.3.tgz -C ../software/ # ln -s mongodb-linux-x86_64-2.0.3 /usr/local/mongodb # useradd mongodb # mkdir -p /data/mongodb/myset # cd /usr/local/mongodb/bin # ./mongod --replSet myset --dbpath /data/mongodb/myset --oplogSize 100 --logpath /data/mongodb/myset/myset.log --logappend --fork # ./mongo //任选一台执行以下内容 > config={_id:"myset",members:[ ... {_id:0,host:"192.168.198.131:27017"}, ... {_id:1,host:"192.168.198.129:27017"}, ... {_id:2,host:"192.168.198.132:27017",arbiterOnly:true}]} 以下输出内容: { "_id" : "myset", "members" : [ { "_id" : 0, "host" : "192.168.198.131:27017" }, { "_id" : 1, "host" : "192.168.198.129:27017" }, { "_id" : 2, "host" : "192.168.198.132:27017", "arbiterOnly" : true } ] } > rs.initiate(config) //初始化 以下输出内容: { "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 } > rs.conf() //查看配置内容 { "_id" : "myset", "version" : 1, "members" : [ { "_id" : 0, "host" : "192.168.198.131:27017" }, { "_id" : 1, "host" : "192.168.198.129:27017" }, { "_id" : 2, "host" : "192.168.198.132:27017", "arbiterOnly" : true } ] } > rs.status() //查看状态信息 { "set" : "myset", "date" : ISODate("2012-03-01T08:45:01Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "192.168.198.131:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "optime" : { "t" : 1330591378000, "i" : 1 }, "optimeDate" : ISODate("2012-03-01T08:42:58Z"), "self" : true }, { "_id" : 1, "name" : "192.168.198.129:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 121, "optime" : { "t" : 1330591378000, "i" : 1 }, "optimeDate" : ISODate("2012-03-01T08:42:58Z"), "lastHeartbeat" : ISODate("2012-03-01T08:45:01Z"), "pingMs" : 0 }, { "_id" : 2, "name" : "192.168.198.132:27017", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 121, "optime" : { "t" : 0, "i" : 0 }, "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2012-03-01T08:45:01Z"), "pingMs" : 1 } ], "ok" : 1 } state: 1表示当前可以进行读写,2表示不能读写 health: 1表示是正常的,0异常 在同一时刻,每组 Replica Sets 只有一个 Primary,用于接受写操作。而后会异步复制到其他成员数据库中。一旦 primary 死掉,会自动投票选出接任的 primary 来,原服务器恢复后成为普通成员。如果数据尚未从先前的 primary 复制到成员服务器,有可能会丢失数据。 PRIMARY> db.test.insert({"name":"foobar","age":25}) PRIMARY> db.test.find() { "_id" : ObjectId("4f4f38fc47db2bfa5ceb2aee"), "name" : "foobar", "age" : 25 } SECONDARY> db.test.find() error: { "$err" : "not master and slaveok=false", "code" : 13435 } SECONDARY> db.test.insert({"name":"foobar","age":25}) not master 在主库上设置slaveok=ok PRIMARY> db.getMongo().setSlaveOk() SECONDARY> use test switched to db test SECONDARY> db.test.find() { "_id" : ObjectId("4f4f38fc47db2bfa5ceb2aee"), "name" : "foobar", "age" : 25 } 192.168.198.131上pkill mongod Thu Mar 1 17:17:51 got kill or ctrl c or hup signal 15 (Terminated), will terminate after current cmd ends Thu Mar 1 17:17:51 [interruptThread] now exiting Thu Mar 1 17:17:51 dbexit: Thu Mar 1 17:17:51 [interruptThread] shutdown: going to close listening sockets... Thu Mar 1 17:17:51 [interruptThread] closing listening socket: 7 Thu Mar 1 17:17:51 [interruptThread] closing listening socket: 8 Thu Mar 1 17:17:51 [interruptThread] closing listening socket: 9 Thu Mar 1 17:17:51 [interruptThread] removing socket file: /tmp/mongodb-27017.sock Thu Mar 1 17:17:51 [interruptThread] shutdown: going to flush diaglog... Thu Mar 1 17:17:51 [interruptThread] shutdown: going to close sockets... Thu Mar 1 17:17:51 [conn1] end connection 127.0.0.1:58614 Thu Mar 1 17:17:51 [interruptThread] shutdown: waiting for fs preallocator... Thu Mar 1 17:17:51 [interruptThread] shutdown: lock for final commit... Thu Mar 1 17:17:51 [interruptThread] shutdown: final commit... Thu Mar 1 17:17:52 [interruptThread] shutdown: closing all files... Thu Mar 1 17:17:52 [interruptThread] closeAllFiles() finished Thu Mar 1 17:17:52 [interruptThread] journalCleanup... Thu Mar 1 17:17:52 [interruptThread] removeJournalFiles Thu Mar 1 17:17:52 [interruptThread] shutdown: removing fs lock... Thu Mar 1 17:17:52 dbexit: really exiting now 192.168.198.129选择为primary Thu Mar 1 00:17:51 [conn144] end connection 192.168.198.131:35714 Thu Mar 1 00:17:51 [rsSync] replSet syncThread: 10278 dbclient error communicating with server: 192.168.198.131:27017 Thu Mar 1 00:17:52 [rsHealthPoll] DBClientCursor::init call() failed Thu Mar 1 00:17:52 [rsHealthPoll] replSet info 192.168.198.131:27017 is down (or slow to respond): DBClientBase::findN: transport error: 192.168.198.131:27017 query: { replSetHeartbeat: "myset", v: 1, pv: 1, checkEmpty: false, from: "192.168.198.129:27017" } Thu Mar 1 00:17:52 [rsHealthPoll] replSet member 192.168.198.131:27017 is now in state DOWN Thu Mar 1 00:17:52 [rsMgr] not electing self, 192.168.198.132:27017 would veto Thu Mar 1 00:17:58 [rsMgr] replSet info electSelf 1 Thu Mar 1 00:17:58 [rsMgr] replSet PRIMARY 【ARBITER】192.168.198.132日志 Thu Mar 1 04:17:51 [conn143] end connection 192.168.198.131:56260 Thu Mar 1 04:17:53 [rsHealthPoll] DBClientCursor::init call() failed Thu Mar 1 04:17:53 [rsHealthPoll] replSet info 192.168.198.131:27017 is down (or slow to respond): DBClientBase::findN: transport error: 192.168.198.131:27017 query: { replSetHeartbeat: "myset", v: 1, pv: 1, checkEmpty: false, from: "192.168.198.132:27017" } Thu Mar 1 04:17:53 [rsHealthPoll] replSet member 192.168.198.131:27017 is now in state DOWN Thu Mar 1 04:17:58 [conn144] replSet info voting yea for 192.168.198.129:27017 (1) Thu Mar 1 04:17:59 [rsHealthPoll] replSet member 192.168.198.129:27017 is now in state PRIMARY Thu Mar 1 04:18:05 [rsHealthPoll] couldn't connect to 192.168.198.131:27017: couldn't connect to server 192.168.198.131:27017 PRIMARY> rs.status(); { "set" : "myset", "date" : ISODate("2012-03-01T09:20:37Z"), "myState" : 1, "syncingTo" : "192.168.198.131:27017", "members" : [ { "_id" : 0, "name" : "192.168.198.131:27017", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : { "t" : 1330591997000, "i" : 1 }, "optimeDate" : ISODate("2012-03-01T08:53:17Z"), "lastHeartbeat" : ISODate("2012-03-01T09:17:50Z"), "pingMs" : 0, "errmsg" : "socket exception" }, { "_id" : 1, "name" : "192.168.198.129:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "optime" : { "t" : 1330591997000, "i" : 1 }, "optimeDate" : ISODate("2012-03-01T08:53:17Z"), "self" : true }, { "_id" : 2, "name" : "192.168.198.132:27017", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 2244, "optime" : { "t" : 0, "i" : 0 }, "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2012-03-01T09:20:36Z"), "pingMs" : 0 } ], "ok" : 1 } PRIMARY> db.test.find() { "_id" : ObjectId("4f4f38fc47db2bfa5ceb2aee"), "name" : "foobar", "age" : 25 } { "_id" : ObjectId("4f4f3fe2a7c9a9d1eb78392f"), "name" : "ttlsa", "age" : 1 } 再次启动192.168.198.131的mongod服务 Thu Mar 1 17:23:24 [initandlisten] MongoDB starting : pid=6977 port=27017 dbpath=/data/mongodb/myset 64-bit host=node2 Thu Mar 1 17:23:24 [initandlisten] db version v2.0.3, pdfile version 4.5 Thu Mar 1 17:23:24 [initandlisten] git version: 05bb8aa793660af8fce7e36b510ad48c27439697 Thu Mar 1 17:23:24 [initandlisten] build info: Linux ip-10-110-9-236 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_41 Thu Mar 1 17:23:24 [initandlisten] options: { dbpath: "/data/mongodb/myset", fork: true, logappend: true, logpath: "/data/mongodb/myset/myset.log", oplogSize: 100, replSet: "myset" } Thu Mar 1 17:23:24 [initandlisten] journal dir=/data/mongodb/myset/journal Thu Mar 1 17:23:24 [initandlisten] recover : no journal files present, no recovery needed Thu Mar 1 17:23:26 [initandlisten] waiting for connections on port 27017 Thu Mar 1 17:23:26 [websvr] admin web console waiting for connections on port 28017 Thu Mar 1 17:23:27 [initandlisten] connection accepted from 192.168.198.129:43753 #1 Thu Mar 1 17:23:27 [initandlisten] connection accepted from 127.0.0.1:37253 #2 Thu Mar 1 17:23:27 [rsStart] trying to contact 192.168.198.129:27017 Thu Mar 1 17:23:27 [rsStart] replSet STARTUP2 Thu Mar 1 17:23:27 [rsSync] replSet SECONDARY SECONDARY> use test switched to db test SECONDARY> db.test.find() { "_id" : ObjectId("4f4f38fc47db2bfa5ceb2aee"), "name" : "foobar", "age" : 25 } { "_id" : ObjectId("4f4f3fe2a7c9a9d1eb78392f"), "name" : "ttlsa", "age" : 1 }

转载于:https://my.oschina.net/766/blog/211493


推荐阅读
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • 本文将介绍一种扩展的ASP.NET MVC三层架构框架,并通过使用StructureMap实现依赖注入,以降低代码间的耦合度。该方法不仅能够提高代码的可维护性和可测试性,还能增强系统的灵活性和扩展性。通过具体实践案例,详细阐述了如何在实际开发中有效应用这一技术。 ... [详细]
  • 在基于.NET框架的分层架构实践中,为了实现各层之间的松散耦合,本文详细探讨了依赖注入(DI)和控制反转(IoC)容器的设计与实现。通过合理的依赖管理和对象创建,确保了各层之间的单向调用关系,从而提高了系统的可维护性和扩展性。此外,文章还介绍了几种常见的IoC容器实现方式及其应用场景,为开发者提供了实用的参考。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 本文详细介绍了使用响应文件在静默模式下安装和配置Oracle 11g的方法。硬件要求包括:内存至少1GB,具体可通过命令`grep -i memtotal /proc/meminfo`进行检查。此外,还提供了详细的步骤和注意事项,确保安装过程顺利进行。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • openGauss行存储核心架构及其页面组织详解
    行存储的核心架构和页面组织是实现DML操作、可见性判断及多种管理功能的基础。作为基于磁盘的存储引擎,行存储在设计上采用了段页式结构,以优化数据的存储和访问效率。这种设计不仅确保了数据的高效存储,还为行存储的各种高级功能提供了坚实的技术支持。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 深入解析:RKHunter与AIDE在入侵检测中的应用与优势
    本文深入探讨了RKHunter与AIDE在入侵检测领域的应用及其独特优势。通过对比分析,详细阐述了这两种工具在系统完整性验证、恶意软件检测及日志文件监控等方面的技术特点和实际效果,为安全管理人员提供了有效的防护策略建议。 ... [详细]
  • 开源项目 OpenSD 正式发布!这款自动化部署 OpenStack 的利器不容错过
    开源项目 OpenSD 正式发布!这款自动化部署 OpenStack 的利器不容错过 ... [详细]
  • JavaScript 流程控制:分支与循环结构实例解析
    JavaScript 流程控制:分支与循环结构实例解析 ... [详细]
author-avatar
古零零碎碎
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有