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)    主节点:支持读写

b)    从节点:支持读(需设置)

c)    仲裁节点:参与投票同时也支持读(需设置)

二,实验

主节点:192.168.129.47

从节点:192.168.129.48

仲裁节点:192.168.129.49

1.主节点配置如下:

vi  /etc/rc.local

rm /usr/mongodb/log/mongodb.log

/usr/mongodb/bin/mongod --dbpath=/usr/mongodb/data/ --logpath=/usr/mongodb/log/mongodb.log --port 27017  --replSet test/192.168.129.48:27017 --maxConns=2000 --fork –logappend

从节点配置如下:

vi /etc/rc.local

rm /usr/mongodb/log/mongodb.log

/usr/mongodb/bin/mongod --dbpath=/usr/mongodb/data/ --logpath=/usr/mongodb/log/mongodb.log --port 27017  --replSet test/192.168.129.47:27017 --maxConns=2000 --fork –logappend

仲裁节点配置如下:

vi /etc/rc.local

rm /usr/mongodb/log/mongodb.log

/usr/mongodb/bin/mongod --dbpath=/usr/mongodb/data/ --logpath=/usr/mongodb/log/mongodb.log  --port 27017 --replSet test/192.168.129.47:27017,192.168.129.48:27017 --fork –logappend

配置完成之后启动mongod服务

2.启动之后在主节点执行(192.168.129.47)

use admin

db.runCommand({"replSetInitiate" : {

"_id" : "test",

"members" : [

{

"_id" : 0,

"host" : "192.168.129.47:27017"

},

{

"_id" : 1,

"host" : "192.168.129.48:27017"

} ,

{

"_id" : 2,

"host" : "192.168.129.49:27017"

}

]}})

#查看复制集状态
rs.status()
rs.isMaster()
rs.conf()

#查看从库状态
db.printSlaveReplicationInfo()

#设置从库可查询
db.getMongo().setSlaveOk()
rs.setSlaveOk()

#增加复制集节点
1.锁定已有的一个从库,并将缓存中的数据写入到磁盘
use admin
db.runCommand({"fsync":1, "lock":1})
2.拷贝被锁定从库的数据文件到新建从库的数据目录
3.解锁从库
db.$cmd.sys.unlock.findOne()
db.currentOp()
4.启动新从库
./mongod --replSet rs1 --keyFile /data/set/key/r4 --fork --port 28014 --dbpath /data/set/r4 --logpath=/data/set/log/r4.log --logappend --fastsync
5.rs.add("localhost:27017")

6.删除节点:

主节点上面执行 rs.remove(“ip:port”)

对于replica set 中的secondary 节点默认是不可读的。在写多读少的应用中,使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。

如果通过shell访问mongo,要在secondary进行查询。会出现如下错误:

imageSet:SECONDARY> db.fs.files.find()

error: { "$err" : "not master and slaveOk=false", "code" : 13435 }

有两种方法实现从机的查询:

第一种方法:db.getMongo().setSlaveOk();

第二种方法:rs.slaveOk();

但是这种方式有一个缺点就是,下次再通过mongo进入实例的时候,查询仍然会报错,为此可以通过下列方式

vi ~/.mongorc.js

增加一行rs.slaveOk();

这样的话以后每次通过mongo命令进入都可以查询了

如果是通过java访问secondary的话则会报下面的异常

com.mongodb.MongoException: not talking to master and retries used up
解决的办法很多。
第一种方法:在java代码中调用dbFactory.getDb().slaveOk();
第二种方法:在java代码中调用
dbFactory.getDb().setReadPreference(ReadPreference.secondaryPreferred());//在复制集中优先读secondary,如果secondary访问不了的时候就从master中读

dbFactory.getDb().setReadPreference(ReadPreference.secondary());//只从secondary中读,如果secondary访问不了的时候就不能进行查询
第三种方法:在配置mongo的时候增加slave-ok="true"也支持直接从secondary中读
<mongo:mongo id="mongo" host="${mongodb.host}" port="${mongodb.port}">
        <mongo:options slave-ok="true"/> 
</mongo:mongo>

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

