数据架构:数据冷热分离实践思考

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 本篇分析了几个冷热分离的实现案例,并整理了一些问题和解决方案。通过mysql 和 Es的两种冷热分离实现,阐述了不同存储方案上冷热分离实现上的共同点和差别。回归本源,设计最终还是依赖于具体业务需求。后续还需要在实践中,通过足够的业务场景和数据量级支撑,来继续验证方案的可行性和潜在问题,不断进行完善升级。

系列文章:

数据架构:概念与冷热分离

一 概述

   上一篇文章数据架构:概念与冷热分离中介绍了数据架构的概念和意义。并抛出了数据冷热分离的问题。事实上,这并不是新的概念,各公司在很早之前就已经开始了落地实践。微软云有冷热blob存储,阿里云有ots,都是为了在云服务层面提供冷热存储的解决方案。尽管有这些工具,如果很好地实现冷热分离,仍然是值得仔细思考和玩味的。

二 冷热分离核心问题与案例

2.1 关键问题

   回归话题,无论我们怎样选择冷热存储方案,首先,都还是需要一种存储介质。哪怕是云上的存储方案。冷热分离的具体实现,也会与存储介质的选择直接相关。举个栗子,数据从热存储到冷存储的迁移,最简单的来看,需要实现2个步骤:1、数据写入冷存储;2、热存储数据删除;而删除动作就与数据库的选择有很大关系。

2.1.1 大数据删除

   大量的数据插入和数据删除,尤其是在有索引的大表上,这样的操作会很大程度地影响数据库读写性能;而且删除后,未必会立即释放旧数据所占的空间,在某些db下,甚至可能需要做一次数据整理才能真正释放。这会导致一个很严重的问题,如果不做整理操作,那么相当于这些旧数据物理上还占据着空间,最终必然也会导致磁盘空间不足。

2.1.2 查询包含热数据也有冷数据

   这点可以理解为中间层路由的实现。什么时候查询热数据,什么时候查询冷数据,需要有一个规则层来控制。理想的情况,冷热数据都是分别查询,而且冷数据查询的频率(在整体查询中的比例)低一个或多个数量级,这样的分离说明是比较合理的。

2.2 几个案例

   接下来,我们通过可以搜索到的几个文章中的案例,来了解不同存储方案下的冷热分离实现,并试图分析其中合理和不合理的地方。

2.2.1 mysql

2.2.1.1 案例概述

[数据库]-----记一次mysql分库的操作(冷热分离)

   案例中是采用数据分库的方式实现。也就是说,建立了生产库 和 历史库两个数据库,生产库存放热数据,历史库放冷数据。文中描述的架构如下图所示:

2.2.1.2 数据迁移

   通常,迁移我们会采用定时任务的方式实现。也就是说,对于冷热数据的分割,会倾向于使用“天”的粒度。当然,根据实际的业务需求也可以进一步细分。

   为了不影响常规业务,就需要在业务低谷时期执行这些非核心业务动作,所以会在每天凌晨执行迁移动作,在新的业务请求高峰到来之前完成迁移,降低影响。在任务的具体实现上,还需要特别注意,某些任务可能会依赖数据迁移的完成,这样就意味着存在任务之间的依赖关系,以及失败重试等等。并且为了确保数据的完整性和一致性,最好对迁移数据进行一致性校验,避免数据丢失和错误数据的产生。

2.2.1.3 多数据源的查询

   这里的多数据源,就是指既有热数据,也有冷数据的查询。当然前面我们有过描述,理想情况下不应该有这样的情况存在,但在真实业务中很可能是不可避免的。这就要求:1)系统提供跨热、冷数据库的查询支持;2)冷数据查询性能明显低于热数据库的情况下,尽可能减小查询耗时。如果可能,最好能实现降低长尾耗时查询的比例。为了达到这个效果,就需要结合缓存策略或在功能上限制查询模式和查询范围,并在具体业务中做好引导和取舍。

2.2.2 Elasticsearch

Elasticsearch冷热分离原理和实践

2.2.2.1 节点异构

   与mysql的冷热部署类似,这里的es也采用双集群模式,但强调出了节点异构。(其实这是必要环节和前提,简单来说,热库侧重实时业务读写能力,要求保障性能,空间足以存储热数据即可;而冷库则需要保障数据存储量级和一致,能够接受牺牲一定程度的读写性能,因为要存储大量历史数据,所以相比热裤,空间需要大很多。)

   “部分是高性能的节点用于存储热点数据,部分是性能相对差些的大容量节点用于存储冷数据,却可以一方面保证热数据的性能,另一方面保证冷数据的存储,降低存储成本,这也是Elasticsearch冷热分离架构的基本思想”。

2.2.2.2 节点指定冷热属性

   在elasticsearch.yml文件中增加配置的方式,为节点打上标签。

node.attr.{attribute}: {value}

其中attribute为用户自定义的任意标签名,value为该节点对应的该标签的值,例如对于冷热分离,可以使用如下设置

node.attr.temperature: hot //热节点
node.attr.temperature: warm //冷节点

2.2.2.3 冷热索引设置

    冷热数据做了分离,前面也提到二者适用于不同场景,那么在数据的索引上,也可以针对使用场景进行曲分设计,不必保持一致。

   注意冷热数据与数据库主从的区别,冷热数据库会要求表/集合的结构一致,但索引可以有所区别。

2.2.2.4 索引生命周期

   Elasticsearch从6.6版本开始提供索引生命周期管理功能,索引生命周期管理可以通过API或者kibana界面配置。这一特性使得我们可以使用索引生命周期管理结合冷热分离架构实现索引数据的动态管理。

这里引述Elasticsearch冷热分离原理和实践中的描述:

