• 【深入 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

  • 相关阅读:
    Online Conversion Advanced Roman Numeral Converter
    如何对CentOS FTP服务配置 51CTO.COM
    [CPyUG][OT]为什么mysqlpython 2010年以后未见更新啊. maolingzhi@gmail.com Gmail
    专业的智能解析 WEB DDOS防御提供商
    深入了解scanf()/getchar()/gets()/getch,getche sunysl的专栏 博客频道 CSDN.NET
    they're hiring
    linux下绘图工具dia,功能强劲直逼visio 潜入技术的海洋 51CTO技术博客
    北京网通dns地址服务器大全 产品/方案 net.ChinaUnix.net
    北京光环新网科技股份有限公司 IDC,ISP,CDN,专线,托管,机房,数据中心,光纤接入
    lighttpd,thttpd,shttpd 轻量级WebServer介绍
  • 原文地址:https://www.cnblogs.com/qianpangzi/p/10369948.html
Copyright © 2020-2023  润新知