概述
副本集是主从复制的一种,是一种自带故障转移功能的主从复制,解决了上述主从复制的缺点,实现主服务器发生故障后,不需人为介入,系统自动从新选举一个新的主服务器的功能。
部署图
该图是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个参与选举:增加选举时间
版权声明:本文为博主原创文章,未经博主允许不得转载。