全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
云数据库 MongoDB 版

连接分片集群

更新时间:2017-06-07 13:26:11

背景信息

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

1

  • 用户访问 mongos 跟访问单个 mongod 类似;

  • 所有 mongos 是对等关系,用户访问分片集群可通过任意一个或多个mongos;

  • mongos 本身是无状态的,可任意扩展,集群的服务能力为“Shard服务能力之和”与“mongos服务能力之和”的最小值;

  • 访问分片集群时,最好将应用负载均匀的分散到多个 mongos 上。

如何正确地连接分片集群?

所有官方的 MongoDB driver 都支持以 Connection String 的方式来连接 MongoDB 分片集群。

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

  1. 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 来连接的示例代码如下所示:

  1. MongoClientURI connectionString = new MongoClientURI("mongodb://:****@s-m5e80a9241323604.mongodb.rds.aliyuncs.com:3717,s-m5e053215007f404.mongodb.rds.aliyuncs.com:3717/admin"); // ****替换为root密码
  2. MongoClient client = new MongoClient(connectionString);
  3. MongoDatabase database = client.getDatabase("mydb");
  4. 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 节点,从而实现读写分离的功能。

  • 如何限制连接数?

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

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

    在 options 里添加 w= majority 即可保证写请求成功写入大多数节点才向客户端确认。

本文导读目录