Ø 问题背景
UMC监控对计数器数据绘图,描绘曲线的走势。默认3秒钟获取一个样本,当跟踪时间拉长到1周时,计数器数据可能达到千万级别。要在有限的图表上描绘这么多节点,是不可能的,无法看清晰去曲线走势。
问题简化方案:
本质上是一个数学问题,不计较标准偏差,可以对数据二次加工,计算每5分钟的最大值、最小值、平均值,用5分钟一个样本描绘走势。
算法描述:
将原始时间Createtime和最小创建时间做差,精确到秒,DateDiff(minute,@minDate,Createtime),用差值除以需要的时间间隔取模,如间隔5分钟,这样5分钟内所有的数据被划分为一组,使用计数器分类、名称等相关信息和加工后的时间共同分组,计算Max值,即为5分钟一个样本。
SQL 实现:
Select max(value) from perflog group by [计数器名称], [分类], …. ,DATEADD(minute,DATEDIFF(minute,@minDate,createtime)/@Interval*@Interval,@minDate)
SQL 优化:
相关计数器分组的字段较多(~10个),我们将不变的部分构造成一个Bizkey,使用Bizkey+ DateADD分组,减少分组依据。SQL Server选择并行索引扫描,快速计算结果。优化后,执行时间从原始 2分钟提高到16秒。这里感叹下,简单统计SQL引擎确实很强,并行扫描极大的提高了计算时间,索引扫描又降低了IO读取,~800w数据分组排序,执行16秒基本已经达到了关系数据库的极限。
Ø NoSQL介绍
先了解下流行的NoSQL:
1. 文档数据库,典型代表:MongoDB
优势:
a) 文档数据库将集合按范围横向切片,假设TableA中10条数据,1~10,三个节点A、B、C,数据分布可能为3,3,4。当数据量增大时,数据会自动分布到多个节点,对应用透明。数据分布的均匀程度,决定了性能的高低。
b) 文档数据库更接近关系数据库,可以把相似结构文档放在一起,建立索引,支持类SQL查询。
c) MongoDB 2.2版本以上增加了Aggregate Framework,无需自己实现Map/Reduce,可以通过Json方式进行Max、Min、Group等多种查询。
d) 支持O/R Mapping。
e) 支持分布式集群Sharding。
劣势:
a) 非内存数据库,通过操作系统虚拟内存映射,实现缓存,内存换页效率波动较大。
b) 存储空间较大。
2. 列式存储数据库,典型代表:HBase
优势:
a) 列式存储,更适合稀疏数据,存储空间小。相关列可以定义列簇,同一列簇存储在同一物理块上,不同列簇可分不到不同节点,数据纵向切分。
b) 支持分布式集群HDFS。
c) 扩展性好,稳定,基于Hadoop,轻松实现Map/Reduce。
劣势:
a) 不支持类SQL。
b) 环境部署较复杂。因为HDFS分布式文件系统是其核心,对速度要求非常高,仅支持类Linux。插曲:之前为了部署一个Hadoop环境,用Windows+Cygwin+Hadoop+HBase,折腾了一周多,反编译Jar包、重编译、各种文件路径、权限错误,后来开源项目上发现有的版本声明不再解决由Cygwin引起的异常。遂放弃改用Ubuntu,很快搞定。
3. Key/value数据库,典型代表:Redis
优势:
a) 一个字,快。
b) 支持O/R Mapping。
c) 默认支持Hash、List、Key/Value、SortSet等多种存储方式,基于Json序列化/反序列化,效率较高。
d) 支持集群
劣势:
a) 更多用作缓存,数据统计工作依赖代码实现Map/Reduce。
简单认识了几个流行的NoSQL,我选择了MongoDB实现UMC的统计。原因只有一个:代码简单,合适的工作做适合的事情。
Ø MongoDB版代码实现
MongoDB有不少支持.NET的驱动,我选择了 官方驱动+MongoDB 2.4版本,(至于为什么选这个版本,后面再说) + Aggregate Framework(2.2版以上支持) + Json.NET + C# 实现。这样的实现方式最简化,代码见附件。
Ø 测试结果
很遗憾,测试结果45秒。执行过程中发现多核服务器只跑满了一个核。MongoDB的Aggregate Framework实际上就是Map/Reduce的默认实现,而当前Map/Reduce框架是单线程执行,MongoDB考虑后续版本引入多线程。So Cool! J
Ø MongoDB Sharding
既然做了,就干脆彻底!45秒还没有SQL快,是Mongo不行,还是我弱?呵呵,答案是肯定的,一定是我用法不好。
MongoDB并非内存数据库,它的优势在于横向扩展,这也是传统DB处理大数据时难以逾越的鸿沟。那么,接下来,引入Sharding集群。
部署环境:
Int6 16G内存,8核服务器。单台机器上部署三个节点,使用不同端口,8887,8888,8889。
优化后结果:
56秒!崩溃。。。。。哪出了问题??
再观察执行过程,开始几秒阶段,3个Mongo进程一同执行,仅仅几秒后,就一直是1个进程执行了。问题应该就在这里!察看三个节点上的数据分布:
Sharding 0000:12w数据
Sharding 0001:700w数据
Sharding 0002: 80w数据
靠,MongoDB号称的Auto-Sharding思想真的是理论上的巨人,实现上的鸡肋???
Auto-Sharding是Mongo 2.x版引起广大震撼的一个特性,它负责将数据均匀分布到多个节点,理论上类似细胞分裂,当一个Chunk的数据量达到一定规模,自动分裂成两个,然后Balancer进程负责把数据转移到其他节点。数据是否均匀,决定于ShardingKey的选择,但2.2版本中只有一种范围选择,可以指定某列做key,但是还要开发者对数据分布、Sharding机制充分了解,数据分布才能更均匀,我想,真的只有全职数据维护的人,才能作这个工作。阿里巴巴好像有专人定时手工Move数据。。。。。
Ø MongoDB Hashed Sharding
Mongo 2.4版本,实现了Hash key的Sharding机制。之前的伏笔揭开,这也是我后来选择2.4的原因。
启用hash sharding:
db.runCommand({shardcollection:"umcdb.umcperflog",key:{_id:"hashed"}})
查看数据分布:
Sharding0000~0002三个节点上数据分布非常均匀,Good!
执行结果:
见证奇迹的时刻….14秒!!
整个过程中,3个进程协同工作,非常平稳,随着节点数量增加,海量数据的分析会更快!而我们呢,代码完全不同改动,受益于NoSQL的横向扩展,太cool!

