MongoDB副本集实现及读写分离(2)

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

MongoDB副本集实现及读写分离


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

(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" , 1111);
   ServerAddress address2 = new ServerAddress("127.0.0.1" , 2222);
   ServerAddress address3 = new ServerAddress("127.0.0.1" , 3333);
   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( "key1", "value1" );
   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节点,从网络延迟最低的节点上读取数据。

这样便实现了在副本集上的读写分离了,也就解决了文章最上面所说的第二个问题了。至于副本集中另一个比较重要的地方,主从数据如何同步?如何选举产生新的主节点?副本集中的各个节点如何信息同步?这些问题,将另起一篇文章进行描述,如敢兴趣,可以关注,谢谢。^_^

更多MongoDB相关教程见以下内容

CentOS 编译安装 MongoDB与mongoDB的php扩展

CentOS 6 使用 yum 安装MongoDB及服务器端配置

Ubuntu 13.04下安装MongoDB2.4.3

MongoDB入门必读(概念与实战并重)

Ubunu 14.04下MongoDB的安装指南

《MongoDB 权威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]

Nagios监控MongoDB分片集群服务实战

基于CentOS 6.5操作系统搭建MongoDB服务 uxidc.com/Linux/2014-11/108900.htm

MongoDB 的详细介绍请点这里
MongoDB 的下载地址请点这里

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/008e904bcb7e7cad6f2ae85dcea1b420.html