1. 副本集的特性
1)一台主服务器(Primary),多台从服务器(Secondary)
2)Primary挂了之后,从服务器自动完成从它们之中选举一台服务器作为主服务器,继续工作,这就解决了单点故障,因此,在这种情况下,MongoDB集群能够继续工作
3)挂了的主服务器恢复到集群中只能以Secondary服务器的角色加入进来
2. 副本集环境搭建
2.1副本集闭环配置(以三台机器配置为例)
port=27017 bind_ip=127.0.0.1 dbpath=/home/tom/development/mongoDBdata/replicaA replSet=child/127.0.0.1:27018
port=27018 bind_ip=127.0.0.1 dbpath=/home/tom/development/mongoDBdata/replicaB replSet=child/127.0.0.1:27019
port=27019 bind_ip=127.0.0.1 dbpath=/home/tom/development/mongoDBdata/replicaC replSet=child/127.0.0.1:27017
2.2 查看副本集状态
rs.status()
2.3 启动三台服务器
在~/development/mongoDBConfig目录建立三个配置文件A.conf,B.conf和C.conf,内容分别是上面闭环设置的3台机器的配置,如A.conf的内容是
port=27017 bind_ip=127.0.0.1 dbpath=/home/tom/development/mongoDBdata/replicaA replSet=child/127.0.0.1:27018
在~/devlopment/mongDBConfig目录下,运行命令启动三台服务器
mongd --config A.conf mongd --config B.conf mongd --config C.conf
此时三台服务器都在输出如下类似的日志,不断尝试跟指定的conf文件中指定的child host进行通信(contact),例如27017的
Wed Aug 6 07:26:19.088 [rsStart] trying to contact 127.0.0.1:27018 Wed Aug 6 07:26:19.089 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG) Wed Aug 6 07:26:29.089 [rsStart] trying to contact 127.0.0.1:27018 Wed Aug 6 07:26:29.090 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG) Wed Aug 6 07:26:39.090 [rsStart] trying to contact 127.0.0.1:27018 Wed Aug 6 07:26:39.091 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG) Wed Aug 6 07:26:49.091 [rsStart] trying to contact 127.0.0.1:27018 Wed Aug 6 07:26:49.092 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG) Wed Aug 6 07:26:59.092 [rsStart] trying to contact 127.0.0.1:27018 Wed Aug 6 07:26:59.094 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG)
Wed Aug 6 07:27:38.614 [rsStart] trying to contact 127.0.0.1:27019 Wed Aug 6 07:27:38.615 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG) Wed Aug 6 07:27:48.615 [rsStart] trying to contact 127.0.0.1:27019 Wed Aug 6 07:27:48.616 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG) Wed Aug 6 07:27:58.616 [rsStart] trying to contact 127.0.0.1:27019 Wed Aug 6 07:27:58.617 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG) Wed Aug 6 07:28:08.617 [rsStart] trying to contact 127.0.0.1:27019 Wed Aug 6 07:28:08.618 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG) Wed Aug 6 07:28:18.618 [rsStart] trying to contact 127.0.0.1:27019 Wed Aug 6 07:28:18.619 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG)
Wed Aug 6 07:28:35.770 [rsStart] trying to contact 127.0.0.1:27017 Wed Aug 6 07:28:35.770 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG) Wed Aug 6 07:28:45.771 [rsStart] trying to contact 127.0.0.1:27017 Wed Aug 6 07:28:45.772 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG) Wed Aug 6 07:28:55.772 [rsStart] trying to contact 127.0.0.1:27017 Wed Aug 6 07:28:55.773 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG) Wed Aug 6 07:29:05.773 [rsStart] trying to contact 127.0.0.1:27017 Wed Aug 6 07:29:05.774 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG)
2.4 副本集环境初始化
上面的日志表明副本集还没有进行初始化,使用如下命令在任意一台服务器的Javascript Shell上运行,完成副本集初始化
use admin db.runCommand({"replSetInitiate": { "_id": "child", "members": [ { "_id": 1, "host": "127.0.0.1:27017" }, { "_id": 2, "host": "127.0.0.1:27018" }, { "_id": 3, "host": "127.0.0.1:27019" } ] } });
此时查看副本集的服务器日志输出,没台机器有如下的日志输出,表明闭环建立成功
Wed Aug 6 07:45:45.954 [initandlisten] connection accepted from 127.0.0.1:46181 #8 (3 connections now open)
rs.status()察看副本集状态,得到如下的输出,可见27017是Primary服务器,其它的是Secodary服务器
child:PRIMARY> rs.status(); { "set" : "child", "date" : ISODate("2014-08-05T23:56:21Z"), "myState" : 1, "members" : [ { "_id" : 1, "name" : "127.0.0.1:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 2338, "optime" : Timestamp(1407282254, 1), "optimeDate" : ISODate("2014-08-05T23:44:14Z"), "self" : true }, { "_id" : 2, "name" : "127.0.0.1:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 722, "optime" : Timestamp(1407282254, 1), "optimeDate" : ISODate("2014-08-05T23:44:14Z"), "lastHeartbeat" : ISODate("2014-08-05T23:56:19Z"), "lastHeartbeatRecv" : ISODate("2014-08-05T23:56:20Z"), "pingMs" : 0, "syncingTo" : "127.0.0.1:27017" }, { "_id" : 3, "name" : "127.0.0.1:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 720, "optime" : Timestamp(1407282254, 1), "optimeDate" : ISODate("2014-08-05T23:44:14Z"), "lastHeartbeat" : ISODate("2014-08-05T23:56:19Z"), "lastHeartbeatRecv" : ISODate("2014-08-05T23:56:20Z"), "pingMs" : 0, "syncingTo" : "127.0.0.1:27017" } ], "ok" : 1 }
2.5 验证
2.5.1.在主服务器27017上执行如下命令:
use foolbar db.persons.insert({"name":"tom"}); db.persons.find(); >>>{ "_id" : ObjectId("53e1709f07c1625ed566a67f"), "name" : "tom" }
上面创建了一个数据库foolbar,一个集合persons,插入一条文档,然后执行查询
2.5.2.在从服务器27018上执行查询
use foolbar db.persons.find() >>>error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
查询错误,提示27018是Secondary服务器,但是SlaveOk是false,不能做查询操作,所以需要设置从服务器,使之能够支持数据读取操作
2.5.3.关掉主服务器27017
那么MongoDB从27018和27019上自动选举一台作为主服务器,此时如果重启27017,那么27017将作为Secondary服务器加入到集群中。假如27019被选举为Primary,那么对27019做针对foolbar数据库persons集合的查询,会查询来1中创建的数据
2.5.4.设置读写分离
无论是主从复制还是副本集复制,一方面提供数据的备份,另外一点通过读写分离提高读写性能,在副本集复制方式下,默认情况下,从服务器只进行数据的同步,但是不提供数据读取功能,要想使从服务器提供数据读取功能,需要设置从服务器的slaveOkay为true,但是遗憾的是,如此重要的设置,MongoDB的Javascript Shell竟然没有提供修改的API,难道副本集的本意只做数据同步备份,不做读写分离?It doesn't make any sense!!!要修改slaveOkay,只能通过MongoDB的语言客户端如Java进行修改,这在以后再讲。
相关推荐
- MongoDB的特点和功能:如支持丰富查询语言、索引优化、副本集和分片机制、聚合管道等。 - 适用场合:适用于大数据量、高并发读写、需要快速迭代开发的应用场景。 - 应用案例:例如物联网、大数据分析、移动应用...
本压缩包“mongoDB学习笔记及工具.zip”包含了一些资源,帮助你深入理解和掌握MongoDB的相关知识。 1. **笔记(note.txt)**: 这个文件可能是对MongoDB的基础概念、安装过程、基本操作和进阶特性的详细记录。笔记...
在本篇 MongoDB 学习笔记中,我们将聚焦于 MongoDB 的集群和分片(sharding)配置,这是实现大规模数据存储和处理的关键特性。 1. **MongoDB 集群**: - 集群是由多个独立的 MongoDB 实例组成的,它们共同提供高...
`fs.chunks`集合则存储文件的实际数据,每个chunk对应一条记录,包含文件ID(`files_id`)、chunk编号(`n`)以及二进制数据(`data`)。默认情况下,chunk的大小为256KB。当文件大小超过chunk大小时,文件会被自动分割成...
MongoDB的复制功能,也称为副本集,是其高可用性和数据冗余的关键特性。副本集允许在多个服务器上维护相同的数据副本,从而提供数据备份、增强可用性和故障恢复能力。下面将详细介绍MongoDB复制(副本集)的原理、...
此笔记是我个人通过自学整理出来的。希望看到的人有什么建议告诉我。也可以共同去学习!里面内容包括:安装配置、增删改查、用户管理、主从复制、分片、副本集以及和JAVA的结合案例等等!
3. **数据镜像**:MongoDB可以通过本地或网络创建数据副本,增强扩展性。 4. **分片**:随着数据量和处理需求的增长,MongoDB可以分布式部署在多台计算机上,实现数据分片。 5. **丰富的查询表达式**:使用JSON形式...
在性能方面,MongoDB支持水平扩展,通过分片和副本集技术实现高可用性和数据冗余,确保在大数据量下的读写性能。它的文档存储方式使得数据插入、更新和删除操作相对简单,无需像关系型数据库那样进行复杂的表结构...
复制集是MongoDB高可用性的关键,它允许多个副本同步数据,以确保服务的连续性。而分片集群则支持水平扩展,解决了大数据量下的存储和处理问题。安全性和权限管理则保障了数据库的安全运行。 再者,"MongoDB实战...
以上只是Java中间件学习笔记的部分概述,实际学习中还需要深入理解每个技术的细节,如故障切换逻辑、数据一致性策略、性能调优等,以应对不同场景的需求。对于Java开发者来说,熟练掌握这些中间件技术,能够提升开发...
本笔记将详细解释一些常见的MongoDB操作,帮助初学者快速入门。 首先,我们需要了解MongoDB的客户端工具,如`mongo` shell,它是与MongoDB交互的主要方式。在`mongo` shell中,我们可以通过输入命令来执行各种...
学习MongoDB,你需要了解其基本操作,如CRUD(创建、读取、更新、删除),掌握集合、文档、分片、副本集的概念,以及如何使用聚合框架进行数据分析。 3. **Oracle**:Oracle是世界上最广泛使用的商业关系型数据库...
这将涉及文档型数据库的特点,如CRUD操作、聚合框架、分片和副本集等,对于处理大规模非结构化数据的场景尤其重要。 `Tomcat面试专题及答案`讨论了Java应用服务器Tomcat,面试者应理解Tomcat的工作原理,包括部署...
【标题】: "笔记.rar" 是一个压缩文件,包含了作者个人整理的学习笔记,可能是为了创建一个备份以便随时查阅。从标签来看,这份笔记主要聚焦在前端开发和Node.js技术上。 【描述】: 描述简单明了,"笔记.rar-------...
6. **MongoDB 高级特性**:深入理解 MongoDB 的索引、复制集、分片和读写副本,以及如何进行性能优化。 7. **Node.js 与 MongoDB 集成**:实践在 Node.js 应用中连接 MongoDB,使用 Mongoose 进行数据操作,实现 ...
此外,他还对比了MongoDB与SQL操作的基本差异,深入探讨了副本集(replica sets)和分片(sharding)的概念。最后,文章提供了一套实用指南,指导Python、PHP和Java开发者如何安装和开始使用MongoDB。 #### 三、CAP...
这份文档可能包含了MongoDB的基本操作、数据模型、查询语法、副本集和分片等主题。 9. **Nginx课程笔记.pdf**:Nginx是一个高性能的HTTP和反向代理服务器,以其高效的并发处理能力而闻名。笔记可能涵盖Nginx的配置...
6. **数据存储**:抓取到的数据可能需要保存在本地文件或数据库中,这就涉及到了文件操作和数据库知识,如CSV、JSON文件的写入,或者MySQL、MongoDB等数据库的使用。 7. **反爬策略**:腾讯网站可能有反爬措施,如...