MongoDB replSet

Primary节点接收客户端所有的写操作,整个副本集只会有一个primary节点。MongoDB副本集提供严格的一致性。主节点将所有的操作写入一个叫oplog的capped collection(这个collection的大小一般为磁盘剩余空间的5%,不同的系统可能不一样,详见http://docs.mongodb.org/manual/core/replica-set-oplog/)中,secondary节点通过复制oplog并执行oplog中的所有操作,因为对oplog的执行是幂等的,所以secondary节点上的数据可以保持和primary节点一样,当然这有一个“追赶”(catch up)的过程,会存在一定的落后(Lag)有时候因为网络延迟或宕机导致从节点永远赶不上主节点,这时候需要采取人为的干预了(后面会说到Resyncing Member of Replica Set)。

默认所有的读操作也是走的primary节点,当然客户端可以选择从secondary节点进行读取操作以减小主节点的压力(后面会对读写分离有详细说明)。

各个节点之间是通过心跳机制来维持联系的,当主节点无法和集群中其他节点通信超过10秒,集群会从剩下的节点中选择一个secondary作为primary,这个过程叫做选举(election),每个secondary节点都有一个优先级priority来参与投票(也可以有没有投票权的secondary节点),priority值越大就越优先成为主节点(所有的节点可以有相同的优先级,默认值都是1)。election的策略不仅仅就是根据priority值来,会综合很多其他的因素。总之MongoDB通过heartbeat和election机制实现了自动的Failover:

副本集要求参与选举投票(vote)的节点数为奇数,这很容易理解。当我们实际环境中因为机器等原因限制只有两个(或偶数)的节点,这时为了实现Automatic Failover引入另一类节点:仲裁者(arbiter),仲裁者只参与投票不拥有实际的数据,因此它对物理资源要求不严格。

上面已经提到了primary,secondary和arbiter,整个MongoDB副本集群中除了这三种类型的节点还有其他几种:

  • Secondary-Only:这种类型的节点和secondary节点一样拥有数据副本,但是它们在任何情形下都成为不了primary节点。
  • Hidden:这种类型的节点对客户端程序来说是不可见的,同样也不能成为primary节点,但是Hidden成员能够参与选举投票。
  • Delayed:这种类型的成员通过人为的设置,可以指定一个时间来延迟从primary节点同步数据。Delayed成员的作用在于帮助集群从一些误操作中恢复,比如管理员误删除了某个集合。不至于迅速扩散到整个集群中。因此Delayed节点必须不能成为primary节点(priority为0)并且是Hidden的。
  • Non-Voting:这就是上面提到了没有选举权的secondary节点。这种类型的节点一般当集群节点数超过12才会需要。

环境:

192.168.1.1(primary)

192.168.1.2(secondary)

192.168.1.3(secondary)

开启防火

iptables -I  INPUT -p tcp  --dport 27018 -j ACCEPT

一、分别在三台服务器上 编辑配置文件

#配置文件mongodb.conf存放路径为 /opt/confg/mongo/mongodb.conf

dbpath=/opt/mongodb/data/

logpath=/var/log/mongodb/mongodb.log

pidfilepath=/opt/mongodb/data/mongodb.pid

logappend=true

fork=true

port=27017

quiet=true

directoryperdb=true

replSet=replSet01

oplogSize=10240 #(MB单位)

maxConns=20000

二、分别启动三台服务器上的mongod服务

mongod -f /opt/confg/mongo/mongodb.conf

runuser -c "/opt/mongodb/bin/mongod -f /opt/confg/mongo/mongodb.conf " mongod

三、初始化副本集配置

登录任意一台服务器的mongo服务: mongo --port 27017

use admin

mongo>conf={_id :"replSet01",

"members":[{_id:1,"host":"192.168.1.1:27017",priority:3},                                                                                                                                                                                                                                               {_id :2,"host":"192.168.1.2:27017",priority:2},{_id :3,"host":"192.168.1.3:27017",priority:1}]}

mongo>rs.initiate(conf);

或者

db.adminCommand({"replSetInitiate":{_id:"replSet01",members:[{_id:1,host:"192.168.1.1:27017"},{_id:2,host:"192.168.1.2:27017"},{_id:3,host:"192.168.1.3:27017"}]}})

///////////////////////cnf_rplset的语法(将3台服务器串起来的语法选项)/////////////////////////////
{
  _id : <setname>,
  members: [
    {
      _id : <ordinal>,
      host : <hostname[:port]>
      [, arbiterOnly : true]
      [, buildIndexes : <bool>]
      [, hidden : true]
      [, priority: <priority>]
      [, tags: {loc1 : desc1, loc2 : desc2, ..., locN : descN}]
      [, slaveDelay : <n>]
      [, votes : <n>]
    }
    , ...
  ],
  [settings: {
    [getLastErrorDefaults: <lasterrdefaults>]
    [, getLastErrorModes : <modes>]
  }]
}

详细说明:(默认值在括号中)
_id:副本集的名字,必须和命令行的名字匹配,也就是您刚才启动mongodb数据库命令行的那个名字,数字字母,不能包含"/";
members:一个数组用来表示副本集中的每个成员,这个数组必须包含_id和host这2个key。

members 数组:
_id:在副本集中的每一个成员都必须有一个_id表示,这个_id是通常是数字,从0开始增长。需要注意的是当其中一个成员退休了(指从副本集config中移除了),新加入的成员不能重新使用这个退休成员的_id;
host:ip地址和端口号;
arbiterOnly(false):如果是true,则表示这个成员为仲裁节点,不接收数据;
buildIndexes(true):如果设置为false,则会阻止在这个节点上创建第二索引,通常这个节点是作为纯粹的数据备份,从不用来被查询。不过也因为此节点没有第二索引,所以他写入的东西很少,也就需要很少的内存和磁盘。_id的索引还是会被创建的。只有当priority属性设置为0时,此项才能设置为false,一般不会用到这个选项;
hidden(false):如果此项为true,不要告诉客户端的此节点的存在,设置隐藏节点的原因是此节点的数据的使用模式和其他节点大为不同,比如:报表,统计,备份等。设置为ture时,允许你针对这个节点发送非主要查询。
priority(1.0):权重,更高的权重会被选举为主节点.取值范围0-100,数字越大优先级越高,0代表永不能成为主节点。只有优先级为0(即被动成员)才可以设置为隐藏成员(hidden=0)

tags({}):一个文档代表这台服务器的位置,有利于位置感知的读写。其实就是表示此节点位于哪个数据中心的,mongodb会根据tags找近的数据中心节点同步数据。
slaveDelay(0):同步数据的延迟,设置为0表示立即更新同步数据。
votes(1):此节点可以发出的投票数,一般不用修改他

settings 对象:settings对象可以在集群建立起来以后用再进行设置,通常使用默认值
设置成员优先级
var config=rs.config()
config.members[1].priority=0
rs.reconfig(config);
设置成员为隐藏节点
var config=rs.config()
config.members[1].priority=0
config.members[1].hidden=0
rs.reconfig(config)
隐藏成员在isMaster()是看不到的。但是在rs.status() 和rs.config()是可见的。因为客户端连接到副本集时,首先会调用 isMaster()来查看可用成员。隐藏成员是不会接受客户端的读请求的。
如果想让节点变为 延迟备份节点 (slaveDelay 属性)那么该节点的优先级也必须是 0 和隐藏成员,目的是避免路由服务奖客户的读请求路由到该备份节点。

//////////////////////////cnf_rplset的语法(将3台服务器串起来的语法选项)/////////////////////////////

时间: 2024-10-05 05:21:24

MongoDB replSet的相关文章

node.js mongodb ReplSet

随着web2.0兴起,高并发大数据量的应用对数据库高速响应的性能要求日趋明显,传统的关系型数据库在这方面显得有些乏力.有矛自有盾,内存DB的出现弥补了传统关系型db的不足.眼下市面流行的内存db主要有redis.memcach.mongodb.前面二者是基于key-value形式存储,而mongodb是基于关系型数据库表的一些特性的存储方式,并支持索引. 所以在一些对大数据量.数据关联度有要求的场景下,mongodb是一种不错选择. Replica Set是mongodb的一个副本集群方案,它优

MongoDB Replica Set搭建集群

MongoDB做集群,版本3.2官网推荐的集群方式Replica Set 准备服务器3台 两个standard节点(这两个节点直接可以互切primary secondary). 一个arbiter节点,它手中握着一张选票,决定上面两个standard节点中的哪一个可以成为primay. 机器名称和预承担的角色如下: test39 primary test41 secondary test42 arbiter 介绍一下涉及到的参数 --dbpath   数据文件路径 --logpath  日志文件

nagios 监控 mongodb 解决nagios界面显示null 问题

网上有很多关于nagios 监控mongodb 的介绍,但是无一例外,手工执行 python 能获取客户端的值,nagios 监控界面上面显示null, 针对该问题,本人用shell 脚本重新封装了部分监控选项,让nagios 能正常监控mongodb 服务器 如果想了解nagios 监控mongodb的部署过程,请点击: http://www.2cto.com/database/201410/341855.html https://github.com/mzupan/nagios-plugin

mongodb 复制集(replica set)

参考:http://wengzhijuan12.blog.163.com/blog/static/3622414520137104257376/ http://wengzhijuan12.blog.163.com/blog/static/3622414520137104257376/ http://blog.csdn.net/shmnh/article/details/41976451 复制升级版的主从复制,它实现了故障自动转移功能,同时从节点支持读 一,节点类型: a)    主节点:支持读写

MongoDB(四)之副本集

参考链接:http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html 一.MongoDB副本集介绍 前面我们介绍了安装MongoDB及其相关的使用,但是其会存在下面的问题: 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 这篇文章看完这些问题就可以搞定了.NoSQL的产生就是为了解决大数据量.高

Ubuntu16.04搭建MongoDB3.4.3 副本集 开启认证模式

上一篇文档讲述的是如何搭建mongodb副本集 这一篇讲述启用auth 一.为了方便启动,我们在Mongodb目录下新建conf目录,用于保存mongodb的配置文件 #进入mongod目录 cd mongodb/ #创建conf目录 mkdir conf #新增mongodb.conf vim mongodb.conf写入如下内容---------------------------------------: #日志文件位置 logpath=/data/bigdata/software/mon

Mogodb集群搭建

1.上传解压软件包 cd /home/dinpay/ 解压:tar -zxvf  mongodb-linux-x86_64-rhel62-3.2.2.tgz 重命名:  mv  mongodb-linux-x86_64-rhel62-3.2.2.tgz mongodb 1.在集群的机器上建立对应的data文件夹例如:/data/mongodb/replset/data 2.建立在mongodb目录新建启动配置文件mongodb.conf: dbpath=/data/mongodb/replset

mongodb之replSet复制集

### mongodb的复制集 ### 注意点 - 服务器节点之前时间要同步 - 开启防火墙的一定要允许通过 - 开启selinux的也要进行设置 - 建立双击互信模式最好不过 ### 主服务器配置文件 - 添加一行 replSet = zhuima 定义一个副本集 [[email protected] ~]# sed -e '/^#/d;/^$/d' /etc/mongodb.conf bind_ip = 192.168.58.10 port = 27017 fork = true pidfi

mongodb之replSet复制集 + auth

### 开启auth认证的mongodb的复制集 ### 注意点 - 服务器节点之前时间要同步 - 开启防火墙的一定要允许通过 - 开启selinux的也要进行设置 - 建立双击互信模式最好不过 ### 提前要做的事情 生产高端大气上档次的keyFile文件 [[email protected] journal]# openssl rand -base64 753 3LC/EZGPOLXdVBQInqeKVglqNNWo2Et93ib51BQJZRAUB2gRUovi4b6ZkAeNAQxc v