MongoDB 与太阳城手机版-MongoDB-@太阳城手机版资讯
你好,游客 登录
背景:
阅读新闻

MongoDB 与太阳城手机版

[日期:2018-01-29] 来源:云栖团队博客  作者: [字体: ]

讲师通过介绍MongoDB的日志审计和慢查询、解析即将商业化的MongoDB索引推荐功能,利用MapReduce&Flink做审计日志分析、以及通过创建索引的最佳实践的例子让大家了解阿里云是如何利用太阳城手机版对MongoDB里面的太阳城和信息做分析的。

本次直播视频精彩回顾, 戳这里!

直播涉及到的PPT, 戳这里!


以下内容根据演讲嘉宾视频分享以及PPT整理而成。

本次的分享主要分为以下四个部分:

一、MongoDB日志审计和慢查询介绍

二、MongoDB索引推荐解析

三、利用mapreduce&flink做sql分析

四、创建索引的最佳实践

MongoDB的特性


MongoDB是一个介于关系太阳城库和非关系太阳城库之间的产品,是非关系太阳城库当中功能最丰富,最像关系太阳城库的。MongoDb具有如下主要特性:

1. 支持单文档事务;

2. 灵活的json格式存储,最接近真实对象模型;

3. 高可用,运维简单,故障自动切换(自带读写功能,和指读功能);

4. 可扩展分片集群海量太阳城存储;

5. 支持多种引擎wiretiger rocksdb;

6. 适用场景:游戏,物流,电商,社交等。

MongoDB的日志审计和慢查询介绍


在使用MongoDB的使用过程当中,经常会遇到如下问题:

1. 查询超时报错;

2. 太阳城库响应慢;

3. CPU达到100%;

以上是用户经常反馈的性能问题,出现问题的原因一般是因为用户的某一个查询进行全表扫描导致性能差,或者使用的索引不够好。

用户如何知道哪些SQL导致进行全表扫描?这些都可以在审计日志中查看。当选择MongoDB服务时,在太阳城安全性中,审计日志的标签下就可看到某一个时间段内这个太阳城库所有的更新,删除包括慢查询的SQL。用户可通过更新和删除操作来判断太阳城库有没有恶意操作以及非预期操作。审计日志图如下所示:

在审计日志中,有多种更新的方式(例如update、find and modify),第二列是操作的执行时间,第三列是访问的DB以及使用的账号,从这用户即可通过审计日志发现太阳城库内容的变更情况,并且对这些更新操作来做一个审计,来发现是否有误操作和非预期操作。

atype等于slowOp的一些查询日志就是慢查询,一般超过100毫秒的SQL会被记为慢查询并出现在审计日志里,用户再通过slowOp这个关键字去查找就能找出所有的慢查询。这个效果和用户通过直连太阳城库的查询效果是一样的。并且通过审计日志查询,对用户太阳城库的使用没有任何性能影响。

MongoDB索引推荐解析

当发现MongoDB存在慢查询的时候,传统优化慢查询的方法一般是人工优化慢查询、创建复合索引等方法。然而使用直连太阳城库去查的话,会对用户的太阳城库产生性能开销,并且复合索引列的顺序不同,产生的优化效果差异也大。除此之外,传统优化还有以下不足:

1. MongoDB的DBA极少;

2. 慢查询缺少统计;

3. 成本高。

正因如此,阿里云推出了MongoDB索引推荐服务:

1. 对慢查询进行统计和索引推荐;

2. 对不支持索引推荐的命令进行改写或者提示;

3. 对索引推荐的效果进行定量分析;

4. 索引推荐服务在四月份左右商业化。

索引推荐服务经历了两代架构的调整:

第一代架构调整是基于批量的计算引擎来得到的一些计算结果,架构图如上所示。

之所以要有第二代架构是因为第一代架构只支持批量的运算,运行的时间也较长,比较适用于每天做一次的离线分析,并且用户对实施性的要求变高了。第二代是基于流式的引擎,主要是利用flink做的索引推荐的分析服务,它同样是在MongoDB上面做一些采集。

利用MapReduce&Flink做审计日志分析

MapReduce是一个并行程序设计模型与方法(Programming Model & Methodology)。它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模太阳城的编程和计算处理。

Flink流式引擎的核心是一个流式的太阳城流执行引擎,其针对太阳城流的分布式计算提供了太阳城分布、太阳城通信以及容错机制等功能,Flink流式引擎的主要特点如下:

1、连续流操作符——在太阳城到达时进行处理,没有任何太阳城收集或处理延迟;

2、支持SQL;

3、提供恰好一次的保证,及每条记录都仅处理一次;

4、提供一个非常高的吞吐量;

5、容错和开销都非常低;

索引推荐服务会从中分类出如下四种模型:

1、CURD模型;

2、索引模型;

3、表模型;

4、太阳城模型。

这些模型期望达到的监控用户有没有做一些非预期的更新和删除操作、根据提供的索引或者是删除一些冷索引达到提升性能的目标、通过对冷表更高效的压缩来达到减少空间的目标。

索引推荐的实现主要是通过每天离线推荐服务,具体的实现包括以下四个部分:

1、获取审计日志;

2、对审计日志进行查询模板化的处理;

3、选出核心慢查询(基于统计分析选出最值得优化的慢查询);

4、推荐索引和查询的改写。

创建索引的最佳实践

接下来通过一个实例来实践操作:

例如查询样例如下:

db.staff.find(

{

“birth_city:{

“$in”:[“beijing”,”shenzhen”]

},

”work_city”:”hangzhou”,

”age”:{

“$gte”:20

}

}).sort({“birthday”:1})

通过模板化,去掉业务太阳城:

集合名:staff

操作符:query

查询命令:

{“birth_city”:{“$in”,”<val>”},”work_city”:<val>,”age”:{“$gte”:”<val>”}}

排序命令:{“birthday”:1}

通过这样的方法,用户类似的查询都会统一为这样的模版,通过这些模版,对于执行时间超过100ms的模板化的查询,统计以下太阳城:

1、平均执行时长;

2、平均文档扫描次数;

3、平均索引扫描次数;

4、平均返回行数;

5、是否使用内存排序;

6、最后执行时间;

7、执行计划。

得到这些统计的太阳城以后,选择最值得优化的慢查询,这里有个最简单的规则:等号操作的列要放在in操作列的前面,in操作列要放在sort操作列的前面,sort操作列又要放在范围操作列的前面,当用户创建索引的时候,希望遵循这个规则去创建。例如如上所说的例子:

查询命令:

{“birth_city”:{“$in”,”<val>”},”work_city”:<val>,”age”:{“$gte”:”<val>”}}

排序命令:{“birthday”:1}

最终创建索引:{“work_city”:1,”birth_city”:1,”birthday”:1,”age”:1}

因为work_city列是等号操作,所以放在第一个位置,根据规则,以此类推birth_city放在第二个位置等等。

目前的索引推荐功能,是以pdf的方式发送给用户,效果如上图所示。

推荐的索引会自动克隆出一个用户不可见的MongoDB太阳城库,系统会在该太阳城库创建索引,来比对索引创建前后的计划、执行时间有无降低、慢查询有无消除等。该查询结果信息会反馈给用户,让用户决策该索引是否需要创建。目前定量分析是免费提供给用户使用。

截至到目前,索引推荐服务试用内测了三个月,经历了两代架构调整,按照推荐去建索引的用户,慢查询量明显下降。有用户按照推荐建索引,每天减少90多万条慢查询,占其慢查询总量99.5%以上。




收藏 推荐 打印 | 录入:Cstor | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款