在上一篇文章中,我们解释说,使用数据库分区和热和冷分离来优化存储。尽管解决了缓慢的查询速度问题,但在大量数据下仍会出现缓慢查询的问题,并且某些系统中的热和寒冷在某些系统中会很热。data也需要经常或同时查询。本文,我将带领您学习如何在设计系统体系结构时解决大规模数据存储和查询。
提示:
我们有一个自动化的公众舆论系统。简短的工作流程是:每日数据收集服务将从公共社交媒体中收集数据并将其存入数据库。根据某些规则对数据库中存储的数据进行分析和识别,并并识别它。将分析和识别结果放入库中,客户端读取数据库的分析和识别结果,以及显示信息,该系统还支持公众意见的可追溯性功能(例如,有人在公共社交平台上发表了不好的评论。找到他先前发表的所有评论,以及他先前发行的所有识别结果)。对上述公众舆论系统的简要说明,我们可以看到该系统需要收集大量数据进行分析,并且需要查询历史数据。因此,该系统具有以下两个特征:
然后,根据这两个特征,我们无法在上一篇文章中提到的方法中设计数据存储架构。在目前,更合适的查询分离方案(目前是指本文中,下一篇文章具有更好的数据存储解决方案公众舆论体系)。
2.1每次更新数据时,该概念都会更新到数据库,并且数据也将保存到其他存储系统中(其他存储系统可以是)。当用户查询数据时,您可以直接从其他插座查询。此更新的数据库称为主存储,并且用于查询的数据库称为查询存储。基本体系结构图如下:
提示:查询分离与读取和写作分离之间存在区别。读取和写入分离数据库的类型是相同的,例如MySQL库。阅读和写作分离是通过复制数据库的方法来同步数据。通过允许主数据库负责添加,删除,删除和修改,以及从数据库中对非传输查询操作的查询,以提高数据库的并发加载能力。
2.2通常情况下,如果遇到以下问题,则可以使用查询分离:
查询分离的实施通常分为三个步骤:
让我们一一解释它们。
3.1如何触发常见的查询分离和触发方法:有三种类型:
下表列出了以下三种方式:|触发|合适的场景||---- |---- ||方法一|业务代码很简单,写作操作的响应速度不高||||||方法2 |业务代码相对复杂,写作操作响应速度的要求||方法3 |业务代码很复杂,代码更改很高|
根据上述三个触发器的简单解释以及场景的描述,我们可以看到我们的公众舆论系统适用于两者。
3.2如何在上一节中使用第二个触发方法来设计我们的数据存储架构。它可以简要描述为:一个单独的线程以更新查询存储。但是,必须在以下三种情况下考虑此方法实施时:
为了响应上述三种情况,我们可以使用MQ解决它,并且思考非常简单:将数据更新到主商店时,我们必须向MQ发送通知。MQ在收到通知以更新查询存储后开始线程。当然,使用MQ时,您还会遇到各种问题。最常见的问题是MQ被挂起。挂起MQ后,将发生以下两种情况:
在这两种情况下,我们可以将一个添加到主存储中,以添加需要更新查询存储字段的需求。每次将数据更新为主存储时,该字段都将设置为true。简单更新消息就足够了,无需将包含数据ID的消息发送到MQ。获取此消息后,查询存储更新更新服务首先查询Main中需要将需要更新到查询存储字段的存储数据为true,然后将这些数据分批更新为查询存储。更新完成后,将存储字段更改为false。我们还可以使用MQ实现峰值切割。当更新请求太多时,同步查询库的线程数量通过MQ控制。数据更新的查询存储失败的问题才能引入重试机制,并且只有在更新成功之后,我们才能修改值更新成功后的查询存储字段。当然,并非每个试用机制都可以成功更新数据,因此我们可以为审核时间设置阈值阈值。当数据审核的数量达到此阈值时,我们需要及时通知相关人员进行手动干预。
提示:此处提到的重试机制不仅与基于Polly的重试机制相似,而且还类似于其他后续线程在更新存储时更新失败数据的方法。
解决并发问题的解决方案可以转介到上一篇文章中。本节中剩下的最后一个问题,顺序发行。例如,Xiaoming首先将A数据更新为123,并且A数据在Xiaohong之后更新为321。Little Red的新数据。解决此问题也很简单。增加主内存存储中的最终更新时间字段。线程更新后,当前数据的最后更新时间字段的值与刚刚启动线程时相同,并且需要将其更新到查询存储以查询StorageThe字段是错误的。如果符合条件,则需要将其更新为“查询存储”字段为true,并且正在进行更新查询存储活动。
提示:MQ不仅在这里触发更新查询存储信号的角色,而且在服务解耦和控制更新查询存储并发症中发挥作用。
3.3存储的查询通常是使用Elasticsearch,MongoDB或Redis的常见存储解决方案。这三个方案在查询中很复杂。但是,特定存储方案的选择应基于开发小组的技术和项目条件。
提示:请注意,无论使用哪种存储解决方案,您都必须记住,异步更新查询存储方法的使用将存在查询旧数据的问题。这是因为来自查询存储的更新数据可能涉及可能涉及索引的索引。重建,主-Lave备份和碎片。解决此问题的方法是,在主存储的n秒内,如果在那里,则是查询相关数据的操作,然后我们可以提示用户:“数据可能是旧数据”。
本文主要讨论查询分离的知识以及如何设计数据存储架构。接下来,我将优化这种情况的解决方案。
原始:https://juejin.cn/post/7102788429812858911