Replica Set是mongodb的一个副本集群方案,它优越于传统的数据库主从方式。传统的主从方式,master负责读写,slaver负责从master同步数据,一旦master宕机,slaver就废了,这种方式在灾备方面有缺陷,而mongodb的Replica Set的集群机制解决了这种缺陷。

Replica Set

主要分为:primary(主节点,提供增删查改服务),slaver(备节点,只提供读),arbiter(仲裁节点,不存储数据,只负责仲裁)。

流程:client从primary节点读写数据,slaver从primary那里同步数据,当primary宕机时候,arbiter会在10秒内从众多slaver节点中选出一个健康的slaver顶替primary,这样就减轻了灾害arbiter节点本身不存储数据,只是监测集群中primary和slaver的运行情况(如果arbiter宕机,整个集群也就废了,唯一的不足之处)。slaver只提供读的功能,不能写,我们的项目查询的需求可以去连slaver节点,这样就大大减轻了primary主节点的负载。

以下是Replica Set的流程图:

Replica Set的原理我们明白了,你可能会问,我们在编程的时候,对于primary、slaver这么多db,我们一定是往primary节点写数据,如果primary节点宕机了,程序应该怎么检测,怎么找到新的primary节点呢?

不用担心,mongodb已经解决了你的疑问。mongodb提供了对各类语言的驱动的支持,你只需调用Replica Set接口,然后参照说明来使用它,下面以node.js

var Db = require(‘mongodb‘).Db,

    Server = require(‘mongodb‘).Server,
    ReplSet = require(‘mongodb‘).ReplSet;

//集群Server地址
var serverAddr = {
    9001: ‘192.168.1.100‘, //节点1
    9002: ‘192.168.1.100‘, //节点2
    9003: ‘192.168.1.100‘  //节点3
}

//集群Sever对象的集合
var servers = [];
for (var i in serverAddr) {
    servers.push(new Server(serverAddr[i], parseInt(i)));

}

 

var replStat = new ReplSet(servers, {});

var db = new Db(‘blog‘, replStat);

//mongodb操作
db.open(function(err, db) {
    var collection = db.collection(‘user‘);
    //查询一个document
    collection.findOne({
        name: ‘jerry‘
    }, function(err, results) {
        console.info(‘query:‘, results);
    });
    //插入一个document
    collection.insert({
        name: ‘ok‘,
        age: 28
    }, function(err, results) {
        console.info(‘insert:‘ + results);
    });

});

上面配置了几个节点9001、9002、9003,我们无需关注哪个是主节点、备节点、冲裁节点,驱动会自动判断出一个健康的主节点来给node,我们只需专心写数据库的操作逻辑就可以了。

但这里存在一个问题,Replica Set在切换节点的时候,会出现一个断档期,我们知道node是异步/O的,在这个断档期,如果node在执行大量操作的话,弱小的栈内存会溢出,报:RangeError: Maximum call stack size exceeded错误,这个错误是系统级错误,会导致app崩掉,即使捕获异常或等db切换完成,程序依然会挂死在哪里。目前还没找到解决的方法,正在研究mongo驱动的api,试图通过一个体现切换过程状态监听的事件解决,如果该事件触发,则停止db操作,待切换完成后再恢复,这样应该可以解决问题。

时间: 2024-10-11 11:30:02

mongodb 复制集(replica set)的相关文章

mongodb复制集(Replica sets)+分片(Sharding)环境搭建

1.创建数据目录--server a:# mkdir -p /data/shard1_1# mkdir -p /data/shard2_1# mkdir -p /data/config --server b:# mkdir -p /data/shard1_2# mkdir -p /data/shard2_2# mkdir -p /data/config --server c:# mkdir -p /data/shard1_3# mkdir -p /data/shard2_3# mkdir -p

MongoDB 复制集节点增加移除及节点属性配置

