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

[MongoDB学习笔记一]MongoDB主从复制

 
阅读更多

MongoDB称为分布式数据库,主要原因是1.基于副本集的数据备份, 2.基于切片的数据扩容。副本集解决数据的读写性能问题,切片解决了MongoDB的数据扩容问题。

 

事实上,MongoDB提供了主从复制和副本复制两种备份方式,在MongoDB的主从复制和副本复制集群环境中,只有一台作为主服务器,另外一台或者多台服务器作为从服务器。
本文介绍MongoDB的主从复制模式,需要指明的是因为在这种模式下,主从复制集群存在单点故障,即主服务器挂了,则整个复制集群就挂了,因为客户端只能往主服务器上写数据,而不能往从数据上写数据,这种读写模式称为读写分离

Master/Slave主从复制

 
1. 主从集群搭建配置(以一个Master和一个Slave为例):
主服务器启动配置参数:

 

port=27017
bind_ip=127.0.0.1
dbpath=~/development/mongoDBdata/Master
master=true

 

 

从服务器启动配置参数

 

port=27018
bind_ip=127.0.0.1
dbpath=~/development/mongoDBdata/Slave
slave=true
source=127.0.0.1:27017

 

 

2. 启动主服务器

   
  注意(--master没有true作为值)
mongod --bind_ip 127.0.0.1 --dbpath ~/development/mongoDBdata/Master --port 27017 --master
  可以使用1中指定的配置参数进行启动,把它保存在Master.conf文件中,那么,可以用如下脚本启动,当前的目录是Master.conf所在的目录
mongod --config Master.conf
 
3. 启动从服务器
mongod --bind_ip 127.0.0.1 --dbpath ~/development/mongoDBdata/Slave --port 27018 --source 127.0.0.1 --slave
 
    如果主服务器,也可以使用1中指定的关于从服务器的配置参数进行启动,把它保存在Slave.conf文件中,那么,可以用如下脚本启动,当前的目录是Slave.conf所在的目录
mongod --config Slave.conf

 

4. 主服务器写数据
    使用Mongo的Shell命令解释器,在主服务器上创建一个数据库foobar,创建一个集合Persons,然后插入一个文档({"name": "Tom","job":"SE"})
mongo 127.0.0.1:27017
use foolbar
db.persons.insert({"name":"tom","job":"SE"});
db.persons.find();
>>>{ "_id" : ObjectId("53e0e9afa341791bae80ebc2"), "name" : "tom", "job" : "SE" }
 
5. 在从服务器上查找插入的文档({"name": "Tom","job":"SE"})
mongo 127.0.0.1:27018
use foolbar
db.persons.find();
>>>{ "_id" : ObjectId("53e0e9afa341791bae80ebc2"), "name" : "tom", "job" : "SE" }
    可见,主服务器上的数据应景同步到从服务器上了
 
6. 在从数据库做插入文档操作({"name": "Jack","job":"CT"})
db.persons.insert({"name":"Jack","job":"CT"});
>>>not master
   可见在从服务器上不能执行写操作,写操作只能在主服务器上执行,然后同步到从服务器上。这里有个时间的延时,如果客户端往主服务器上写数据请求返回,然后请求从数据库上相应的数据,如果主从数据还没有完成同步,那么客户端从服务器上有可能得到过时无效的数据或者根本取不到数据
 
7.主服务器日志(前台运行的方式打开,能够方便的在命令行终端看到这些信息)
Tue Aug  5 22:15:01.954 [initandlisten] waiting for connections on port 27017
Tue Aug  5 22:16:56.748 [initandlisten] connection accepted from 127.0.0.1:59106 #1 (1 connection now open)
Tue Aug  5 22:16:57.923 [slaveTracking] build index local.slaves { _id: 1 } --local.slaves是什么??
Tue Aug  5 22:16:57.948 [slaveTracking] build index done.  scanned 0 total records. 0.024 secs
Tue Aug  5 22:25:29.076 [initandlisten] connection accepted from 127.0.0.1:59247 #2 (2 connections now open)
Tue Aug  5 22:26:55.931 [FileAllocator] allocating new datafile ~/development/mongoDBdata/Master/foolbar.ns, filling with zeroes...
Tue Aug  5 22:26:56.011 [FileAllocator] done allocating datafile ~/development/mongoDBdata/Master/foolbar.ns, size: 16MB,  took 0.079 secs
Tue Aug  5 22:26:56.024 [FileAllocator] allocating new datafile ~/development/mongoDBdata/Master/foolbar.0, filling with zeroes...
Tue Aug  5 22:26:56.386 [FileAllocator] done allocating datafile ~/development/mongoDBdata/Master/foolbar.0, size: 64MB,  took 0.361 secs
Tue Aug  5 22:26:56.386 [FileAllocator] allocating new datafile ~/development/mongoDBdata/Master/foolbar.1, filling with zeroes...
Tue Aug  5 22:26:56.386 [conn2] build index foolbar.persons { _id: 1 } ---时时的创建索引
Tue Aug  5 22:26:56.387 [conn2] build index done.  scanned 0 total records. 0 secs
Tue Aug  5 22:26:56.387 [conn2] insert foolbar.persons ninserted:1 keyUpdates:0 locks(micros) w:456090 455ms
Tue Aug  5 22:26:56.516 [FileAllocator] done allocating datafile ~/development/mongoDBdata/Master/foolbar.1, size: 128MB,  took 0.129 secs
Tue Aug  5 22:26:57.295 [initandlisten] connection accepted from 127.0.0.1:59273 #3 (3 connections now open)
Tue Aug  5 22:26:57.659 [conn3] end connection 127.0.0.1:59273 (2 connections now open)
Tue Aug  5 22:27:14.189 [conn2] end connection 127.0.0.1:59247 (1 connection now open)
Tue Aug  5 22:37:32.765 [initandlisten] connection accepted from 127.0.0.1:59454 #4 (2 connections now open)
Tue Aug  5 22:37:32.768 [conn4] end connection 127.0.0.1:59454 (1 connection now open)
                                                            
