美文网首页我爱编程
mongodb的read preference及配置方法

mongodb的read preference及配置方法

作者: nextliving | 来源:发表于2018-07-25 14:59 被阅读1118次

    read preference是使用mongodb中经常涉及到的概念,本文会探究read preference和它的5种取值,以及在程序中如何通过java config配置read preference。如果想通过xml方式配置请参阅ReadPreference读偏好

    read preference

    什么是read preference

    官方对read preference的解释是:

    Read preference describes how MongoDB clients route read operations to the members of a replica set
    

    也就是说read preference是replica set中才会涉及到的概念,用于指定怎么读取数据。写操作一般都是在replica set中的主节点(primary).

    read preference有哪些取值

    主要有5种取值:

    • primary:默认值,此时只会从主节点读取数据。主节点不可用时会报错或者抛出异常。包含读操作的多文档事务Multi-document transactions必须使用这个值。
    • primaryPreferred:大多数情况下从主节点(primary)读取数据,主节点不可用时到从节点(secondary)读取数据。
    • secondary:只会到从节点(secondary)读取数据。写少读多的场景可以考虑使用这个值。
    • secondaryPreferred:大多数情况下到从节点读取数据,从节点不可用时到主节点读取数据。写少读多的场景可以考虑使用这个值。
    • nearest:到网络延迟最低的节点读取数据,不用管该节点是主节点还是从节点。

    程序中通过Java Config配置read preference

    主要可以通过2种方式配置:

    • uri中配置
    • MongoClientOptions中配置

    开发环境

    jar包版本为org.mongodb.mongodb-driver 3.6.4,服务端版本为3.6.6

    uri中配置

    可以在uri中拼接readPreference=primaryPreferred

    @Bean
        public MongoClient mongoClient() {
            String uriString = "mongodb://username:password@cluster0-shard-00-00-75shm.gcp.mongodb.net:27017,"
                    + "cluster0-shard-00-01-75shm.gcp.mongodb.net:27017,"
                    + "cluster0-shard-00-02-75shm.gcp.mongodb.net:27017/?"
                    + "ssl=true&replicaSet=Cluster0-shard-0&authSource=admin"
                    + "&retryWrites=true&readPreference=primaryPreferred";
            MongoClientURI uri = new MongoClientURI(uriString);
            MongoClient mongoClient = new MongoClient(uri);
        
            return mongoClient;
        }
    

    readPreference的其它值参考MongoClientURI。实际上,通过这种方式不止可以配置readPreference,还可以配置很多其它选项,参考MongoClientURI

    MongoClientOptions中配置

    代码示例如下:

        @Bean
        public MongoClient mongoClient() {
            List<ServerAddress> saList = new ArrayList<>();
            saList.add(new ServerAddress("cluster0-shard-00-00-75shm.gcp.mongodb.net", 27017));
            saList.add(new ServerAddress("cluster0-shard-00-01-75shm.gcp.mongodb.net", 27017));
            saList.add(new ServerAddress("cluster0-shard-00-02-75shm.gcp.mongodb.net", 27017));
            
            char[] pwd =  "password".toCharArray();
                    //第二个参数“admin”对应authSource,也就是authentication database.
            MongoCredential credential = MongoCredential.createCredential("username", "admin", pwd);
        
            //必须设置sslEnabled为true,否则会报MongoSocketReadException: Prematurely reached end of stream错误
            MongoClientOptions options = MongoClientOptions.builder()
                    .readPreference(ReadPreference.primaryPreferred())
                    .retryWrites(true)
                    .requiredReplicaSetName("Cluster0-shard-0")
                    .maxConnectionIdleTime(6000)
                    .sslEnabled(true)
                    .build();
            
            MongoClient mongoClient = new MongoClient(saList, credential, options);     
            return mongoClient;
        }
    

    这里必须提醒的是必须设置sslEnabled为true,否则会报MongoSocketReadException: Prematurely reached end of stream错误,参考MongoSocketReadException: Prematurely reached end of stream (after a period of inactivity)
    。关于MongoClientOptions.builder所有选项参考Class MongoClientOptions.Builder,关于MongoCredential使用参考MongoCredential

    相关文章

      网友评论

        本文标题:mongodb的read preference及配置方法

        本文链接:https://www.haomeiwen.com/subject/xmcpmftx.html