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

概述

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


部署图

       

       图是copy别人的,有兴趣的能够查看该人的博客,写的很的棒


副本集配置

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

    //初始化副本集(登录随意一台server)
    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();                        //查看集群节点状态(登录随意一台server)
    rs.add("192.168.1.140:27017");      //加入副本节点
    rs.remove("192.168.1.140:27017");   //删除节点
节点属性操作(登录主节点server)
    cfg=rs.conf();
    //隐藏节点:可投票,可备份数据,不可被client使用(不作主节点)
    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);
读写分离
    //设置副本节点可读(副本节点server)
    db.getMongo().setSlaveOk();
       配置好副本集后,我们是无法读取副本节点server的内容,须要我们进行例如以下设置。才干够实现读写分离,当然,上篇的主从server不须要进行这个设置就能够实现主从复制
    读写分离
    //设置副本节点可读(副本节点server)
    db.getMongo().setSlaveOk();<strong>
</strong>

Javaclient操作

       要想实现副本集的读写分离,我们须要在java的client上进行对应的设置。以下是javaclient的核心代码,当然。首先,我们须要做的是下载对应的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>
       上面的代码不是完整的代码,是一些比較核心的代码,假设大家想要实现这个,能够先从单个server读写操作的写起。以下给出一个但server的简单的javaclient的实现样例,大家有兴趣的能够下载下来看一下。实例代码。该实例代码实现了对mongodb的固定集合和文件的操作。



副本集的优缺点

       长处

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

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

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

       缺点

              仅仅有集群,没有分布式


说明

  副本集节点数

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

    最多12个:复制成本高

    最多7个參与选举:添加选举时间


posted @ 2016-04-09 19:16  lcchuguo  阅读(487)  评论(0编辑  收藏  举报