`
bit1129
  • 浏览: 1068091 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[MongoDB学习笔记二]MongoDB副本集

 
阅读更多

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进行修改,这在以后再讲。

 

 

 

分享到:
评论
1 楼 kittyfxm 2014-08-06  

相关推荐

    MongoDB学习笔记

    - MongoDB的特点和功能:如支持丰富查询语言、索引优化、副本集和分片机制、聚合管道等。 - 适用场合:适用于大数据量、高并发读写、需要快速迭代开发的应用场景。 - 应用案例:例如物联网、大数据分析、移动应用...

    mongoDB学习笔记及工具.zip

    本压缩包“mongoDB学习笔记及工具.zip”包含了一些资源,帮助你深入理解和掌握MongoDB的相关知识。 1. **笔记(note.txt)**: 这个文件可能是对MongoDB的基础概念、安装过程、基本操作和进阶特性的详细记录。笔记...

    mongodb学习笔记

    在本篇 MongoDB 学习笔记中,我们将聚焦于 MongoDB 的集群和分片(sharding)配置,这是实现大规模数据存储和处理的关键特性。 1. **MongoDB 集群**: - 集群是由多个独立的 MongoDB 实例组成的,它们共同提供高...

    MongoDB学习笔记之GridFS使用介绍

    `fs.chunks`集合则存储文件的实际数据,每个chunk对应一条记录,包含文件ID(`files_id`)、chunk编号(`n`)以及二进制数据(`data`)。默认情况下,chunk的大小为256KB。当文件大小超过chunk大小时,文件会被自动分割成...

    MongoDB 复制(副本集)学习笔记

    MongoDB的复制功能,也称为副本集,是其高可用性和数据冗余的关键特性。副本集允许在多个服务器上维护相同的数据副本,从而提供数据备份、增强可用性和故障恢复能力。下面将详细介绍MongoDB复制(副本集)的原理、...

    mongodb笔记

    此笔记是我个人通过自学整理出来的。希望看到的人有什么建议告诉我。也可以共同去学习!里面内容包括:安装配置、增删改查、用户管理、主从复制、分片、副本集以及和JAVA的结合案例等等!

    MongoDB学习笔记—Linux下搭建MongoDB环境

    3. **数据镜像**:MongoDB可以通过本地或网络创建数据副本,增强扩展性。 4. **分片**:随着数据量和处理需求的增长,MongoDB可以分布式部署在多台计算机上,实现数据分片。 5. **丰富的查询表达式**:使用JSON形式...

    深入云计算(MongoDB管理与开发实战详解--学习笔记

    在性能方面,MongoDB支持水平扩展,通过分片和副本集技术实现高可用性和数据冗余,确保在大数据量下的读写性能。它的文档存储方式使得数据插入、更新和删除操作相对简单,无需像关系型数据库那样进行复杂的表结构...

    免费的mongoDB

    复制集是MongoDB高可用性的关键,它允许多个副本同步数据,以确保服务的连续性。而分片集群则支持水平扩展,解决了大数据量下的存储和处理问题。安全性和权限管理则保障了数据库的安全运行。 再者,"MongoDB实战...

    java中间件学习笔记

    以上只是Java中间件学习笔记的部分概述,实际学习中还需要深入理解每个技术的细节,如故障切换逻辑、数据一致性策略、性能调优等,以应对不同场景的需求。对于Java开发者来说,熟练掌握这些中间件技术,能够提升开发...

    mongodb基础语句大全

    本笔记将详细解释一些常见的MongoDB操作,帮助初学者快速入门。 首先,我们需要了解MongoDB的客户端工具,如`mongo` shell,它是与MongoDB交互的主要方式。在`mongo` shell中,我们可以通过输入命令来执行各种...

    我的学习资料打包,包括ES,MongoDB,Oracle,TS,NodeJS相关的学习过程

    学习MongoDB,你需要了解其基本操作,如CRUD(创建、读取、更新、删除),掌握集合、文档、分片、副本集的概念,以及如何使用聚合框架进行数据分析。 3. **Oracle**:Oracle是世界上最广泛使用的商业关系型数据库...

    Java架构面试专题汇总(含答案)和学习笔记.rar

    这将涉及文档型数据库的特点,如CRUD操作、聚合框架、分片和副本集等,对于处理大规模非结构化数据的场景尤其重要。 `Tomcat面试专题及答案`讨论了Java应用服务器Tomcat,面试者应理解Tomcat的工作原理,包括部署...

    笔记.rar-自己的笔记,留一个备份

    【标题】: "笔记.rar" 是一个压缩文件,包含了作者个人整理的学习笔记,可能是为了创建一个备份以便随时查阅。从标签来看,这份笔记主要聚焦在前端开发和Node.js技术上。 【描述】: 描述简单明了,"笔记.rar-------...

    mongo-university:学习mongo和Node.js

    6. **MongoDB 高级特性**:深入理解 MongoDB 的索引、复制集、分片和读写副本,以及如何进行性能优化。 7. **Node.js 与 MongoDB 集成**:实践在 Node.js 应用中连接 MongoDB,使用 Mongoose 进行数据操作,实现 ...

    A-collection-of-popular-NoSQL-articles-published-on-InfoQ.com

    此外,他还对比了MongoDB与SQL操作的基本差异,深入探讨了副本集(replica sets)和分片(sharding)的概念。最后,文章提供了一套实用指南,指导Python、PHP和Java开发者如何安装和开始使用MongoDB。 #### 三、CAP...

    开发资料整理.rar

    这份文档可能包含了MongoDB的基本操作、数据模型、查询语法、副本集和分片等主题。 9. **Nginx课程笔记.pdf**:Nginx是一个高性能的HTTP和反向代理服务器,以其高效的并发处理能力而闻名。笔记可能涵盖Nginx的配置...

    抓取腾讯首页天气预报.rar

    6. **数据存储**:抓取到的数据可能需要保存在本地文件或数据库中,这就涉及到了文件操作和数据库知识,如CSV、JSON文件的写入,或者MySQL、MongoDB等数据库的使用。 7. **反爬策略**:腾讯网站可能有反爬措施,如...

Global site tag (gtag.js) - Google Analytics