- 大小: 10.1 KB

- 大小: 3.1 KB
分享到:
相关推荐
这个“mongodb-linux-x86_64-rhel62-4.0.0.tgz”文件是专门为基于Red Hat Enterprise Linux 6.2 (RHEL62)的64位Linux系统设计的MongoDB 4.0.0版本的安装包。MongoDB 4.0是一个重要的版本,因为它引入了许多新特性和...
4. **原子性读写操作**:在更大范围内支持原子性的读写操作,提高了并发处理能力。 5. **安全增强**:包括TLS/SSL加密连接的默认启用,以及加强的认证和授权机制。 安装MongoDB 3.4.0在Ubuntu 16.04上的步骤通常...
MongoDB是一款高性能、开源、无模式的文档型数据库,它属于NoSQL数据库家族,特别适合于处理大量数据的Web应用。在Linux环境下安装MongoDB,尤其是对于i686架构的系统,步骤可能会略有不同。从提供的标题"mongoDB-...
MongoDB作为NoSQL数据库的一种,因其高性能、易扩展、分布式存储等特点,在大数据处理领域获得了广泛的应用。在部署大规模的MongoDB数据库时,需要考虑到数据的高可用性、负载均衡、数据备份和故障转移等需求。下面...
MongoDB是一个高性能、高可用的分布式NoSQL数据库,特别适合处理大规模数据。Springboot提供了对MongoDB的集成支持,通过Spring Data MongoDB库,我们可以方便地进行数据操作。在本示例中,Springboot将与MongoDB...
MongoDB是一款开源、高性能、无模式的文档型数据库,它属于NoSQL数据库家族,特别适合于处理大量数据的高并发场景。在这个特定的压缩包"mongodb-linux-x86_64-3.4.18.tgz"中,包含的是MongoDB针对Linux 64位系统的...
本文将深入探讨“Tencentcloud-sdk-python-mongodb-3.0.432”这一Python库,它是由腾讯云提供的针对MongoDB数据库的SDK,用于帮助开发者在Python环境中便捷地与腾讯云MongoDB服务进行交互。 首先,我们需要理解...
MongoDB是一款开源、分布式、高性能的NoSQL数据库,它以其灵活的数据模型、强大的查询语言以及自动分片功能而广受欢迎。在Linux 64位环境下,MongoDB的安装和使用通常涉及以下几个关键知识点: 1. **MongoDB版本**...
1. **写入优化**:在2.2.2版本中,MongoDB对写操作进行了优化,提高了写入性能,减少了延迟,使得实时数据处理更加高效。 2. **副本集改进**:该版本增强了副本集的稳定性,改进了故障切换机制,确保数据的高可用性...
- **聚合框架优化**:提供了更强大的聚合功能,如窗口函数,使得数据处理和分析更为便捷。 - **变更流**:允许实时监控数据集的变化,这对于实现实时数据分析和监控非常有用。 - **新的存储引擎**:WiredTiger...
MongoDB 4.2版本是该数据库系统的一个重要里程碑,它带来了许多新特性和改进,旨在提升数据处理效率和用户体验。在这个“mongodb-linux-x86_64-ubuntu1604-4.2.0.tgz”压缩包中,包含的是MongoDB 4.2版本针对Ubuntu ...
MongoDB 是一个流行的、开源的文档数据库系统,属于 NoSQL 数据库,它使用 JSON 格式的文档存储数据,具有高可用性、高性能和易扩展性的特点。 在集成 Spring Boot 和 MongoDB 的过程中,我们可以利用 Spring Data ...
《Python库tencentcloud-sdk-python-mongodb:连接与操作腾讯云MongoDB数据库的利器》 ...在实际项目中,结合Python的灵活性和MongoDB的高性能,我们可以构建出强大的数据处理系统,满足各种复杂场景的需求。
MongoDB是一款开源、分布式、高性能的NoSQL数据库,它以JSON格式存储数据,适用于处理大量非结构化和半结构化数据。在这个“数据库-MongoDB安装以及数据初始化海量数据.rar”压缩包中,包含了关于MongoDB的安装指南...
6. **聚合操作**:MongoDB-Mapper也支持MongoDB的聚合框架,允许你进行数据的分析和处理,如分组、过滤、计算等。 7. **事务支持**:尽管MongoDB本身在单个文档级别提供原子性,但跨文档的事务处理需谨慎,MongoDB-...
a /etc/yum.repos.d/mongodb-org-4.4.repo && echo "gpgcheck=1" | sudo tee -a /etc/yum.repos.d/mongodb-org-4.4.repo && echo "enabled=1" | sudo tee -a /etc/yum.repos.d/mongodb-org-4.4.repo`。 3. **安装...
5. 强大的查询语言:MongoDB的查询语言(MQL)允许对数据进行复杂的查询,同时支持聚合框架,用于数据处理和分析。 6. 文件存储系统:MongoDB的GridFS特性允许存储和检索大型文件,如图片、视频等,将大文件分割成...
MongoDB 是一个高性能、开源、无模式的分布式文档数据库,被广泛应用于Web应用程序、大数据分析、内容管理系统等场景。MongoDB 3.0.7 版本是2015年发布的一个稳定版本,它提供了许多重要的改进和新特性。 在Linux ...
例如,他们可以利用Go的并发特性实现多线程查询,提升大数据处理的效率;或者使用Go的类型系统和强大的JSON支持,轻松地序列化和反序列化数据到MongoDB的文档结构。 总的来说,"mongodb/mongo-go-driver"为Go开发者...
MongoDB是一款开源、分布式、高性能的NoSQL数据库,特别适合处理海量数据。在这个"mongodb-linux-x86_64-3.2.12.tgz"压缩包中,包含的是适用于Linux平台的64位MongoDB版本3.2.12。这个版本是2017年发布的一个稳定版...