对话首席架构师|阿里云迁云实战解析(二):零售上云全解析(下)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文整理自驻云科技首席架构师,阿里云MVP苏炎的分享。本文将与大家分享苏炎对云架构师在阿里云迁云实践案例中碰到和解决的一系列问题。

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

直播回顾,请点击这里。
回顾阿里云迁云实战解析(一):全面上云拐点已到,云架构师get 何种技能?,请点击这里。
回顾阿里云迁云实战解析(二):零售上云全解析(上),请点击这里。

优化方案:通过对该客户线下应用相关虚拟机配置与近期平均负载峰值进行统计,计算出集群总体的CPU和内存。另外在峰值的基础上预先配置了20%的容忍度,这在应用业务压力比较大的情况下可以自动帮助用户进行应用的扩容,同时也可以在某台主机发生故障的时候可以保证业务的稳定。这种方式不仅可以解决资源配置的问题,同时可以降低成本。

因为云资源是可弹性伸缩的,即使前期资源配置在正常情况下是满足,但是针对一些峰值情况如促销活动,通过合理规划、临时资源扩容可以快速满足用户的需求。而对于不使用容器化的用户,阿里云提供了专用宿主机的服务,通过CPU超分,轻松提升部署密度,类似于vSphere的超额预定,来帮助用户在资源规划的时候最大化降低成本。

screenshot

云上数据库设计:云上数据库如果全部按照1:1的模式来设计,成本会很高。因此该案例用户最终在云端只对主数据库创建了高可用的RDS实例,实现云数据库主备;另外实现了分库分表,一旦涉及到读写要求比较高或者并发要求较高的场景,可以通过只读实例,满足数据库读写分离需求,来提高应用的并发性能;对于HR系统、会员系统和报表系统,由于线下集群只有单台MySQL,上云之后采用的是单机基础版,虽然使用的是单机基础版,但是仍然可以使用DBS的数据库备份机制对数据进行秒级备份。下图是云上数据库的设计方案,具体是能否能够真正满足业务需求还需要看后面迁移完成后的压测结果,数据库包括架构设计也将会基于压测结果来做进一步的调整。

screenshot

数据库设计问题:上云过程中,即使前期进行了数据库设计,实施过程中还是可能会遇到一系列问题,如部分报表、数据库云上的执行速度比线下慢;同一执行的执行结果不一致;部分数据库的同步时间较长等等。

导致这些问题的原因主要有:
1) 出于成本考虑,使用单机基础版RDS,使得MySQL数据库版本需要从5.6升级到5.7,升级后导致最终的执行计划不一致,进一步导致数据库在一些特定的场景尤其是OLAP场景下执行变慢,需要通过参数调整和索引优化来解决;
2) 对于执行结果不一致问题,是因为单机基础版本RDS对于MySQL用的是SSD云盘,而SSD云盘本身的数据块是被打散的,数据读写到云盘上存在网络开销,由于网络抖动问题,读写到盘上的数据可能会存在不一致的情况;
3)针对第三个问题,一方面数据库同步主要是基于数据库分表机制,如果分库键的选择不合理,将会导致明显的数据倾斜,即一大部分数据集中在其中一个物理数据库实例上,这种情况下相对于其他数据库,该数据库的同步会比较慢。另一方面,目前在云上可以通过DTS对MySQL进行迁移,不同规格的DTS会对任务进行相应的限流,如果是因为这个原因所导致的数据迁移比较慢,则需要调整DTS的规格,比如从Medium调整到Large。

screenshot

应用改造
应用改造的关键在于对于云服务的适配性改造,这是建立在深度了解使用场景的基础上的,同时需要进行相应的代码改造。具体来讲,主要分为以下四方面:

• 分布式微服务框架:客户由于外包的原因同时使用了Spring Cloud和Dubbo,为了使基于Spring Cloud和Dubbo的服务可以同时被服务注册和服务发现,阿里云的EDAS是一个很好的选择,它可以兼容Spring Cloud和Dubbo;线上使用的EDAS公有云版后期出现了一些小问题,比如EDAS和阿里云容器服务之间的打通存在一定的限制,举个例子,作为容器化最核心的一个特点HPA,其前期设置一直无效,因为无法获得Pod的负载情况。最终发现导致该问题的原因是EDAS的某些部署方式,如灰度发布和批量发布,与HPA的设置是不兼容的,这种情况下需要重新部署Pod来解决该问题;另外如果使用阿里云的公有云服务,尤其需要注意Jar包冲突的问题。大家都知道,在导入共有云的时候,有些Jar包是相同的,以用于日志输出的Log4j的Jar包为例,公有云导入的是最新Log4j的Jar包,而原来的应用可能使用的是Log4j旧的Jar包,当通过Maven进行构建,导入公有云的时候可能旧的Jar包先被加载,这种情况下就会导致因为Jar包冲突而找不到某个方法的问题。因此在引入新的Maven Jar包依赖时,须进行必要的梳理,从而将一些可能会存在冲突的问题提前解决。

