zoukankan      html  css  js  c++  java
  • 【深入 MongoDB 开发】使用正确的姿势连接分片集群

    MongoDB分片集群(Sharded Cluster)通过将数据分散存储到多个分片(Shard)上,来实现高可扩展性。实现分片集群时,MongoDB 引入 Config Server 来存储集群的元数据,引入 mongos 作为应用访问的入口,mongos 从 Config Server 读取路由信息,并将请求路由到后端对应的 Shard 上。

    使用分片集群时你需要知道的

    • 用户访问 mongos 跟访问单个 mongod 类似
    • 所有 mongos 是对等关系,用户访问分片集群可通过任意一个或多个mongos
    • mongos 本身是无状态的,可任意扩展,集群的服务能力为『Shard服务能力之和』与『mongos服务能力之和』的最小值。
    • 访问分片集群时,最好将应用负载均匀的分散到多个 mongos 上

    正确连接分片集群的姿势

    要正确连接复制集,需要先了解下MongoDB的Connection String URI所有官方的driver都支持以 Connection String 的方式来连接 MongoDB 分片集群。

    下面就是Connection String包含的主要内容

    mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
    
    • mongodb:// 前缀,代表这是一个Connection String
    • username:password@ 如果启用了鉴权,需要指定用户密码
    • hostX:portX 多个 mongos 的地址列表
    • /database 鉴权时,用户帐号所属的数据库
    • ?options 指定额外的连接选项

    以连接阿里云数据库MongoDB版为例,当你购买阿里云MongoDB分片集群后,就会在控制台上看到各个mongos的地址信息。

    mongos2

    为了方便用户使用,控制台上也生成了连接复制集的Connection String及通过Mongo Shell连接的命令。

    mongos

    例如通过java来连接,更多的DEMO

    MongoClientURI connectionString = new MongoClientURI("mongodb://:****@s-m5e80a9241323604.mongodb.rds.aliyuncs.com:3717,s-m5e053215007f404.mongodb.rds.aliyuncs.com:3717/admin"); // ****替换为root密码
    MongoClient client = new MongoClient(connectionString);
    MongoDatabase database = client.getDatabase("mydb");
    MongoCollection<Document> collection = database.getCollection("mycoll");
    

    通过上述方式连接分片集群时,客户端会自动将请求分散到多个mongos 上,以实现负载均衡;同时,当URI 里 mongos 数量在2个及以上时,当有mongos故障时,客户端能自动进行 failover,将请求都分散到状态正常的 mongos 上。

    当 Mongos 数量很多时,还可以按应用来将 mongos 进行分组,比如有2个应用A、B、有4个mongos,可以让应用A 访问 mongos 1-2(URI里只指定mongos 1-2 的地址), 应用B 来访问 mongos 3-4(URI里只指定mongos 3-4 的地址),根据这种方法来实现应用间的访问隔离(应用访问的mongos彼此隔离,但后端 Shard 仍然是共享的)。

    _2017_02_09_7_23_01

    总而言之,在访问分片集群时,请务必确保 MongoDB URI 里包含2个及以上的mongos地址,来实现负载均衡及高可用。

    常用连接参数

    如何实现读写分离?

    在options里添加readPreference=secondaryPreferred即可实现,读请求优先到Secondary节点,从而实现读写分离的功能,更多读选项参考Read preferences

    如何限制连接数?

    在options里添加maxPoolSize=xx即可将客户端连接池限制在xx以内。

    如何保证数据写入到大多数节点后才返回?

    在options里添加w= majority即可保证写请求成功写入大多数节点才向客户端确认,更多写选项参考Write Concern

  • 相关阅读:
    SPOJ1007 VLATTICE
    hdu 4746Mophues[莫比乌斯反演]
    [Offer收割]编程练习赛13 B.最大子矩阵[枚举]
    [SCOI2011]飞镖[数学模拟]
    2333: [SCOI2011]棘手的操作[离线线段树]
    hdu3507 Print Article[斜率优化dp入门题]
    react 日期
    使用arc进行code review
    css冲突2 要关闭的css在项目代码以外,但是是通过<link>标签引入的css(例如bootstrap):解决方法,在APP.css中使用全局样式
    <svg>标签
  • 原文地址:https://www.cnblogs.com/qianpangzi/p/10369948.html
Copyright © 2011-2022 走看看