mongodb的分布式集群(2、副本集)

概述

       副本集是主从复制的一种,是一种自带故障转移功能的主从复制,解决了上述主从复制的缺点,实现主服务器发生故障后,不需人为介入,系统自动从新选举一个新的主服务器的功能。


部署图

       mongodb的分布式集群(2、副本集)_第1张图片

       图是copy别人的,有兴趣的可以查看该人的博客,写的非常的棒


副本集配置

<strong>   </strong> //启动服务器(登录每台服务器)
    mongod --dbpath d:/data/ --replSet repset

    //初始化副本集(登录任意一台服务器)
    config = { _id:"repset", members:[                          //_id值 == replSet参数
        {_id:0, host:"192.168.1.136:27017"},
        {_id:1, host:"192.168.1.137:27017", priority:10},
        {_id:2, host:"192.168.1.138:27017", priority:20},
        //仲裁节点:仅用于投票,防止选不出主节点,仲裁和非仲裁(仅能在初始化设置)
        {_id:3, host:"192.168.1.139:27017", arbiterOnly:true}]
        }

    rs.initiate(config);
       副本集的配置也是非常的简单,如上面的配置就可以实现,在副本集中涉及到很多不同类型的节点,大家可以看相应的注释,有不明的可以再查一下,下面是一些关于副本集的其它方面的操作,大家可以尝试一下
节点操作
    rs.status();                        //查看集群节点状态(登录任意一台服务器)
    rs.add("192.168.1.140:27017");      //添加副本节点
    rs.remove("192.168.1.140:27017");   //删除节点
节点属性操作(登录主节点服务器)
    cfg=rs.conf();
    //隐藏节点:可投票,可备份数据,不可被客户端使用(不作主节点)
    cfg.members[1].priority=0;
    cfg.members[1].hidden=1;
    //延迟复制节点:用于备份,延迟从主节点同步数据,避免用户错误
    cfg.members[2].priority=0;
    cfg.members[2].slaveDelay=3600;
    //永副本节点:防止性能不高的节点成为主节点
    cfg.members[3].priority=0;
    //纯备份副本节点:无投票
    cfg.members[4].votes=0;
    rs.reconfig(cfg);
读写分离
    //设置副本节点可读(副本节点服务器)
    db.getMongo().setSlaveOk();
       配置好副本集后,我们是无法读取副本节点服务器的内容,需要我们进行如下设置,才可以实现读写分离,当然,上篇的主从服务器不需要进行这个设置就可以实现主从复制
    读写分离
    //设置副本节点可读(副本节点服务器)
    db.getMongo().setSlaveOk();<strong>
</strong>

Java客户端操作

       要想实现副本集的读写分离,我们需要在java的客户端上进行相应的设置,下面是java客户端的核心代码,当然,首先,我们需要做的是下载相应的mongodb的java驱动
<span style="font-size:18px;">    //分布式集群(配置多个服务器,只要有一个可运行就行)
    List<ServerAddress> serverAddressList = new ArrayList<ServerAddress>();
    serverAddressList.add(new ServerAddress("192.168.24.1", 10000));
    serverAddressList.add(new ServerAddress("192.168.24.2", 10000));
    MongoClient mongoClient = new MongoClient(serverAddressList);
</span>

<span style="font-size:18px;">    //设置读写分离
    ReadPreference readPreference = ReadPreference.secondaryPreferred();
    database.setReadPreference(readPreference);

    primary:默认参数,只从主节点上进行读取操作
    primaryPreferred:大部分从主节点上读取数据,只有主节点不可用时从secondary节点读取数据
    secondary:只从secondary节点上进行读取操作,存在的问题是secondary节点的数据会比primary节点数据“旧”
    secondaryPreferred:优先从secondary节点进行读取操作,secondary节点不可用时从主节点读取数据
    nearest:不管是主节点、secondary节点,从网络延迟最低的节点上读取数据。
</span>
       上面的代码不是完整的代码,是一些比较核心的代码,如果大家想要实现这个,可以先从单个服务器读写操作的写起,下面给出一个但服务器的简单的java客户端的实现例子,大家有兴趣的可以下载下来看一下。实例代码。该实例代码实现了对mongodb的固定集合和文件的操作。


副本集的优缺点

       优点

              读写分离:主节点数据读写,默认副本节点无法直接读写(可设置只读)

              数据备份:副本节点读取主节点的oplog(操作日志),执行

              故障转移:主节点宕机,系统会自动重选主节点(优先级0—100越大,备选机会越大)

       缺点

              只有集群,没有分布式


说明

  副本集节点数

     最好为奇数:避免选举不了主节点

    最多12个:复制成本高

    最多7个参与选举:增加选举时间


你可能感兴趣的:(mongodb的分布式集群(2、副本集))