索引的生命周期被分为:Hot phrase,Warm phase, Cold phase,Delete phrase四个阶段

  • Hot phrase: 该阶段可以根据索引的文档数,大小,时长决定是否调用rollover API来滚动索引,详情可以参考[indices-rollover-index],因与本文关系不大不再详细赘述。
  • Warm phrase: 当一个索引在Hot phrase被roll over后便会进入Warm phrase,进入该阶段的索引会被设置为read-only, 用户可以为这个索引设置要使用的attribute, 如对于冷热分离策略,这里可以选择temperature: warm属性。另外还可以对索引进行forceMerge, shrink等操作,这两个操作具体可以参考官方文档。

  • Cold phrase: 可以设置当索引rollover一段时间后进入cold阶段,这个阶段也可以设置一个属性。从冷热分离架构可以看出冷热属性是具备扩展性的,不仅可以指定hot, warm, 也可以扩展增加hot, warm, cold, freeze等多个冷热属性。如果想使用三层的冷热分离的话这里可以指定为temperature: cold, 此处还支持对索引的freeze操作,详情参考官方文档。
  • Delete phrase: 可以设置索引rollover一段时间后进入delete阶段,进入该阶段的索引会自动被删除。

总结

   本篇分析了几个冷热分离的实现案例,并整理了一些问题和解决方案。通过mysql 和 Es的两种冷热分离实现,阐述了不同存储方案上冷热分离实现上的共同点和差别。回归本源,设计最终还是依赖于具体业务需求。后续还需要在实践中,通过足够的业务场景和数据量级支撑,来继续验证方案的可行性和潜在问题,不断进行完善升级。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
15天前
|
运维 负载均衡 监控
深入探索微服务架构的核心要素与实践策略
在当今软件开发领域,微服务架构已成为构建灵活、可扩展企业级应用的首选模式。本文旨在剖析微服务架构的设计理念,通过实例阐述其核心组件如服务注册与发现、配置管理、熔断机制等如何协同工作,以提升系统的敏捷性和维护性。同时,探讨了在实践中应对分布式系统复杂性的最佳策略,包括负载均衡、服务监控和日志聚合等关键技术,旨在为后端开发者提供一套完整的微服务实施指南。
32 1
|
21天前
|
机器学习/深度学习 人工智能 自然语言处理
赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
【9月更文挑战第4天】赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
|
3天前
|
Cloud Native 持续交付 微服务
云原生时代的微服务架构实践
【9月更文挑战第30天】随着云计算技术的不断进步,云原生已经成为现代软件开发的重要趋势。本文将通过深入浅出的方式,介绍如何在云原生环境下设计并实施微服务架构,以及如何利用容器化技术和自动化工具来提升服务的可维护性和可扩展性。我们将一起探讨微服务架构的核心原则、优势,以及在云平台中部署和管理微服务的最佳实践。无论你是初学者还是有经验的开发者,这篇文章都将成为你探索云原生和微服务世界的一盏明灯。
|
6天前
|
监控 Cloud Native 持续交付
云原生时代的微服务架构设计原则与实践
【9月更文挑战第27天】本文深入探讨了在云原生环境下,如何高效地实施微服务架构。通过分析微服务的基本概念、设计原则和关键技术,结合实际案例,指导读者理解并应用微服务架构于云计算项目之中。文章旨在为软件开发者和架构师提供一条清晰的路径,以实现更加灵活、可扩展且易于维护的系统。
|
9天前
|
设计模式 Cloud Native API
云原生时代的微服务架构实践
【9月更文挑战第23天】在这篇文章中,我们将深入探讨云原生环境下的微服务架构设计原则、优势以及实施策略。文章不仅涉及理论概念,还结合具体的代码示例,帮助读者理解如何在实际项目中应用微服务架构。通过阅读本文,你将获得构建、部署和管理微服务的实用知识,为你的云原生项目奠定坚实的基础。
|
7天前
|
存储 运维 负载均衡
后端开发中的微服务架构实践与思考
本文旨在探讨后端开发中微服务架构的应用及其带来的优势与挑战。通过分析实际案例,揭示如何有效地实施微服务架构以提高系统的可维护性和扩展性。同时,文章也讨论了在采用微服务过程中需要注意的问题和解决方案。
|
13天前
|
缓存 NoSQL 数据库
构建高效后端服务:从架构设计到性能优化的实践之路
本文旨在探讨如何通过合理的架构设计和性能优化策略,构建一个既稳定又高效的后端服务。文章首先概述了后端服务开发中常见的挑战和误区,随后详细介绍了微服务架构、缓存机制、数据库优化、服务器配置以及代码审查等关键技术和方法。通过深入浅出的案例分析和实用建议,本文将为后端开发者提供一套系统化的指导方案,助力其打造出高性能的后端服务体系。
|
7天前
|
运维 持续交付 API
深入理解并实践微服务架构:从理论到实战
深入理解并实践微服务架构:从理论到实战
28 3
|
10天前
|
人工智能 Cloud Native Java
新趋势、新开源、新实践|云栖大会 AI 原生应用架构专场邀您参会
新趋势、新开源、新实践|云栖大会 AI 原生应用架构专场邀您参会
|
11天前
|
消息中间件 缓存 NoSQL
构建高效后端服务:微服务架构的深度实践
本文旨在探讨如何通过采用微服务架构来构建高效的后端服务。我们将深入分析微服务的基本概念、设计原则以及在实际项目中的应用案例,揭示其在提升系统可维护性、扩展性和灵活性方面的优势。同时,本文还将讨论在实施微服务过程中可能遇到的挑战,如服务治理、分布式事务和数据一致性等问题,并分享相应的解决策略和最佳实践。通过阅读本文,读者将能够理解微服务架构的核心价值,并具备将其应用于实际项目的能力。 ##
下一篇
无影云桌面