说明:‘
1. 上面的日志是只在创建一个文档的前提下产生的,因此只有一条关于编译索引的日志
2. 上面的链接数包括Shell客户端链接和从数据库的链接,对于主从服务器,它们之间保持心跳链接,如果过了10秒(主从服务器的默认心跳时间)得不到彼此的应答,那么认为彼此链接断开
 
8. 总结

 

 主从复制配置简单,但是如本文开头所说,主从复制的最大问题在于主服务器的单点故障问题,因此在生产环境中,主从复制使用较少,下一篇将介绍复制的另一种方式副本集复制,这种方式解决了主服务器的单点故障问题(主服务器挂了,Mongo集群自动从从服务器中选出一个Leader来做主服务器)。主从复制和副本集还有一个区别就是主从复制默认情况下已经打开了从服务器的数据读取功能,但是副本集却没有

 

9. mongoDB关于Master-Slave的配置选项

 

Master/slave options (old; use replica sets instead): //不推荐使用主从复制,推荐使用副本集
  --master                     master mode //作为主服务器启动MongoDB
  --slave                       slave mode //作为从服务器启动MongoDB
  --source arg              when slave: specify master as <server:port> //针对从服务器配置,指定主服务器(server:port)
  --only arg                  when slave: specify a single database to replicate //针对从服务器配置,只针对主服务器的一个数据库进行复制,其它的数据库不复制
  --slavedelay arg      specify delay (in seconds) to be used when applying master ops to slave //针对主服务器配置,指定主从复制的时间间隔,
  --autoresync            automatically resync if slave data is stale //针对从服务器的设置,数据过期自动同步

 

10. Master/Slave的动态配置

 

10.1 上面配置的Master和Slave是在启动时指定了以Master启动还是以Slave启动,MongoDB也支持在运行时由Javascript命令终端动态的对Master和Slave进行配置。

首先可以在从节点的local.sources集合中察看主服务器的server:port以及同步的状态(为什么127.0.0.1没有端口信息?难道是因为默认端口不显示?)

 

use local
db.sources.find()
>>>{ "host" : "127.0.0.1", "source" : "main", "syncedTo" : Timestamp(1407254957, 1) }

 

 10.2 停止从服务器,使用如下命令启动服务器(没有指定--source和--slave)

 

mongod --bind_ip 127.0.0.1 --dbpath ~/development/mongoDBdata/Slave --port 27018

 做use local; db.persons.find();操作,发现有一条记录,所以,看到这条文档,以为着这个服务器上次作为Slave启动的,它的Slave角色没有改变,如果不带--slave和--source参数启动,那么主从复制不再维持,主服务器的数据更新不会同步到这台机器,只有以Slave的参数启动才能接收主服务器的数据同步

{ "host" : "127.0.0.1", "source" : "main", "syncedTo" : Timestamp(1407254957, 1) }

 

