参数解释:

dbpath:数据存放目录

logpath:日志存放路径

pidfilepath:进程文件,有利于关闭服务

logappend:以追加的方式记录日志(boolean值)

replSet:副本集的名字,每一个副本集名字相同

port:mongodb的端口号

oplogSize:mongodb操作日志文件的最大大小,单位为Mb,默认为硬盘剩余空间的5%

noprealloc:不预先分配存储

fork:以后台方式运行进程(linux使用)

directoryperdb:为每一个数据库按照数据库名建立文件夹存放

health表示副本集中该节点是否正常,0表示不正常,1表示正常

state表示节点的身份,0表示非主节点,1表示主节点

stateStr用于对节点身份进行字符描述,PRIMARY表示主节点,SECONDARY表示副节点

name是副本集节点的ip和端口信息

priority:副本集节点优先权,这个值的范围是0--100,值越大,优先权越高,默认的值是1,假设值是0,那么不能成为primay

arbiterOnly:设置仲裁节点

首先我们先来搭建一个副本集(副本集结构为1个主节点,一个从节点一个仲裁节点)

第一步:我们在本机的1001、1002和1003三个端口上启动三个不同的Mongodb实例;

mongod --port 1001 --dbpath F:/mongos/mongodb1/data  --logpath  F:/mongos/mongodb1/log/mongodb.log  --pidfilepath F:/mongos/mongodb1/mongodb1.pid  --replSet test --logappend  --directoryperdb
mongod --port 1002 --dbpath F:/mongos/mongodb2/data --logpath F:/mongos/mongodb2/log/mongodb.log  --pidfilepath F:/mongos/mongodb2/mongodb2.pid --replSet test --logappend   --directoryperdb
mongod --port 1003 --dbpath F:/mongos/mongodb3/data --logpath F:/mongos/mongodb3/log/mongodb.log  --pidfilepath F:/mongos/mongodb3/mongodb3.pid --replSet test --logappend   --directoryperdb

第二步:登录到1001实例上编写指令,将三个不同的Mongodb实例结合在一起形成一个完整的副本集;

cd F:\mongos\mongodb1\bin

mongo 127.0.0.1:1001

use admin

config_test={_id:"test",members:[
    {_id:0,host:"127.0.0.1:1001",priority:1},
    {_id:1,host:"127.0.0.1:1002",priority:1},
    {_id:2,host:"127.0.0.1:1003",arbiterOnly:true},
]};
这里,members中可以包含多个值,这里列举的就是刚才启动的三个Mongodb实例,并且通过_id字段给副本集起了名字test。

第三步:通过执行下面的命令初始化副本集。

rs.initiate(config_test);

这里使用上面的配置初始化Mongodb副本集。

rs.status()

想查看副本集的状态

到这里搭建起一个由三个Mongodb实例构成的名称为test的副本集了。

副本集现在搭建起来了,那么这个副本集能不能解决我们上面主从模式的两个问题呢?

我们首先从第一个问题开始看,我们将1001端口的Mongodb服务器给关闭,然后我们使用rs.status()命令来查看下,如下所示:

从返回包信息中,可以看到关闭1001端口后,在副本集节点的状态中该节点是不可达的,重新选取产生的主节点是1002端口上启动的Mongodb实例,选举过程是这样的,当主节点挂掉之后,其他节点可以发起选举行为,只要在选举过程中某个节点得到副本集节点数一半以上的选票并且没有节点投反对票,那么该节点就可以成为主节点。(参数注释请看开始位置)在1001端口上的Mongodb实例挂掉之后,1002成为了新的主节点,可以实现故障自动切换。

至于第二个问题,那就是主节点负责所有的读写操作造成主节点压力较大,那么在副本集中如何解决这个问题了呢?正常情况下,我们在Java中访问副本集是这样的,如下所示:

public class TestMongoDBReplSet {
    public static void main(String[] args)  {
        try {
            List<ServerAddress> addresses = new ArrayList<ServerAddress>();
            ServerAddress address1 = new ServerAddress("127.0.0.1",1001);
            ServerAddress address2 = new ServerAddress("127.0.0.1",1002);
            ServerAddress address3 = new ServerAddress("127.0.0.1",1003);
            addresses.add(address1);
            addresses.add(address2);
            addresses.add(address3);
            MongoClient client = new MongoClient(addresses);
            DB db = client.getDB( "testdb");
            DBCollection coll = db.getCollection( "testdb");
            // 插入
            BasicDBObject object = new BasicDBObject();
            object.append("userid","001");
            coll.insert(object);
            DBCursor dbCursor = coll.find();
            while (dbCursor.hasNext()) {
                DBObject dbObject = dbCursor.next();
                System. out.println(dbObject.toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
} 

但是,上面不能做到在副本集中读写压力分散,其实在代码层面,我们可以设置再访问副本集的时候只从副节点上读取数据。副本集读写分离结构如下图所示:

为了在副本集上实现读写分离,我们需要实现以下两步:

(1)在副本节点上设置setSlaveOk;

(2)代码层面,在读操作过程中设置从副本节点读取数据,如下所示:

public class TestMongoDBReplSet {
    public static void main(String[] args)  {
        try {
            List<ServerAddress> addresses = new ArrayList<ServerAddress>();
            ServerAddress address1 = new ServerAddress("127.0.0.1",1001);
            ServerAddress address2 = new ServerAddress("127.0.0.1",1002);
            ServerAddress address3 = new ServerAddress("127.0.0.1",1003);
            addresses.add(address1);
            addresses.add(address2);
            addresses.add(address3);
            MongoClient client = new MongoClient(addresses);
            DB db = client.getDB( "test");
            DBCollection coll = db.getCollection( "test");
            BasicDBObject object = new BasicDBObject();
            object.append("userid","001");
            ReadPreference preference = ReadPreference.secondary();
            DBObject dbObject = coll.findOne(object, null , preference);
            System. out .println(dbObject);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

读参数除了secondary以外,还有其他几个参数可以使用,他们的含义分别如下所示:

primary:默认参数,只从主节点上进行读取操作; 
primaryPreferred:大部分从主节点上读取数据,只有主节点不可用时从secondary节点读取数据。 
secondary:只从secondary节点上进行读取操作,存在的问题是secondary节点的数据会比primary节点数据“旧”。 
secondaryPreferred:优先从secondary节点进行读取操作,secondary节点不可用时从主节点读取数据; 
nearest:不管是主节点、secondary节点,从网络延迟最低的节点上读取数据。

window配置mongodb集群(副本集)的更多相关文章

  1. Mongodb分布式集群副本集+分片

    目录 简介 1. 副本集 1.1 MongoDB选举的原理 1.2 复制过程 2. 分片技术 2.1 角色 2.2 分片的片键 2.3 片键分类 环境介绍 1.获取软件包 2.创建路由.配置.分片等的 ...

  2. MongoDB 高可用集群副本集+分片搭建

    MongoDB 高可用集群搭建 一.架构概况 192.168.150.129192.168.150.130192.168.150.131 参考文档:https://www.cnblogs.com/va ...

  3. 搭建高可用mongodb集群—— 副本集

    转自:http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html 在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB& ...

  4. MongoDB集群——副本集

    1. 副本集的结构及原理 副本集包括三种节点:主节点.从节点.仲裁节点.主节点负责处理客户端请求,读.写数据, 记录在其上所有操作的oplog: 从节点定期轮询主节点获取这些操作,然后对自己的数据副本 ...

  5. MongoDB 3.4 分片集群副本集 认证

    连接到router所在的MongoDB Shell  我本机端口设置在50000上 mongo --port 接下来的流程和普通数据库添加用户权限一样 db.createUser({user:&quo ...

  6. kubernetes上安装MongoDB-3.6.5集群副本集方式

    一.安装部署: 想直接一步创建集群的小伙伴直接按以下步骤安装(再往后是记录自己出过的错): 1.生成docker镜像: docker build -t 144.202.127.156/library/ ...

  7. mongodb系列之---副本集配置与说明

    在配置副本集之前,我们先来了解一些关于副本集的知识. 1,副本集的原理 副本集的原理与主从很相似,唯一不同的是,在主节点出现故障的时候,主从配置的从服务器不会自动的变为主服务器,而是要通过手动修改配置 ...

  8. MongoDB副本集配置系列三:副本集的认证方式

    1:副本集配置参考这篇博客: http://www.cnblogs.com/xiaoit/p/4478951.html 2:副本集的认证 假设有两台机器已经配置好了副本集(副本集罪一般最少3台机器,这 ...

  9. MongoDB高可用集群+MMS集群监控搭建

    备注: mongodb学习资料 http://www.runoob.com/mongodb/mongodb-tutorial.html 一. 集群的三个组件: mongos(query routers ...

随机推荐

  1. Linux之read命令使用

    read命令: read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 1)read后面的变量var可以只有一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个 ...

  2. UNIX网络编程——Socket/TCP粘包、多包和少包, 断包

    为什么TCP 会粘包 前几天,调试mina的TCP通信, 第一个协议包解析正常,第二个数据包不完整.为什么会这样吗,我们用mina这样通信框架,还会出现这种问题? TCP(transport cont ...

  3. 深入解剖unsigned int 和 int

    就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种: 1.signed----有符号,可修饰char.int.Int ...

  4. oracle对大对象类型操作:blob,clob,nclob

     1.基本介绍 Oracle和plsql都支持lob(large object) 类型,用来存储大数量数据,如图像文件,声音文件等.Oracle 9i realse2支持存储最大为4g的数据,or ...

  5. 打Patch实践

    一.找到相应PATCH 确认系统已安装模块版本. SELECTapp.application_short_name, app.application_name, pi.patch_level   FR ...

  6. nginx+uwsgi+django 部署原理

    python开发群里经常有同学问 nginx+uwsgi+django 着了教程部署,但是不知道他们之间怎么样的关系,于是我就google到了一个让我看起来很认同的图,大家看了也比较认同,于是就分享出 ...

  7. CUDA学习,第一个kernel函数及代码讲解

    前一篇CUDA学习,我们已经完成了编程环境的配置,现在我们继续深入去了解CUDA编程.本博文分为三个部分,第一部分给出一个代码示例,第二部分对代码进行讲解,第三部分根据这个例子介绍如何部署和发起一个k ...

  8. 从JDK源码角度看java并发的原子性如何保证

    JDK源码中,在研究AQS框架时,会发现很多地方都使用了CAS操作,在并发实现中CAS操作必须具备原子性,而且是硬件级别的原子性,java被隔离在硬件之上,明显力不从心,这时为了能直接操作操作系统层面 ...

  9. Leetcode_8_String to Integer

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41521063 Implement atoi to conv ...

  10. [MSSQL]SQL Server里面导出SQL脚本(表数据的insert语句)(转)

    最近需要导出一个表的数据并生成insert语句,发现SQL Server的自带工具并米有此功能.BAIDU一下得到如下方法(亲测OK) 用这个存储过程可以实现:CREATE PROCEDURE dbo ...