• 消息中间件:消息队列的修改相对来讲比较容易,由于线下原本使用的是私有输出的消息队列RocketMQ,到云上之后要做的主要是云服务适配性的改造,因为公有云有别于私有云,其上任何一个服务的使用都需要进行鉴权,即绑定云账号下的AK/SK;另外和线下不同,线上消息队列Topic数量可能会对成本产生很大的影响,因此除了生产阶段,开发和测试阶段可以通过通用Topic的使用来降低总体Topic的数量;还有一个问题是线下已经建好的Topic如何批量迁移到云上,为了保证正确性,具体实践中可以将建好的Topic导入Excel文件中,自研工具通过OpenAPI的调用将线下已有的Topic批量迁移的云上。
• OSS替换FastDFS:FastDFS本身并不存储原始的文件名,它上传的文件名是根据自定义的规则随机生成的。一般情况下,客户会将随机生成的文件名和文件名的随机路径相应地存储到一张表中,以记录该文件名对应的是FastDFS中的文件路径。这种情况下OSS替换FastDFS的具体实践是:首先将原有的文件批量迁移到同一bucket下;然后将bucket读写权限设置为Public,并设置Referer防盗链;另外新增的文件保存到单独设置的bucket下,并按月区分。目前OSS有OssImport工具来帮助用户实现文件的批量迁移。

• 容器化改造:容器化改造本身并不困难,因为它只是一个Dockerfile添加的过程,但是客户线下的应用存在一系列的问题,会阻碍容器化改造。首先是线下应用间依赖严重的问题,同一个Maven项目有很多依赖关系复杂的子项目,如果通过GitLab提交的方式、用GitLab CI触发编译的话,往往会失败,解决方法是用Jenkins替代GitLab CI;还有一个问题是Maven私有仓库很多jar包太旧,或者已经不存在,针对这个问题驻云科技对客户的jar包和私有仓库进行了梳理;另外该阶段也遇到了前面提到的Jar包冲突的问题,问题和解决方案在此就不再赘述。

screenshot

代码改造:上云的过程中涉及到代码改造,为此,驻云科技向客户提供了迁云改造代码分支管理的方式(如下图所示)。首先建立一个迁云改造代码分支,原来的代码分支正常使用,以保证客户应用的稳定,当迁云改造分支完成后,会合并到Develop分支,再从Develop分支拉出Release分支,通过Release分支的测试后发布云上应用版本。这种方式可以帮助客户提升迁云效率。

screenshot

全链路性能压测:全链路端到端的性能压测是整个迁云过程中非常重要的一环,它用于检验迁云改造后的应用是否真正满足业务的需要。因此,在迁云完成后,驻云科技对该客户的零售系统和报表系统进行了全链路性能压测,来查看相应业务场景主要业务流的运行情况(如并发量、响应时间和资源使用率),并将测试结果反馈给客户,由客户来判断当前的运行情况是否能满足其业务需求。针对该零售客户的系统压测,驻云科技选择了其中五个对并发要求比较高的场景,整个过程花费了大约两周时间,部分压测结果如下图所示。压测工具使用的是阿里云的PTS服务,同时结合了其云监控服务和驻云科技自有的监控平台。

screenshot

目录
相关文章
|
10天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
51 6
|
10天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
27 1
|
17天前
|
自然语言处理 编译器 Linux
|
10天前
|
Kubernetes Cloud Native 云计算
云原生技术深度解析:重塑企业IT架构的未来####
本文深入探讨了云原生技术的核心理念、关键技术组件及其对企业IT架构转型的深远影响。通过剖析Kubernetes、微服务、容器化等核心技术,本文揭示了云原生如何提升应用的灵活性、可扩展性和可维护性,助力企业在数字化转型中保持领先地位。 ####
|
11天前
|
运维 Kubernetes Cloud Native
Kubernetes云原生架构深度解析与实践指南####
本文深入探讨了Kubernetes作为领先的云原生应用编排平台,其设计理念、核心组件及高级特性。通过剖析Kubernetes的工作原理,结合具体案例分析,为读者呈现如何在实际项目中高效部署、管理和扩展容器化应用的策略与技巧。文章还涵盖了服务发现、负载均衡、配置管理、自动化伸缩等关键议题,旨在帮助开发者和运维人员掌握利用Kubernetes构建健壮、可伸缩的云原生生态系统的能力。 ####
|
15天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
19天前
|
UED
<大厂实战经验> Flutter&鸿蒙next 中使用 initState 和 mounted 处理异步请求的详细解析
在 Flutter 开发中,处理异步请求是常见需求。本文详细介绍了如何在 `initState` 中触发异步请求,并使用 `mounted` 属性确保在适当时机更新 UI。通过示例代码,展示了如何安全地进行异步操作和处理异常,避免在组件卸载后更新 UI 的问题。希望本文能帮助你更好地理解和应用 Flutter 中的异步处理。
61 3
|
19天前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
100 1
|
12天前
|
前端开发 中间件 PHP
PHP框架深度解析:Laravel的魔力与实战应用####
【10月更文挑战第31天】 本文作为一篇技术深度好文,旨在揭开PHP领域璀璨明星——Laravel框架的神秘面纱。不同于常规摘要的概括性介绍,本文将直接以一段引人入胜的技术剖析开场,随后通过具体代码示例和实战案例,逐步引导读者领略Laravel在简化开发流程、提升代码质量及促进团队协作方面的卓越能力。无论你是PHP初学者渴望深入了解现代开发范式,还是经验丰富的开发者寻求优化项目架构的灵感,本文都将为你提供宝贵的见解与实践指导。 ####
|
15天前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
32 0

推荐镜像

更多