MongoDB——主从复制&副本集

Wesley13
• 阅读 925

MongoDB——主从复制&副本集 博客分类: java mongodb

前面我说到了,MongoDB数据库支持服务器之间的数据复制。支持主从模式及服务器之间的相互复制。目的当然是实现负载均衡与故障恢复。Mongo中内置了两种技术:主从复制、副本集。下面就简单介绍这两种模式的配置。

一、    主从复制

主从复制是一个简单的数据库同步备份的集群技术。模型如下:

MongoDB——主从复制&副本集

需要注意:

在数据库集群中要明确的知道谁是主服务器,主服务器只有一台。

从服务器要知道自己的数据源,也就是自己的主服务器是谁。

--master用来明确主服务器,--slave和—source来控制从服务器。

实例

配置其实非常简单,类似我们前面讲到的Redis的主从复制,思路如下:

我们现在起两个MongoDB的数据库实例,一个作为Master一个作为Slave,然后从Master存数据,然后看是否能从Slave中取出数据即可。步骤如下:

步骤一:

分别做好Master(用8888端口)和Slave(用7777端口)的服务端与客户端的启动bat文件:

MongoDB——主从复制&副本集

Master的文件内容依次如下:

8888.conf:

MongoDB——主从复制&副本集

8888mongodbStartServer.bat:

MongoDB——主从复制&副本集

8888mongodb.bat:

MongoDB——主从复制&副本集

Slave的文件内容如下:

7777.conf:

MongoDB——主从复制&副本集

7777mongodbStartServer.bat:

MongoDB——主从复制&副本集

7777mongodb.bat:

MongoDB——主从复制&副本集

步骤二:

双击Master的启动bat文件(8888mongodbStartServer.bat):

MongoDB——主从复制&副本集

双击Slave的启动bat文件(7777mongodbStartServer.bat):

MongoDB——主从复制&副本集

步骤三:

双击Master的客户端启动bat文件(8888mongodb.bat),并新建一个数据库,同时插入数据:

MongoDB——主从复制&副本集

步骤四:

双击Slave的客户端启动bat文件(7777mongodb.bat),并查询是否存在刚刚在Master中新建的数据库、Collection与插入的两条数据:

MongoDB——主从复制&副本集

这就说明,主从复制已配置成功。这里还需要注意,Slave数据库实例是不允许我们插入、修改数据的,我们只能操作Master数据库服务器,例如我们在Slave中插入一条数据,会报错:

MongoDB——主从复制&副本集

实例的结构图如下:

MongoDB——主从复制&副本集

二、    副本集

与主从复制所能达到的效果类似。主从复制模型中的Master相当于副本集中的“活跃”节点;Slave相当于“备份”节点,如下图:

MongoDB——主从复制&副本集

上图1,表明A是活跃的,B、C是用于备份的;图2表示,当A出现故障,这时候集群根据权重算法推选出B为活跃数据库节点;图3表示,当A恢复故障后,它自动变为了备份节点。

与主从复制不同的是,主从复制中只有一个Master,当Master节点挂掉之后,所有的Slave节点无法自动变为Master,继续提供服务。这时所有的 Slave也就会因连不上Master而无法继续备份数据,直到它再次连到Master。

而副本集中所有的节点都可以成为“活跃”节点(一开始是随机推出的),当当前的活跃节点挂掉之后,集群会立即从其它完好的备份节点中推选出一个节点作为“活跃节点”,整个副本集群不会停止备份服务。

配置

配置与主从复制的配置相似,这里不再像上面那么详细的一步步介绍,直接给出大概配置:

准备三套MongoDB的启动配置:(监听不同的端口)

三个启动配置(A/B/C.conf)如下:

MongoDB——主从复制&副本集

先启动Mongo的三个服务端实例,并初始化副本集:

MongoDB——主从复制&副本集

然后,启动Mongo的客户端实例,启动后可以看出哪个活跃节点,哪些是备份节点:

MongoDB——主从复制&副本集

MongoDB——主从复制&副本集

然后就可以做类似“主从复制”的实例来验证我们是否配置成功。

http://blog.csdn.net/wang379275614/article/details/47262427

http://snowolf.iteye.com/blog/1974747

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Redis(1.7)Redis高可用架构(理论篇)
【0】常用架构种类  (0.1)单机Redis  (0.2)单纯的Redis主从复制  (0.3)哨兵SentinelRedis主从复制集群(实现高可用自动故障转移)  (0.4)RedisCluster分布式数据库集群  (0.5)第三方中间件Redis主从复制【1】Redis主从复制
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这