阿里云数据库ApsaraDB 关注
手机版
  1. 云栖社区>
  2. 阿里云数据库ApsaraDB>
  3. 博客>
  4. 正文

MongoDB Driver:使用正确的姿势连接分片集群

yunnotes 2017-02-09 19:25:29 浏览3565 评论3 发表于: 阿里云数据库ApsaraDB

数据存储与数据库 MongoDB 阿里云 HTTPS 高可用 集群 负载均衡 string Driver database

摘要: 云数据库 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

基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化。并提供专业的数据库在线扩容、备份回滚、性能优化等解决方案。
本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至yqeditor@list.alibaba-inc.com;如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

用云栖社区APP,舒服~

【云栖快讯】中办国办印发《推进互联网协议第六版(IPv6)规模部署行动计划》加快推进基于 IPv6 的下一代互联网规模部署,计划指出2025年末中国 IPv6 规模要达到世界第一,阿里云也第一时间宣布了将全面提供IPv6服务,那么在全面部署 IPV6 前,你需要了解都在这儿  详情请点击

网友评论

1F
外拓科技

免费启用中文后缀域名如:.com【互联网】,.cn【中国】,.net【网络】
《互联网域名中文输入简化协议》
中文3.0时代
爆发了!

.cn 翻译为【中国】
.com 翻译为【互联网】、【国际互联网】
.com.cn 翻译为:【中国互联网】
.net 翻译为:【国际网络】、【网络】
.net.cn 翻译为:【中国网络】
.org 翻译为:【国际公益】;【公益】
.org.cn 翻译为:【中国公益】;【公益】
.gov.cn 翻译为:【中国政府】;【政府】
.edu.cn 翻译为:【中国教育】;【教育】

例如:【超密】bbs.aliyun【互联网】;https://bbs.aliyun.com
将http:// 翻译为【超文】加上对应的后缀用中文全角分号标准“;”
如 【超文】外拓科技【公益】;http://www.waituo.org

这是免费的!只为母语而生!

将文本内容保存到域名根目录的
zwdns.html

《互联网域名中文输入简化协议》

内容
【超密】bbs.aliyun【互联网】;https://www.bbs.aliyun.com

当支持【中文协议】的浏览器地址栏网址为https://www.bbs.aliyun.com时显示【超密】bbs.aliyun【互联网】

将文本内容保存到域名根目录的
zwurl.html

《互联网域名中文输入简化协议》
内容

【超密】bbs.aliyun【互联网】:《互联网域名中文输入简化协议》;https://bbs.aliyun.com/read/305217.html?displayMode=1&ordertype=asc

当支持【中文协议】的浏览器地址栏网址为https://bbs.aliyun.com/read/305217.html?displayMode=1&ordertype=asc
时显示
【超密】bbs.aliyun【互联网】:《互联网域名中文输入简化协议》
用户在支持【中文协议】的浏览器地址栏输入【超密】bbs.aliyun【互联网】:《互联网域名中文输入简化协议》
会解析到https://bbs.aliyun.com/read/305217.html?displayMode=1&ordertype=asc
还等什么呢!行动起来吧!
我们已为阿里开通【淘宝】中文商标域名后缀,【天猫】中文商标域名后缀。 【淘宝】的中文DNS查询地址是zwdns.taobao.com 自行管理审核,【天猫】的是zwdns.tmall.com 自行管理审核。
如您的淘宝网店是
外拓科技 网址是 https://waituo.taobao.com
您可 在支持【中文协议】的客户端上输入 外拓科技【淘宝】
系统会查询【淘宝】店铺的 外拓科技 给你解析 如:【超密】外拓科技【淘宝】;https://waituo.taobao.com

快快关注【中文协议】吧;http://www.waituo.org

2F
诗坤

为什么不在增加一个延迟备份节点?

3F
1231783689382481

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

怎么分散呢?轮询?hash?

关注
yunnotes
张友东,花名林青,阿里云数据库组技术专家,主要...
86篇文章|409关注
基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化。并提供专业的数据库在...

提供海量、安全和高可靠的云存储服务。RESTful API的平台无关性,容量和处理能力的弹性扩展,按实际容量付费...

快速、完全托管的TB/PB级数据仓库解决方案,向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更...

为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...