介绍

replicattion set 多台服务器维护相同的数据副本,提高服务器的可用性,总结下来有以下好处:

  1. 数据备份与恢复
  1. 读写分离

MongoDB 复制集的结构以及基本概念



正如上图所示,MongoDB 复制集的架构中,主要分为两部分:主节点(Primary)和从节点(Secondary)。

主节点:在一个复制集中只有并且必须有一个主节点,主节点也是众多实例中唯一可以接收客户端写操作的节点,当然也可以进行读操作;

从节点:从节点会复制主节点的操作,以获取完全一致的数据集。客户端不能够直接对从节点进行写操作,但是可以进行读操作,这个需要通过复制集选项进行设置。

投票节点:投票节点 并不含有 复制集中的数据集副本,且也 无法 升职为主节点。投票节点的存在是为了使复制集中的节点数量为奇数,这样保证在进行投票的时候不会出现票数相同的情况。如果添加了一个节点后,总节点数为偶数,那么就需要相应的增加一个投票节点。

注:MongoDB 3.0 把复制集中的成员数量从原来的12个提升到了50个,但是投票节点的数量仍然保持不变,还是7个。

最基本的复制集架构



一个主节点,两个从节点,自动化故障切换的特性

最基本的复制集架构是有3个节点的形式。这样在主节点不可用以后,从节点会进行投票选出一个节点成为主节点,继续工作。如下图所示:

重新投票选出主节点

三个节点的复制集架构,还有另外一种形式:一个主节点,一个从节点,一个投票节点。如下图所示:



一个主节点,一个从节点,一个投票节点

在这种架构中,当主节点不可用时,只有从节点可以升为主节点,而投票节点是不可以成为主节点的。投票节点仅仅在选举中进行投票。如下图所示:

从节点无法升职为主节点的情况

其他概念

从节点还有集中特殊的设置情况,不同的设置有不同的需求:

优先级为0:设置 priority:0 ,那么该结点将不能成为主节点,但是其数据仍是与主节点保持一致的,而且应用程序也可以进行读操作。这样可以在某些特殊的情况下,保证其他特定节点优先成为主节点。

隐藏节点:隐藏节点与主节点的数据集一致,但是对于应用程序来说是不可见的。隐藏节点可以很好的与 复制集 中的其他节点隔离,并应对特殊的需求,比如进行报表或者数据备份。隐藏节点也应该是一个不能升职为主节点的优先级为0的节点。

延时节点:延时节点也将从 复制集 中主节点复制数据,然而延时节点中的数据集将会比复制集中主节点的数据延后。举个例子,现在是09:52,如果延时节点延后了1小时,那么延时节点的数据集中将不会有08:52之后的操作。

由于延时节点的数据集是延时的,因此它可以帮助我们在人为误操作或是其他意外情况下恢复数据。举个例子,当应用升级失败,或是误操作删除了表和数据库时,我们可以通过延时节点进行数据恢复。

oplog:全拼 oprations log,它保存有数据库的所有的操作的记录。在复制集中,主节点产生 oplog,然后从节点复制主节点的 oplog 进行相应的操作,这样达到保持数据集一致的要求。因此从节点的数据与主节点的数据相比是有延迟的。