10.3 对于全新的数据库,比如删除目录~/development/mongoDBData/Slave之后,再执行10.2的启动脚本,此时通过在local.sources添加一个文档{"host":"127.0.0.1:27017"}会把新启动的独立服务器变为从服务器。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    MongoDB学习笔记

    MongoDB是一个广泛使用的开源NoSQL文档数据库,它采用了面向集合的存储方式,使得存储的数据更加灵活。学习MongoDB不仅需要理解其基本的数据操作和管理,还需要了解其高级特性、集群部署、索引机制、日志系统、数据...

    mongodb笔记

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

    数据库学习笔记包括:Oracle、MySQL、MongoDB、Redis,Neo4j的在完善.zip

    本压缩包中的学习笔记涵盖了五大主流数据库系统:Oracle、MySQL、MongoDB、Redis以及Neo4j,它们各自拥有独特的特性和用途,适用于不同的场景。 1. Oracle数据库: Oracle是一款关系型数据库管理系统(RDBMS),在...

    mongodb官网文档集合

    “Recommended Production Architectures”部分介绍了在生产环境中部署MongoDB的推荐架构,包括主从复制、分片集群和地理冗余方案。这部分内容对于规划和实现高可用性和可扩展性的数据库系统非常有帮助。 #### ...

    MongoDB入门的一些资料

    其次,`mongo笔记.txt`可能是一份文本笔记,包含了个人学习或教学过程中的要点,可能包括更深入的实践细节、示例代码或者常见问题解答。这部分内容可能涵盖: 1. **命令行操作**:如启动、停止MongoDB服务,以及...

    java中间件学习笔记

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

    Redis学习笔记.pdf

    Redis还支持主从复制和哨兵机制(Sentinel),前者可以实现数据的同步备份,后者则用于管理多个Redis服务器,实现故障转移。Redis集群的建立和管理可以进一步提升数据库的高可用性和扩展性,支持数据分片和负载均衡...

    nosql视频教程,包含redis、mongodb等视频资料

    在本视频教程中,我们将深入学习Redis的安装配置、基本操作、数据类型使用、主从复制、持久化策略以及在实际项目中的应用案例。 【MongoDB】 MongoDB是一款面向文档的分布式数据库,适合处理大规模数据。它采用JSON...

    工作过程中的学习笔记

    在大型项目中,数据库的扩展性和高可用性也需考虑,例如分库分表、读写分离、主从复制等策略。 【开发过程遇到的问题】 开发过程中会遇到各种问题,如代码逻辑错误、异常处理、性能优化等。错误处理是确保程序稳定...

    2009数据库系统工程师学习笔记

    2009年的数据库系统工程师学习笔记可能涵盖了当时该领域的核心概念和技术。以下是对这些笔记可能包含的一些关键知识点的详细说明: 1. **数据库基础理论**: - 数据模型:包括关系模型(如SQL)、网络模型、层次...

    redis学习笔记

    主从复制是 Redis 提供的一种高可用性解决方案,通过复制数据到多个从节点,可以在主节点故障时切换到从节点,保证服务不间断。Redis 集群则进一步扩展了这一概念,支持数据的分布式存储和多节点间的自动数据分片,...

    数据库学习笔记

    数据库学习笔记中涵盖了数据库的多个重要知识点和操作流程,对于想要掌握MySQL的初学者和中级开发者来说,都是非常实用的学习资源。以下是根据提供的文件内容生成的详细知识点: ### MySQL基础安装部署 MySQL安装...

    redis详细笔记

    ### Redis详细笔记 #### 1. Redis介绍 Redis是一种高性能的键值对存储数据库,它使用C语言编写,能够提供非常高的读写速度。作为NoSQL数据库的一种,Redis旨在解决传统关系型数据库面临的高并发、高可扩展性、高...

    jvm、数据结构与算法、数据库、redis的笔记

    它的数据类型包括字符串、哈希、列表、集合和有序集合,以及一些高级特性如发布/订阅、事务、持久化(RDB和AOF)、主从复制和集群等。理解Redis的工作机制和最佳实践,可以帮助我们构建高并发、低延迟的应用。 综上...

    Java高级开发工程师面试笔记.zip

    7. **数据库**:SQL优化、事务管理、索引原理、主从复制、分布式数据库解决方案如MySql、Oracle、Redis、MongoDB等。 8. **网络编程**:TCP/IP协议、HTTP协议、Socket编程、WebSocket等网络基础知识,以及Netty、...

    JavaKeeper::writing_hand_selector:Java工程师必备架构体系知识总结:涵盖分布式,微服务,RPC等互联网公司常用架构,以及数据存储,缓存,搜索等必备技能

    5,表设计7,锁机制8,分区分表分库9,主从复制 雷迪斯 5.0.6 弹性搜索 亚马逊S3 MongoDB 快速DFS :desktop_computer_selector:服务器 项目 版 文章 Linux CentOS版本6.10 Nginx的 1.16.1 :seedling: 泉全家福...

    stepien_tomasz_repo_bazy_danych

    考虑到文件名 "stepien_tomasz_repo_bazy_danych-main" 中的 "main",这可能是一个项目的主分支,可能包含了源代码、教程、示例、笔记或者测试用例等,帮助学习者深入理解和实践数据库相关的技术。通过这些内容,...

Global site tag (gtag.js) - Google Analytics