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的地址信息。

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

例如通过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 仍然是共享的)。

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

常用连接参数

如何实现读写分离?

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

如何限制连接数?

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

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

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

最新文章

  1. Xftp连接linux(ubuntu)时提示ssh服务器拒绝了密码,请再试一次
  2. 字典树 - A Poet Computer
  3. synchronized的实现原理和应用
  4. SQLServer中系统存储过程sp_spaceused
  5. oracle ORA-12514: TNS: no listener 解决方案
  6. SQL server 视图、范式
  7. GRUB学习笔记(转自http://www.cnblogs.com/evilzy/archive/2008/03/30/1130173.html)
  8. linux下搭建nginx+php(FastCGI)+mysql运行环境
  9. android实现文本复制到剪切板功能(ClipboardManager)
  10. ntpdate
  11. JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类
  12. python笔记:#008#变量的命名
  13. 思科模拟器PacketTracer7--利用一台交换机将两台pc划分到不同vlan下
  14. struts2 升级至2.3.32时访问页面报错 File &quot;/struts-tags&quot; not found
  15. [转] Webpack 打包优化之体积篇
  16. python学习笔记_week4
  17. sql number类型和varchar2类型
  18. 你得学会并且学得会的Socket编程基础知识
  19. Sql:主表与子表的最新记录级联查询
  20. web本地存储(localStorage、sessionStorage)

热门文章

  1. java学习笔记(八):继承、extends、super、this、final关键字
  2. iOS的SVN
  3. android 个人使用总结
  4. TZOJ 1689 Building A New Barn(求平面上有几个其它点求到n个点的曼哈顿距离最小)
  5. GPL_LGPL
  6. Linux系统性能监控工具:tsar 安装、配置、以及使用
  7. centos 7 vim 保存文件 root 权限 及 使用
  8. AI制作icon标准参考线与多面板复制
  9. jQuery对象和DOM对象相互转换
  10. ipcam