配置

  1. # 创建数据存储目录
  2. mkdir -p /data/r0 /data/r1 /data/r2
  3. # 创建日志文件
  4. touch /var/log/mongo17.log /var/log/mongo18.log /var/log/mongo19.log
  5. #启动3个实例,且声明实例属于某复制集 rsa
  6. ./bin/mongod --port 27017 --dbpath /data/r0 --smallfiles --replSet rsa --fork --logpath /var/log/mongo17.log
  7. ./bin/mongod --port 27018 --dbpath /data/r1 --smallfiles --replSet rsa --fork --logpath /var/log/mongo18.log
  8. ./bin/mongod --port 27019 --dbpath /data/r2 --smallfiles --replSet rsa --fork --logpath /var/log/mongo19.log
  9. # 进入27017进行配置初始化
  10. ./bin/mongo --port 27017
  11. rsconf = {
  12. _id:'rsa',
  13. members:
  14. [
  15. {_id:0,
  16. host:'192.168.42.168:27017'
  17. }
  18. ]
  19. }
  20. rs.initiate(rsconf); # 如果以后需要再重载一下config的话,用rs.reconfig(rsconf);
  21. # 添加节点
  22. rs.add('192.168.42.168:27018');
  23. rs.add('192.168.42.168:27019');
  24. # 查看状态
  25. rs.status();
  26. # 删除节点
  27. rs.remove('192.168.1.201:27019');
  28. # 主节点插入数据
  29. >use test
  30. >db.user.insert({uid:1,name:'lily'});
  31. #连接secondary查询同步情况
  32. ./bin/mongo --port 27019
  33. >show dbs
  34. rsa:SECONDARY> show dbs;
  35. 2015-08-27T11:39:00.638+0800 E QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
  36. # 还可以通过isMaster()命令来查看信息;
  37. rsa:PRIMARY> db.isMaster();
  38. {
  39. "setName" : "rsa",
  40. "setVersion" : 5,
  41. "ismaster" : true,
  42. "secondary" : false,
  43. "hosts" : [
  44. "192.168.42.168:27018",
  45. "192.168.42.168:27019",
  46. "192.168.42.168:27017"
  47. ],
  48. "primary" : "192.168.42.168:27018",
  49. "me" : "192.168.42.168:27018",
  50. "electionId" : ObjectId("55dea0cffa0c638625a82486"),
  51. "maxBsonObjectSize" : 16777216,
  52. "maxMessageSizeBytes" : 48000000,
  53. "maxWriteBatchSize" : 1000,
  54. "localTime" : ISODate("2015-08-27T05:49:13.740Z"),
  55. "maxWireVersion" : 3,
  56. "minWireVersion" : 0,
  57. "ok" : 1
  58. }
  59. # 出现上述错误,是因为slave默认不许读写
  60. >rs.slaveOk();
  61. >show dbs; # 执行上面一个语句就可以看到和primary一致的数据,并且可以把读和写分离开来;

以上便是一个最简单的复制集架构,其中如果27017的主节点崩溃,那27018的节点就由从节点变为主节点;注意,如果再添加原来的27017节点进来,那主节点还是27018;

自动化配置脚本

  1. #!/bin/bash
  2. IP='192.168.1.202'
  3. NA='rsb'
  4. if [ "$1" = "reset" ]
  5. then
  6. pkill -9 mongo
  7. rm -rf /home/m*
  8. exit
  9. fi
  10. if [ "$1" = "install" ]
  11. then
  12. mkdir -p /home/m0 /home/m1 /home/m2 /home/mlog
  13. /usr/local/mongodb/bin/mongod --dbpath /home/m0 --logpath /home/mlog/m17.log --logappend --port 27017 --fork
  14. --replSet ${NA}
  15. /usr/local/mongodb/bin/mongod --dbpath /home/m1 --logpath /home/mlog/m18.log --logappend --port 27018 --fork
  16. --replSet ${NA}
  17. /usr/local/mongodb/bin/mongod --dbpath /home/m2 --logpath /home/mlog/m19.log --logappend --port 27019 --fork
  18. --replSet ${NA}
  19. exit
  20. fi
  21. if [ "$1" = "repl" ]
  22. then
  23. /usr/local/mongodb/bin/mongo <<EOF
  24. use admin
  25. rsconf = {
  26. _id:'${NA}',
  27. members:[
  28. {_id:0,host:'${IP}:27017'},
  29. {_id:1,host:'${IP}:27018'},
  30. {_id:2,host:'${IP}:27019'},
  31. ]
  32. }
  33. rs.initiate(rsconf)
  34. EOF
  35. fi