复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机的情形下,辅助节点通过选举机制来从剩余的辅助节点中推选一个新的主节点从而实现自动切换.对于一个已经存在的MongoDB Replica Set集群,可以对其进行节点的增加,删除,以及修改节点属性等等.本文即是围绕这些进行描述. 有关MongoDB复制集概念及其搭建,可以参考:MongoDB 复制集(

mongodb复制集的实现

复制集(Replica Sets),是一个基于主/从复制机制的复制功能,进行同一数据的异步同步,从而使多台机器拥有同一数据的都多个副本,由于有自动故障转移和恢复特性,当主库宕机时不需要用户干预的情况下自动切换到其他备份服务器上做主库,一个集群最多可以支持7个服务器,并且任意节点都可以是主节点.所有的写操作都被分发到主节点,而读操作可以在任何节点上进行,实现读写分离,提高负载. 资源有限测试一个VM开3个实例: 环境:centos7.0 192.168.1.21:20011 P 192.168.1

MongoDB 复制集

关于读写分离 由于写入主之后,同步到从有一个时间,所以读写分离会引发数据一致性问题. MongoDB 通过复制集(Replica Set)来实现读写分离. MongoDB复制集(Replica Set) 通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用. 当遇到复制集轮转升级.Primary宕机.网络分区等场景时,复制集可能会选举出一个新的Primary,而原来的Primary则会降级为Secondary,即发生主备切换.所以,MongoDB复制集里Primary

MongoDB复制集架构

MongoDB复制集架构 由数据结点,投票结点组成,需要配置集群信息,可自动检测集群中的结点健康状态,当有结点出故障时,自动下线和切换主从结点.适用于数据量较大,高可用服务 通常,为了防止单点故障应用程序需要做集群.然而在数据库中除了防止单点故障,还需要做到数据库备份,读写分离,故障转移等.而 MongoDB 的 Replica Set 恰恰都能满足这些要求. Replica Set角色 Replica Set 的成员是一堆有着同样的数据内容 mongod 的实例集合,包含以下三类角色: 主节点

MongoDB复制集(实现选举复制、故障切换、升级oplog大小、认证复制)

什么是复制集? 复制集(replica sets)是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余并增加了数据可用性,通过复制集可以对硬件故障和中断服务进行恢复. 复制集的优势 让数据更安全. 高数据可用性. 灾难恢复. 无停机维护(如备份.索引重建.故障转移) 读缩放(额外的副本读取) 副本集对应用程序是透明的. 复制集概述 MongoDB复制集是额外的数据副本,复制集提供了冗余和增加数据可用性. MongoDB的复制集至少需要两个节点,其中主节点负责处理客户端请求,从节点负责

MongoDB复制集部署和基本管理

MongoDB复制集部署和基本管理 MongoDB复制集概述 复制集(Replica Sets)是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余并增加了数据的可用性,通过复制集可以对硬件故障和中断服务进行恢复. 复制集由下列优点: 让数据更安全 高数据可用性(7*24) 灾难恢复 无停机维护(如备份.索引重建.故障转移) 读缩放(额外的副本读取) 副本集对应用程序是透明的 复制集工作原理 MongoDB的复制集至少需要两个节点.其中一个节点是主节点(Primary),负责处理客户

部署MongoDB复制集(主从复制、读写分离、高可用)

MongoDB 复制集 复制集(Replica Sets)是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余备份并提高了数据的可用性,通过复制集可以对硬件故障和中断的服务进行恢复. MongoDB 复制集工作原理 mongodb的复制集至少需要两个节点.其中一个是主节点(Primary),负责处理客户端请求,其余的都是从节点(Secondary),负责复制主节点上的数据. mongodb各个节点常见的搭配方式为:一主一从.一主多从.主节点记录其上的所有操作到 oplog 中,从节点

MongoDB复制集成员及架构介绍(一)

MongoDB复制集介绍 MongoDB支持在多个机器中通过异步复制达到提供了冗余,增加了数据的可用性.MongoDB有两种类型的复制,第一种是同于MySQL的主从复制模式(MongoDB已不再推荐此方案):第二种是复制集,提供了自动故障转移的主从复制集群,其中复制集没有固定的主节点,当一个主机的故障后从节点会重新“选举”出一个新的主节点,从而提高的系统的可用性. 复制集(Replica Sets)成员 MongoDB的复制集是由一组mongod实例所组成的,并提供了数据冗余与高可用性.复制集中