解决方案:直播分享|腾讯云 MongoDB 智能诊断及性能优化实践

优采云 发布时间: 2022-10-17 04:13

  解决方案:直播分享|腾讯云 MongoDB 智能诊断及性能优化实践

  本次直播主要分为五个部分:

  MongoDB的核心优势是什么?

  MongoDB 是一个用 C++ 语言编写的基于分布式文件存储的数据库。首先,我们来看看它的核心优势。这里有几个:

  MongoDB是开源的分布式数据库,可以解决传统数据库存储容量的瓶颈问题,用户不再需要提前考虑分库分表等操作。同时,MongoDB也是一个天然的高可用数据库。比如一主两从的工作模式,当主节点意外宕机时,从节点会接管主节点的工作,整个过程不需要依赖任何第三方组件.

  MongoDB的表结构比较自由,添加字段方便快捷。与传统数据库中的大表添加字段相比,运维成本大大降低。

  MongoDB早期使用MMAPv1存储引擎,后来换成了WiredTiger存储引擎,支持行级粒度锁定、热数据缓存等特性,为MongoDB带来高性能、低延迟、高吞吐。

  在默认配置下,MongoDB使用snappy压缩算法,平均可以实现2到4倍的文本数据压缩能力。如果使用zlib压缩算法,可以提升到3到7倍,但是zlib对性能有一定的影响,所以网上一般使用默认配置即可。经测试,默认配置下,相同数据写入MongoDB、MySQL、ES的实际磁盘消耗比例约为1:3:6。

  MongoDB 支持五种平衡访问策略:

  primary:读取主节点。当主节点异常时,可能会导致短期业务异常。

  primaryPreferred:首选Primary,当Primary异常时可以读取Secondary。

  secondary:读取slave节点,将流量均衡分配到多个slave节点,实现负载均衡。

  secondaryPreferred:首选从节点。如果从节点异常,则读取主节点。

  最近:最近的访问。在多机房场景下,就近访问可以避免跨机房访问。

  腾讯云MongoDB核心优势

  腾讯云MongoDB目前已服务于游戏、电商、社交、教育、新闻、金融、物联网、软件服务、汽车出行、音视频等多个行业。

  相比用户自建的MongoDB数据库,腾讯云MongoDB在智能运维、可用性、安全性、性能等方面更具优势。同时通过DBbrain提供一站式监控诊断分析,并能给出相应的优化建议。还集成了官方常用工具,方便用户使用。

  此外,腾讯云 MongoDB 在内核上也做了一些定制化开发,比如解决表数达到百万级时的性能问题,提供 SQL 限流功能,减少流量过大导致的集群不可用问题。安全方面,腾讯云MongoDB可在7天内将数据恢复到任意点,并提供24小时专业支持服务。此外,它还自然地在云端集成了高可用、高性能等通用能力。

  云上 MongoDB 集群常见问题

  3.1。使用分片集群

  云上分片集群遇到的常见问题如上,主要包括大表不启用分片、分片方式次优、分片构建选择不当、高峰期集群抖动未设置平衡窗口等。

  有的用户有一个误区,就是从副本集切换到多分片集群,认为什么都不做,集群的自然性能是副本集的几倍,存储容量是副本的几倍默认设置。

  如果分片集群中没有开启分片功能,数据和流量会默认到主分片,主分片是分片集群中的一个分片。因此,对于数据量大、流量大的集群,记得开启分片功能。

  通常情况下,如果用户主要查看,比如通过order id,可以选择hash sharding方式,这样既保证了读性能,又保证了数据离散写入不同的shard,保证了写入性能和避免了由于数据不平衡导致的大量moveChunk操作。

  如果用户查询主要是范围查询,一般推荐使用范围分片。

  如果有大量的检查点和大量的范围查询,为了避免范围查询引起的所有分片广播查询,建议进行范围分片,这样检查点和普通范围查询都可以从一个分片获取数据。

  对于分片集群分片,通常选择高频查询字段作为分片字段。同时注意insert、update等写操作必须收录sharding字段,否则mongos会因为不知道写哪一部分而返回异常信息。切片数据。

  分片集群的很多抖动都与 moveChunk 有关。moveChunk操作会增加锁、资源消耗,还会涉及到路由刷新等过程。因此,建议分片集群设置一个平衡窗口期,尽量在业务低峰期进行平衡操作。

  分片方式和分片构造的选择比较特殊,与业务使用方式密切相关。因此,需要提取和评估以确保最佳的读写性能。

  3.2. 索引问题

  注意索引问题包括索引操作过程问题和索引内容问题,下面将详细介绍。

  以给副本集添加索引为例,createIndex创建索引成功实际上是在主节点成功后返回,而从节点还没有成功添加索引。如果用户进行读写分离,从节点上的压力比较大,从节点上执行索引的时间可能会更长。如果用户的主节点执行成功,createindex 返回并立即添加其他索引。此时,可能有多个索引。在从节点执行的情况下,从节点的压力会非常大。

  另外,如果用户添加索引“成功”,此时从节点实际上还在执行索引,用户立即删除表的索引。此时从节点将无法访问,因为删除索引会添加一个 MODE_X 排他锁。

  如果业务很核心,不允许有任何抖动,也可以采用滚动添加索引的方式来添加索引。有关详细信息,请参阅:

  

  MongoDB智能索引推荐实现

  智能指标推荐主要是基于指标规则和成本估算来实现的。整体架构如下:

  智能指数推荐分为四个模块:

  其中agent模块和kafka模块的逻辑比较简单,这里主要介绍日志分类模块和成本估算模块。

  4.1。日志分类模块实现步骤

  第一步:提取有效的慢日志。

  并非所有慢查询日志都需要处理。只需要提取存在索引问题的慢查询,例如次优索引和全表扫描。如果判断指标不是最优的?

  答案是比较数据扫描的行数和使用索引时实际返回的行数。如果差异较大,则判断指标不是最优的,需要进一步优化。

  步骤2:根据过滤器对SQL进行分类。

  同一个数据库表中有很多查询,查询条件不同。属于同一类的 SQL 需要满足几个条件,即数据库、表、命令、查询条件完全相同。前三个条件很容易区分。比如在同一个数据库同一个表的情况下,查询条件(包括find、update、delete等)同一个类别,同一个查询条件的前提是查询关键字必须相同且运算符属于同一类别。也忽略查询字段顺序。

  日志聚合处理

  定期从DB中获取分类后的SQL信息,发送给成本估算模块进行处理。

  4.2. 指标成本计算模块处理流程

  4.3. 候选指数成本计算

  成本计算的主要步骤:

  假设有一个候选索引[{work:1, city:1,province:1}, {city:1,province:1,age:1}]),成本计算过程如下图所示:

  上面候选索引对应的执行计划流程为:如果查询选择候选索引执行,则执行计划先进入索引扫描阶段,再进入OR阶段。OR阶段执行完毕后,会启动fetch操作,最终得到结果整个进程扫描了多少行数据,获得了多少行数据,以及整个进程的执行时间。

  腾讯云的成本估算是通过旁路模块实现的,实现难度大,需要对整个内核执行计划有透彻的了解。因此,对于自研用户,如果研发人力有限,可以将数据采样到新的MongoDB集群中。根据候选索引规则,可以根据内核现有能力计算出字段区分度和候选索引成本。最后得出执行索引扫描的结论。多少行,返回多少行,执行时间多长,最终可以得到最优索引。

  智能指数推荐已服务,将逐步向用户开放。有兴趣的可以去体验一下。索引推荐基本可以在半小时内找到实例上存在的索引问题。除了推荐最优索引外,还可以找出实例上的无用索引和重复索引,使最少的索引能够满足用户的需求和性能。等等会更好。

  4.4. 腾讯云 MongoDB 索引推荐总结

  快:在慢查询产生后半小时左右启动最优索引。

  标准:推荐指标是候选指标中计算成本最低的指标

  稳定:采样计算过程对云上集群影响不大,在索引添加过程中增加了保护措施。同一实例最多可以同时添加一个索引。

  MongoDB内核SQL限流实现

  5.1。SQL为什么要限流?

  首先我们来思考这样一个问题:SQL为什么要限流?

  一方面,当流量过大,负载过高,数据库抖动可能导致雪崩时,可以限制流量,保证部分请求可以正常返回。另一方面,为了节省成本,有些用户将多个用户的数据写入同一个实例的不同表中。在某个时刻,用户的新界面可能不正确或者出现其他异常情况,导致流量非常大,这会影响到这个实例上的其他核心服务,可以通过current来限制异常或者不太重要的表的流量限制以确保核心业务流量可以正常访问。另外还有一些突然的表扫描、高危操作等,可以通过限流来限制。

  5.2. 内核在哪里添加限流功能?

  那么,我们在内核中哪里做SQL限流功能呢?

  首先,我们来看看MongoDB的整体架构。它是分层的。第一层是网络收发模块。网络发送和接收后,命令处理模块解析SQL,然后SQL会进入查询引擎模块、读写模块和并发控制模块等流程。

  

  5.3. SQL限流核心实现

  我们整个SQL限流模块是在命令处理模块之后添加的。在这里添加它有什么好处?因为这里已经获取了详细的SQL,并且在并发控制之前实现了SQL限流,避免了SQL限流中的操作影响并发控制和数据库读写访问,防止与下层发生冲突级并发控制模块。

  内核SQL限流的整体流程如下:

  首先,可以在DBbrain界面上配置策略规则,比如SQL类型、并发度,可以配置定时关机或者手动关机。定时关机是指最大运行时间。手动关闭是指打开后一直执行,除非手动关闭停止。

  然后根据读写SQL关键字,配置规则后,可以限制指定库、表或指定SQL语句的流量。整个过程是先在DBbrain控制台下发规则。以分片集群为例,下发给分片集群的配置服务器。配置服务器收到后,将规则写入配置服务器的表中。分片服务器 每个 mongod 都会定期从配置服务器获取这些规则,并将它们加载到自己的内存中。所有 mongod 节点的内存中都会有完整的规则数据。当一个请求发起时,它会通过客户端到达代理,然后到达 mongod 节点。, 匹配限流规则,触发限流操作。

  至于为什么选择对mongod而不是mongos做限流。主要原因是mongos上的流量控制是客户端根据IP进行hash,可能会造成流量不均。另外,线上有副本集的集群,也有分片集群。在mongod上做可以实现代码统一。对mongos做限流,因为mongos是无状态的,不能保证一定程度的相互控制。最后瓶颈一般在mongod节点上,所以我们选择在mongod上限流。

  5.4. SQL限流规则和规则匹配限流流程

  下面继续分享腾讯云MongoDB SQL限流的限流规则和规则匹配限流流程。

  至于SQL限流规则中收录的信息,主要包括SQL类型(如增删改查)、限流时间和并发数。并发数可以限制某种类型的请求同时访问我们的DB的并发量,另外一个就是关键字,可以匹配也可以匹配表,甚至可以匹配详细的SQL,这样指定可以限制库、表和某些类型的 SQL。

  当请求到达MongoDB时,具体的处理流程是首先检查该实例是否开启了SQL限流功能。如果开启,则提取用户请求中的库、表和SQL关键字信息,下一步与配置的限制流规则进行匹配,判断该类型SQL是否有可用的ticket。

  Ticket 代表并发控制中的并发数。如果没有可用的票证,例如票证值为0,则直接限制请求并返回客户端异常。如果有可用的ticket,则将ticket value 减1,同时访问DB。访问DB后,将数据返回给客户端,同时释放当前ticket,后续请求可以继续复用。这是整个限流工作流程。.

  SQL限流经验如下:

  智能诊断案例分享(路由问题、排他锁问题)

  以下是MongoDB社区分享的两个典型案例。踩坑后果很严重,这里单独分享。

  6.1。路由异常诊断与优化

  mongos 1触发chunk [1-50}从shard 2迁移到shard 1。在整个迁移过程中,mongos 1、shard 2、shard 1都能感知到这个事件,所以他们都有最新的路由信息​​。但是mongos 2、mongos 3和shard 0感知不到这个事件,所以还是老路由信息,认为chunk[1-50}还在shard 2中,但实际上数据已经迁移到shard 1了。

  由于client读取slave节点,mongos 1收到xx = 20这样的请求后,查询内存中的路由信息​​,数据在shard 1,所以从shard 1中获取slave节点的数据,因为chunk [1-50} 对应的数据都在 shard 1 中,所以可以访问数据。

  由于从节点默认不进行路由版本检测,当mongos 2或mongos 3访问xx=20的数据时,数据路由记录chunk[1-50}在shard 2,因为数据已经从shard 2迁移过来了分片 Shard 1 和 shard 2 实际上已经没有数据了,所以无法访问数据。

  优化:

  6.2.MODE_X排他锁检测

  很多高危操作会加排他锁,会导致数据库表维度甚至整个节点维度被阻塞,不可用。例如,以下操作会添加 MODE_X 排他锁:

  ①.增表时删除索引

  ②。前台加索引

  ③。表重命名

  ④。索引重建

  ⑤。……

  MODE_X排他锁检测方法:

  定时实时获取lockInfo,获取DDL操作对应的独占锁,实时同步用户。

  总结:如何用GA分析和优化SEO流量?

  如何使用 GA 分析您的 网站 SEO 流量,以及如何改进它?

  刘轩轩 文

  Touch Pulse 咨询数据分析师

  相信大部分公司都希望自己的网站每天都能有大量的流量入站,大量的广告当然是最直接的方式。

  然而,这种方法非常昂贵。展示广告的点击率为1%-2%。即使是流行的信息流广告,点击率也只有 5% 左右。如果用大量的广告来带来流量转化,其实ROAS(广告支出回报率)是无法保证的。

  在淡季或无广告投放时,大部分流量主要来自直接流量、免费搜索、社交流量或推荐流量。在下面的屏幕截图中,55% 的流量来自免费搜索。

  这个时候,与其花钱去吸引全网用户,还不如去吸引这些有需要的潜在用户。

  本文将分享如何通过 GA 分析您的 网站 SEO 流量,以及如何改进它。

  搜索引擎优化流量跟踪

  在 GA 的流量报告下,有一个“Search Console”模块。此报告提供有关自然搜索流量性能的信息。您可以使用此报告了解用户查询和网站在搜索结果中您还可以查看网站交互点击跳出率和电子商务转化率等数据。

  至于如何将Search Console工具与GA连接,请参考我们公众号的另一篇文章,描述非常详细。

  获得SEO流量数据后,如何利用这些数据进行优化?

  1.增加网站收录的数量

  

  我们都知道,只有网站的内容被搜索引擎收录搜索到后,搜索引擎搜索时才会呈现网站的搜索结果。

  您如何为您的 网站 增加您的 收录 到搜索引擎的流量?

  首先是定期更新网站内容。

  搜索引擎的蜘蛛可以习惯网站的爬取。如果发现你的网站经常在早上更新内容,蜘蛛就会经常在早上来你的网站,如果网站长时间不更新或者是不定期更新,蜘蛛可能会认为你的网站是一个未维护的网站,没有新的内容,所以网站的网站@收录效果不好,收录如果不好,当用户在浏览器上检索相关内容时,你的网站的显示次数会相应减少,这是一个连锁反应。

  其次,查看网站内容的收录量,手动提交非收录的页面。

  如何在不同的搜索引擎中查看网站的收录量,这个比较简单,市面上有很多查询工具,比如站长工具。

  还有一种方法是手动添加收录,即每次发布新内容网站后,去百度、360或者谷歌的搜索资源平台,手动将更新的内容提交到平台。这种方式最快最直接,但是需要人工操作的时间成本。

  2.关键词优化

  用户在搜索引擎上搜索关键字以找到他们正在寻找的内容。我们都知道SEM(付费关键词)会占据搜索结果的前几名,其次是自然的收录内容匹配。

  搜索结果有时有几十页。根据谷歌搜索引擎的数据,80%的用户只看了第一页的内容,只有20%的用户会看到第二页,所以如果网站的排名如果没有优化到前两页,被用户看到的机会很小。

  以搜索结果的第一页为例,一共会显示10个搜索结果。排名第一的内容点击率在23%-35%左右,最后一个内容的点击率只有2%左右,所以前五的位置是军阀的战场。

  SEO的核心是关键词的优化,包括网页'TDK'的设置、关键词的密度、口碑等,如何优化这是一个很大的课题。大家要找的是一些通用的关键词选择策略,而关键词可以通过GA得到。

  很多网站都会有搜索功能,就像我们触迈官网的搜索功能,方便用户快速获取感兴趣的内容。

  用户搜索词直接代表用户的意图和感兴趣的内容。如果很多人在您的 网站 上搜索相关术语,那么很可能更多人也在搜索引擎上搜索它们。因此,可以利用 GA 数据来寻找新的关键词。

  在 GA 中,有一个采集和分析用户搜索词的报告。在此报告中,您可以看到用户搜索不同字词的次数,以及搜索后退出百分比等数据。

  在做搜索引擎优化时,可以充分利用这份报告,分析哪些词被检索次数最多,并将这些词应用到SEO或SEM的优化词袋中。

  

  3.错误警告

  我们在浏览网页时,经常会遇到上图。什么是 404 页面?通俗的理解是,你想看的页面不存在。通常是由于 URL 更改、网页删除、网页配置等问题。

  早在几年前,我们看到的 404 页面还是很生硬的呈现方式,未来我们会越来越重视用户体验,所以我们逐渐用自定义的 404 页面代替了原有的呈现方式。

  我们都知道搜索引擎收录需要依靠蜘蛛来抓取页面。当搜索引擎蜘蛛在请求 URL 时得到“404”状态响应时,它就知道该 URL 已过期,将不再索引该 URL。网页,并向其数据中心反馈该 URL 处的网页已从数据库中删除。自定义 404 错误页面的内容,这可能会导致重复页面出现问题。

  对于搜索引擎,尤其是谷歌搜索引擎,不仅难以获得信任指数,而且大大降低了谷歌对网站质量的评价。所以网站404页面的出现非常影响SEO优化。

  但是“404 - Page Not Found”错误是很难避免的,处理它的方法是监视它。对此,我们可以使用GA来实现:

  首先,确保所有 404 页面都有统一的页面标题,例如“404-not found”或“Page not found”。

  其次,在您的 GA 帐户中设置自定义提醒,如下图所示:

  这样,当网站上的用户浏览到404页面时,我们可以及时发现并纠正。

  SEO优化是一个长期的过程。不可能像展示广告或搜索广告那样在短时间内给网站带来大量流量。在通过 GA 工具为 SEO 提供数据辅助时,我们需要保持批判性思维,从数据表象中挖掘更深层次的数据价值。

  (加客服,可加入交流群)

  备注:昵称-地区-公司-职位

  GA使用、数据学习、行业交流、干货分享……

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线