【mongoDB运维篇③】replication set复制集的更多相关文章

  1. 【mongoDB运维篇④】Shard 分片集群

    简述 为何要分片 减少单机请求数,降低单机负载,提高总负载 减少单机的存储空间,提高总存空间. 常见的mongodb sharding 服务器架构 要构建一个 MongoDB Sharding Clu ...

  2. 【mongoDB运维篇①】用户管理

    3.0版本以前 在mongodb3.0版本以前中,有一个admin数据库, 牵涉到服务器配置层面的操作,需要先切换到admin数据库.即 use admin , 相当于进入超级用户管理模式,mongo ...

  3. 【mongoDB运维篇②】备份与恢复(导入与导出)

    导入/导出可以操作的是本地的mongodb服务器,也可以是远程的服务器 所以,都有如下通用选项: -h host 主机 --port port 端口 -u username 用户名 -p passwd ...

  4. MongoDB 运维实总结

    一.MongoDB 集群简介 MongoDB是一个基于分布式文件存储的数据库,其目的在于为WEB应用提供可扩展的高性能数据存储解决方案.下面将以3台机器介绍最常见的集群方案.具体介绍,可以查看官网 h ...

  5. Flume实战案例运维篇

    Flume实战案例运维篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Flume概述 1>.什么是Flume Flume是一个分布式.可靠.高可用的海量日志聚合系统,支 ...

  6. replication set复制集

    replication set复制集  介绍 replicattion set 多台服务器维护相同的数据副本,提高服务器的可用性,总结下来有以下好处: 数据备份与恢复 读写分离 MongoDB 复制集 ...

  7. Mongodb Manual阅读笔记:CH8 复制集

    8 复制 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...

  8. MongoDB学习笔记(六)--复制集+sharding分片 && 总结

    复制集+sharding分片                                                               背景 主机 IP 服务及端口 Server A ...

  9. MongoDB学习笔记(五)--复制集 && sharding分片

    主从复制                                                                                       主从节点开启 主节 ...

随机推荐

  1. Attr的visitNewClass()方法解读

    在visitNewClass()方法中有如下注释: We are seeing an anonymous class instance creation.In this case, the class ...

  2. js获取客户端ip地址

    <script type="text/javascript" src="http://www.coding123.net/getip.ashx?js=1" ...

  3. github绑定自己的域名

    1.进入需要绑定域名的项目里面,然后新建一个文件CNAME,没有后缀的. 2.在文件里面输入你的域名,然后保存.github这边就完成了. 3.然后去你购买域名的网站,进入控制台,找到域名,然后域名解 ...

  4. 单例模式——java设计模式

    单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图               ...

  5. NHibernate with ASP.NET MVC 入门示例

    目的:初步了解NHibernate的用法,包括数据库的CRUD, 基于ASP.NET MVC 项目模板 步骤: 创建ASP.NET MVC 新项目 使用NuGet引入FluentNHibernate ...

  6. Git学习笔记4

    现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库: $ git clone git@github.com:michaelliao/gitskills.git 要克隆一个仓库,首 ...

  7. UVa 442 Matrix Chain Multiplication(栈的应用)

    题目链接: https://cn.vjudge.net/problem/UVA-442 /* 问题 输入有括号表示优先级的矩阵链乘式子,计算该式进行的乘法次数之和 解题思路 栈的应用,直接忽视左括号, ...

  8. 25. k个一组翻转链表

    题目描述 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定 ...

  9. asp.net MVC 的处理流程

    之前把笔记都放在空间日志中隐藏起来,今天看到这句话:作为经常从网上索取免费资料的一员,要有回报的思想,也为了让更多的人少走些弯路,想想自己不能这么自私,所以把空间日志搬到博客园来.闲话不说,直接开始. ...

  10. js的浅复制和深复制

    1.浅复制VS深复制 本文中的复制也可以称为拷贝,在本文中认为复制和拷贝是相同的意思.另外,本文只讨论js中复杂数据类型的复制问题(Object,Array等),不讨论基本数据类型(null,unde ...