阿里云数据库迁移方案:实时同步RDS与Redis构建缓存一致性
通过DTS数据订阅功能,用户可实时同步RDS日志变更到Redis,实现缓存更新和MySQL与Redis间的一致性。这种Cache-Aside Pattern模式通过DTS服务确保数据同步的高效性和稳定性,优化商品信息和账单信息的实时同步与查询性能,提升系统响应速度。<h2>一、方案优势</h2>
实时同步RDS与Redis构建缓存一致性方案的优势
<h3>数据实时同步</h3>
通过DTS订阅功能实时订阅Binlog数据,实现MySQL与Redis异构数据库之间的数据实时同步,保证数据的实时性和一致性。
<h3>同步链路稳定</h3>
数据传输服务DTS订阅功能,高服务化能力保证同步链路的易用性和稳定性,针对同步链路异常、链路延迟等事件及时告警、通知。
<h3>高效自定义结构转化</h3>
提供DTS订阅MySQL BINLOG日志数据变更事件获取,关系型结构和KV结构逻辑映射,以及缓存更新Redis的代码端到端的示例。
<h2>二、架构与部署</h2>
实时同步RDS与Redis构建缓存一致性。通过RDS MySQL+DTS+Redis的架构,实现RDS MySQL与Redis缓存之间的数据同步和一致性。通过实时同步MySQL数据库数据到Redis缓存,提高数据查询速度,降低数据库压力,确保业务数据的实时性和准确性。
<h3>方案概览</h3>
在许多业务场景中(比如商品信息查询、库存管理、账户余额查询、交易记录查询、用户信息查询等),为了提高数据查询速度和降低数据库压力,我们通常会使用Redis作为缓存层。然而,保持MySQL与Redis缓存之间的数据一致性是一个关键挑战。本方案将探讨基于Cache-Aside Pattern模式下的一种高效的MySQL与Redis缓存同步一致性方案,以确保业务数据的实时性和准确性,提高数据查询速度,降低数据库压力。
<h5>方案架构</h5>
方案提供的默认设置(如地域、VPC、安全组、vSwitch、实例名称等)完成部署后在阿里云上搭建的RDS MySQL实时数据同步到云数据库 Redis进行加速分析的架构图如下图所示。实际部署时您可以根据资源规划修改部分设置,但最终形成的运行环境与下图相似。
https://upload-images.jianshu.io/upload_images/19316870-39df8b32a63fb41d.png
本方案的技术架构包括以下基础设施和云服务:
[*]地域和可用区:云数据库 RDS MySQL 实例、云数据库 Redis 实例以及数据传输服务 DTS 实例必须在同一个地域中,但可以选择部署在不同的可用区。
[*]1个专有网络VPC:云数据库 RDS MySQL 实例、云数据库 Redis 实例以及数据传输服务 DTS 实例必须在同一个 VPC 网络环境中。
[*]1个云数据库RDS MySQL版实例:为线上订单/票务等服务提供数据持久化服务和事务一致性服务。
[*]1个云数据库Redis版实例:为线上订单/票务等服务提供缓存加速、库存查询以及秒杀限流等服务。
[*]1个数据传输服务DTS实例:用于订阅云数据库RDS MySQL中相关的数据库表对象的BINLOG日志数据。
[*]1台云服务器ECS实例:用于部署DTS订阅应用程序,用于接收数据传输服务DTS订阅云数据库RDS实例的更新事件,并且通过应用程序对云数据库Redis进行更新。
<h3>部署准备</h3>
开始部署前,请按以下指引完成账号申请、账号充值、RAM用户创建和授权。
<h5>准备账号</h5>
1.如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。
2.为阿里云账号充值。
[*]为节省成本,本方案默认选择使用按量付费资源,使用按量付费资源需要确保账户余额不小于100元。
[*]完成本方案的部署及体验,预计产生费用不超过20元(假设您选择下表中的相关规格资源,且运行时间不超过2小时,如果调整了资源规格,请以控制台显示的实际报价以及最终账单为准)。
<table>
<thead>
<tr>
<th>云服务</th>
<th>规格配置</th>
<th>地域</th>
<th>预估费用参考</th>
</tr>
</thead>
<tbody>
<tr>
<td>云服务器 ECS</td>
<td>规格:ecs.g5.xlarge,4 vCPU 16 GB</td>
<td>华东2(上海)</td>
<td>配置费用:1.854 元/小时</td>
</tr>
<tr>
<td></td>
<td>存储空间:40 GB(ESSD PL1云盘)</td>
<td></td>
<td>公网流量费用:0.800 元/GB</td>
</tr>
<tr>
<td></td>
<td>带宽:100 Mbps(按使用流量)</td>
<td></td>
<td></td>
</tr>
<tr>
<td>云数据库 RDS MySQL 版</td>
<td>规格:mysql.x4.medium.2c</td>
<td>华东2(上海)</td>
<td>1.8 元/小时</td>
</tr>
<tr>
<td></td>
<td>存储空间:100 GB</td>
<td></td>
<td></td>
</tr>
<tr>
<td>云数据库 Redis</td>
<td>规格:标准版 高可用 16GB主从版</td>
<td>华东2(上海)</td>
<td>3.00 元/小时</td>
</tr>
<tr>
<td>数据传输服务 DTS</td>
<td>数据订阅</td>
<td>华东2(上海)</td>
<td>3.00 元/小时</td>
</tr>
</tbody>
</table>
3.阿里云账号拥有操作资源的最高权限,从云资源安全角度考虑,建议您创建一个RAM用户,使RAM用户仅能操作有限的资源,然后由RAM用户完成本方案。
[*]访问资源组页面,单击创建资源组,创建一个资源组,例如命名为Rds2Redis。
[*]访问RAM控制台-用户页面,单击创建用户,勾选控制台访问和OpenAPI 调用访问,填写其他信息,创建一个RAM用户。
[*]访问RAM控制台-权限策略页面,单击创建权限策略,单击脚本编辑,并复制粘贴以下内容,完成创建自定义权限策略。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:Describe",
"vpc:Describe",
"ros:",
"dts:"
],
"Resource": "*"
}
]
}
[*]访问RAM控制台-用户页面,授予权限。
单击目标RAM用户操作列的添加权限,选择授权范围为指定资源组(例如Rds2Redis),然后选择系统策略AliyunECSFullAccess、AliyunRDSFullAccess、AliyunKvstoreFullAccess和AliyunVPCFullAccess,单击确定。
再次单击目标RAM用户操作列的添加权限,选择授权范围为整个云账号,然后选择前面创建的自定义权限策略,单击确定。
4.(可选,仅首次使用DTS服务时需要创建)创建AliyunDTSDefaultRole角色,用于DTS服务访问当前云账号下的RDS、ECS等云资源。
[*]访问RAM访问控制台-角色页面,单击创建角色,角色类型选择阿里云账号,角色名称配置为AliyunDTSDefaultRole,单击完成。
[*]找到已创建的AliyunDTSDefaultRole角色,单击操作列的精准授权。选择权限类型为系统策略,输入策略名称为AliyunDTSRolePolicy,单击确定。
[*]单击已创建的AliyunDTSDefaultRole角色名,切换至信任策略管理页签,单击修改信任策略,将信任策略修改为如下内容后,单击确定。
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"dts.aliyuncs.com"
]
}
}
],
"Version": "1"
}
<h3>一键部署</h3>
资源编排(ROS)可以让您通过YAML或JSON文件清晰简洁地描述所需的云资源及其依赖关系,然后自动化地创建和配置这些资源。您可以通过下方提供的ROS一键部署链接,来自动化地完成这些资源的创建和配置。
本文介绍的ROS模板主要完成了以下内容:
[*]部署1个专有网络VPC。
[*]部署1台交换机。
[*]部署1台云服务器 ECS。
[*]部署1个云数据库RDS MySQL。
[*]部署1个云数据库Redis。
[*]配置1个数据传输服务DTS订阅任务。
[*]已在ECS中部署DTS订阅程序。
1.打开一键配置模板链接前往ROS控制台,系统自动打开使用新资源创建资源栈的面板。
2.确认好地域后(本教程以华东2(上海)地域为例),在配置参数模板步骤中配置资源栈名称、ECS和Database。
https://upload-images.jianshu.io/upload_images/19316870-7cf408d9037000c2.png
3.单击下一步,跳转至资源预览页,单击创建,系统将自动创建并部署本教程所需的资源。
4.当资源栈信息页面的状态显示为创建成功时表示一键配置完成。
https://upload-images.jianshu.io/upload_images/19316870-f79daf9172ffdc14.png
5.单击资源页签,找到已创建的RDS实例,单击实例ID,进入RDS实例详情页,获取RDS的公网连接地址。
6.登录RDS实例,向源端 RDS MySQL 上写入、更新、删除相关数据,以模拟RDS MySQL上面的数据变更。
<h3>数据同步结果验证</h3>
<h5>更新RDSMySQL数据</h5>
上一步中您已经在数据传输服务DTS管理控制台上配置了DTS延迟告警、检查了DTS同步延迟等情况,接下来可以向源端 RDS MySQL 上写入、更新、删除相关数据,以模拟RDS MySQL上面的数据变更,比如可以模拟TPCC压测程序等或者以业务系统真实的更新数据,以观察DTS订阅情况等。
通过DTS运行程序的标准输出日志情况,可以观察到DTS订阅任务在订阅源端数据变更的情况,如图所示:
https://upload-images.jianshu.io/upload_images/19316870-d0daef28aab880f0.png
<h5>检查Redis最新数据</h5>
上一步中您已经部署好了数据传输服务DTS数据订阅程序,并且对源端RDS MySQL有数据更新行为发生,即RDS MySQL实例中已经有BINLOG日志的更新,通过上述步骤可以观察到DTS订阅程序可以订阅到BINLOG的最新事件,接下来检查Redis实例中是否已经有最新的数据写入和更新。
通过Redis客户端等工具连接到Redis,检查Redis实例中最新的数据,并且针对其中的key进行验证,如图所示:
https://upload-images.jianshu.io/upload_images/19316870-21b900f50b880d05.png
同时,也可以通过如MySQL客户端等工具连接到RDS MySQL实例,检查RDS MySQL实例中对应的最新数据,如图所示:
https://upload-images.jianshu.io/upload_images/19316870-caf10ff8f4a67a24.png
<h5>检查DTS订阅延迟</h5>
上一步中您已经部署好了数据传输服务DTS数据订阅程序,并且对源端RDS MySQL有数据更新行为发生,接下来您需要对DTS订阅和数据同步的效果进行验证。针对生产环境,建议您在数据传输服务DTS控制台配置好对DTS订阅程序的监控报警等。
1.登录数据传输服务DTS管理控制台。
2.在顶部菜单栏,选择被授权的资源组(本文以Rds2Redis为例)和地域(本文以华东2(上海)地域为例)。
3.在左侧导航栏,选择数据订阅。
4.在订阅任务页面,定位到上述步骤中创建的订阅任务,在操作列上点击任务详情。
5.进入任务详情页面后,在左侧导航栏选择数据消费,点击任务管理。
6.查看增量数据采集等页面,检查DTS订阅延迟情况等,如图所示:
https://upload-images.jianshu.io/upload_images/19316870-09dedce39776752f.png
<h3>完成及清理</h3>
<h5>方案验证</h5>
完成了数据同步结果验证等步骤后,您可以通过配置和观察DTS监控报警、性能监控等来观察数据同步的可用性、延迟等,通过观察RDS MySQL实例和Redis实例中相关的记录来验证同步的正确性和一致性(注意考虑延迟带来的不一致情况)。
<h5>清理资源</h5>
在本方案中,您创建了1个专有网络VPC、1台交换机、1个云数据库 RDS MySQL 实例、1个云数据库 Redis 实例、1个数据传输服务DTS实例以及1个云服务器ECS实例。测试完方案后,您可以在ROS控制台找到目标资源栈,然后直接删除资源栈即可(删除时,删除方式选择为释放资源)。
<h2>三、应用场景</h2>
<h3>商品信息实时同步</h3>
面向电商行业等,通过实时同步RDS库中的商品信息数据到Redis缓存,提高商品信息查询速度,提升用户购物体验。
<h3>社交信息快速传播</h3>
在社交媒体领域,通过实时同步在线库中用户信息数据到Redis缓存,提高用户信息查询速度,提升用户体验。
<h3>账单信息高效查询</h3>
在金融等场景,通过实时同步存储在关系型数据库中的账户余额数据到Redis缓存,提高账户余额查询速度,提升用户体验。
官网相关地址直达:
1.更多阿里云方案查询:https://www.aliyun.com
2.阿里云服务器ECS相关活动:https://www.aliyun.com/daily-act/ecs/activity_selection
3.云小站(代金券发布平台):https://www.aliyun.com/minisite/goods
https://upload-images.jianshu.io/upload_images/19316870-5f1747d3cd17a545.png
<div class="image-caption">云小站代金券图.png
页:
[1]