利用MongoDB 分片集群(Sharded Cluster)实现高并发大数据处理

一、前言

考虑这样一个场景,有个数据量有10多亿数据的设备库,里面存放了注册的设备的信息,并且设备数据还可能会递增,然后业务集群需要对指定条件的设备群发信息,那么如何才能高效的来处理这个问题那?

二、思考

2.1 离线分析

为了不影响在线业务,以往需要把一份数据进行多次复制来分别进行业务交易和数据分析的问题,也就是业务交易的数据是在原来的库,而数据分析是通过手段把原来库数据定时同步到另外的存储设备离线分析。上面所说消息群发设备就可以使用这种方式,首先全量把数据同步到另外的存储设备,然后在定时把原来库里面的新数据增量到存储设备。

2.2 离线库

2.2.1 阿里云产品mondb介绍

对于存储设备可以选择阿里云产品MongoDB,原因是MongoDB 分片集群(Sharded Cluster)通过将数据分散存储到多个分片(Shard)上来实现高可扩展性。实现分片集群时,MongoDB 引入 Config Server 来存储集群的元数据,引入 mongos 作为应用访问的入口,mongos 从 Config Server 读取路由信息,并将请求路由到后端对应的 Shard 上。下面看下原理图

image.png

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

Sharding Cluster使得集合数据被分散到多个Shard存储,也就是每个shard存放整体数据的一部分

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

所有官方的 MongoDB 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 指定额外的连接选项。

2.2.3 java 代码访问

通过 java 来连接的示例代码如下所示:

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 上。

好吧,言归正传,上面知道大数据最后会被分散到不同的shard上,而我们的应用系统是集群,如果能让集群每台机器分摊不同shard上的数据进行处理,那么性能肯定杠杠的,可以吗?答案是必须的。

mongb上有个config.shards,config.shards集合存储各个Shard的信息,可通过addShard、removeShard命令来动态的从Sharded cluster里增加或移除shard。

mongos> db.shards.find()
{ "_id" : "mongo-9003", "host" : "mongo-9003/10.1.72.135:9003,10.1.71.136:9003,10.1.72.137:9003" }
{ "_id" : "mongo-9004", "host" : "mongo-9004/10.1.72.135:9004,10.1.71.136:9004,10.1.72.137:9004" }

通过config.shards可以获取所以分片shard的地址然后替换上面的url中host,就可以让集群系统里不同机器直接访问shard上的数据。

image.png

三、总结

使用mongdb的分片机器可以使应用集群中每台机器去访问分片机器每个shard上面的数据,从而实现并发处理大数据目的

四、参考

https://www.aliyun.com/product/mongodb?spm=5176.doc51059.765261.265.GYhOb0

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序你好

.Net桌面系统架构设计

1431
来自专栏java思维导图

动手实践,即时通讯WebSocket的代码实现

  随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务...

2014
来自专栏互联网大杂烩

OAuth协议

OAUTH 协议旨在为用户资源的授权访问提供一个安全,开放的标准。平台商通过OAUTH协议,提示用户对第三方软件厂商(ISV)进进行授权。 使得第三方软件厂商...

661
来自专栏逸鹏说道

Nokia 920板砖自救(理论上通用,升级Win10成板砖也可以用这个恢复)

异常处理汇总 ~ 修正果带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4599258.html 个人博客:http...

3047
来自专栏高性能服务器开发

4 关于游戏服务端架构的整理

一个大型的网落游戏服务器应该包含几个模块:网络通讯,业务逻辑,数据存储,守护监控(不是必须)。其中业务逻辑可能根据具体需要,又划分为好几个子模块。

4005
来自专栏北京马哥教育

15个最受欢迎的Python开源框架

我们从GitHub中整理出了15个最受欢迎的Python开源框架,这些框架包括事件I/O、OLAP、Web开发、高性能网络通信、测试、爬虫等。   1. Dja...

3827
来自专栏blackpiglet

在Play with Kubernetes平台上以测试驱动的方式部署Istio

翻译一篇 Istio 部署教程,原文链接:test-drive-your-first-istio-deployment-using-play-with-kube...

1582
来自专栏finleyMa

使用ngrok内网穿透工具

这时可以使用ngrok工具。他可以分配给你一个公网的二级域名,来绑定你本地的正在跑的http服务。 比如我本地跑了一个vue cli搭建的程序,跑起来后默认是...

1.2K3
来自专栏大魏分享(微信公众号:david-share)

浅谈互联架构下的各种缓存技术

面对巨大的客户端访问量冲击,怎么办? 当业务系统收到突发大流量冲击的时候,怎么办?例如,双十一、双十二,银行遇到的突发交易请求;或者网站遇到突发流量访问,怎么处...

1.2K4
来自专栏Petrichor的专栏

git: 为什么 pull request 不叫 push request

在日常的开源社区使用中,有时候会遇到我 想要 协助修改 的 开源项目。这个时候,pull request(合并申请功能)就可以让原本 没有 该仓库 修改权限 ...

1.8K2

扫码关注云+社区

领取腾讯云代金券