实时同步RDS与Redis构建缓存一致性

更新时间: 2023-11-22 17:03:43

手动部署

110

https://www.aliyun.com/solution/tech-solution/rtsorarctebcc

方案概览

在许多业务场景中(比如商品信息查询、库存管理、账户余额查询、交易记录查询、用户信息查询等),为了提高数据查询速度和降低数据库压力,我们通常会使用Redis作为缓存层。然而,保持MySQL与Redis缓存之间的数据一致性是一个关键挑战。本方案将探讨基于Cache-Aside Pattern模式下的一种高效的MySQL与Redis缓存同步一致性方案,以确保业务数据的实时性和准确性,提高数据查询速度,降低数据库压力。

说明

Cache-Aside Pattern的优点是可以有效减轻数据库的压力,提高应用程序的性能和可扩展性。缺点是若缓存中的数据失效或未更新,可能导致应用程序读取到旧数据。此外,Cache-Aside Pattern不适用于数据更新频繁的应用程序,因为缓存不断失效和更新会导致缓存中的数据不稳定。

方案架构

方案提供的默认设置(如地域、VPC、安全组、vSwitch、实例名称等)完成部署后在阿里云上搭建的RDS MySQL实时数据同步到云数据库 Redis进行加速分析的架构图如下图所示。实际部署时您可以根据资源规划修改部分设置,但最终形成的运行环境与下图相似。

42ee575d2247542d249498e4acdd3bb6.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进行更新。

部署准备

10

开始部署前,请按以下指引完成账号申请、账号充值、RAM用户创建和授权。

准备账号

  1. 如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。

  2. 为阿里云账号充值

    1. 为节省成本,本方案默认选择使用按量付费资源,使用按量付费资源需要确保账户余额不小于100元。

    2. 完成本方案的部署及体验,预计产生费用不超过20元(假设您选择下表中的相关规格资源,且运行时间不超过2小时,如果调整了资源规格,请以控制台显示的实际报价以及最终账单为准)。

      云服务

      规格配置

      地域

      预估费用参考

      云服务器 ECS

      规格:ecs.g5.xlarge,4 vCPU 16 GB

      存储空间:40 GB(ESSD PL1云盘)

      带宽:100 Mbps(按使用流量)

      华东2(上海)

      配置费用:1.854 元/小时

      公网流量费用:0.800 元/GB

      云数据库 RDS MySQL 版

      规格:mysql.x4.medium.2c

      存储空间:100 GB

      华东2(上海)

      1.8 元/小时

      云数据库 Redis

      规格:标准版 高可用 16GB主从版

      华东2(上海)

      3.00 元/小时

      数据传输服务 DTS

      数据订阅

      华东2(上海)

      3.00 元/小时

      按量费用:9.654 元/小时

      公网流量费用:0.800 元/GB

  3. 阿里云账号拥有操作资源的最高权限,从云资源安全角度考虑,建议您创建一个RAM用户,使RAM用户仅能操作有限的资源,然后由RAM用户完成本方案。

    1. 访问资源组页面,单击创建资源组,创建一个资源组,例如命名为Rds2Redis

    2. 访问RAM控制台-用户页面,单击创建用户,勾选控制台访问OpenAPI 调用访问,填写其他信息,创建一个RAM用户。

    3. 访问RAM控制台-权限策略页面,单击创建权限策略,单击脚本编辑,并复制粘贴以下内容,完成创建自定义权限策略。

      自定义权限策略

        {
          "Version": "1",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "ecs:Describe*",
                "vpc:Describe*",
                "ros:*",
                "dts:*"
              ],
              "Resource": "*"
            }
          ]
        }
    4. 访问RAM控制台-用户页面,授予权限。

      1. 单击目标RAM用户操作列的添加权限,选择授权范围指定资源组(例如Rds2Redis),然后选择系统策略AliyunECSFullAccess、AliyunRDSFullAccess、AliyunKvstoreFullAccess和AliyunVPCFullAccess,单击确定

      2. 再次单击目标RAM用户操作列的添加权限,选择授权范围整个云账号,然后选择前面创建的自定义权限策略,单击确定

  4. (可选,仅首次使用DTS服务时需要创建)创建AliyunDTSDefaultRole角色,用于DTS服务访问当前云账号下的RDS、ECS等云资源。

    1. 访问RAM访问控制台-角色页面,单击创建角色角色类型选择阿里云账号角色名称配置为AliyunDTSDefaultRole,单击完成

    2. 找到已创建的AliyunDTSDefaultRole角色,单击操作列的精准授权选择权限类型系统策略输入策略名称AliyunDTSRolePolicy,单击确定

    3. 单击已创建的AliyunDTSDefaultRole角色名,切换至信任策略管理页签,单击修改信任策略,将信任策略修改为如下内容后,单击确定

      AliyunDTSDefaultRole角色信任策略

      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "Service": [
                "dts.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
      }
    说明

    详细步骤参考:

规划网络和资源

10

网络规划

请参考表格中的说明和方案默认示例值为每个规划项做详细规划并在实际部署时将默认示例值修改为您的实际规划。

规划项

说明

方案默认示例

地域

地域

您的云服务部署的地域。选择地域的基本原则请参见地域和可用区

华东2(上海)

专有网络 VPC

VPC名称

建议您再部署过程中新建一个VPC作为本方案的专有网络。部署过程中填写VPC名称即可创建对应名称的VPC。

长度为2~128个字符,以英文大小字母或中文开头,可包含数字、下划线(_)和连字符(-)。

vpc_mysql2redis

网段

在创建VPC时,您必须按照无类域间路由块(CIDR block)的格式为您的专有网络划分私网网段。阿里云VPC支持的网段信息请参见专有网络组成部分

在网络规划时可以按照管理网段-开发网段-测试网段-生产网段等规则做好规划。网段一旦投入使用,调整过程复杂,因此规划十分重要。

192.168.0.0/16

虚拟交换机

台数

本方案需要至少1台交换机,用来连接不同的云资源实例。

1

vswitch 名称

建议您在部署过程中在新建的VPC内创建虚拟交换机。部署过程中填写vswitch名称即可创建对应名称的虚拟交换机。

长度为2~128个字符,以英文大小字母或中文开头,可包含数字、下划线(_)和连字符(-)。

vswitch_mysql2redis

可用区

在规划的地域内选择2个可用区,2台虚拟交换机分别部署在2个可用区。

建议选择排序靠后的,一般此类可用区较新。新可用区资源更充沛,新规格也会在新的可用区优先上线。

可用区 G

IPv4网段

每台虚拟交换机需要一个IPv4网段

192.168.0.0/24

规划云资源

请参考表格中的说明和方案默认示例值为每个规划项做详细规划并在实际部署时将默认示例值修改为您的实际规划。

规划项

数量

说明

云服务器 ECS

1

本方案需要1台ECS实例,用于部署DTS订阅任务的应用程序,用于读取DTS订阅事件并且更新Redis

云数据库 RDS MySQL 版

1

本方案需要1个RDS MySQL实例,用于持久化存储线上订单/票务库存信息等

云数据库 Redis 版

1

本方案需要1个Redis实例,用于存储线上订单/票务服务中订单和票务数据

数据传输服务 DTS

1

本方案需要开通1个DTS数据订阅任务,用于订阅RDS MySQL的表数据变更

部署资源

30

规划好云数据库 RDS MySQL 、云数据库 Redis 以及数据传输服务 DTS 的资源后,请按照以下步骤部署方案中的所有资源。

1. 创建专有网络VPC和交换机

本方案中涉及到云数据库RDS MySQL、云数据库 Redis 以及数据传输服务 DTS和弹性计算ECS等资源,故在规划专有网络VPC和交换机时,为了保证网络连通性和延迟尽量足够小,需要部署在同一个专有网络VPC内,并且最好部署在同一个可用区。

  1. 登录专有网络管理控制台

  2. 在顶部菜单栏,选择被授权的资源组(本文以Rds2Redis为例)和地域(本文以华东2(上海)地域为例)。

  3. 在左侧导航栏,单击专有网络

  4. 专有网络页面,单击创建专有网络

  5. 创建专有网络页面,配置1个专有网络和1台交换机。配置交换机时,请确保交换机所属的可用区的ECS、RDS、Redis等资源是可用状态。

    项目

    说明

    示例值

    VPC名称

    建议您在部署过程中新建一个VPC作为本方案的专有网络。部署过程中填写VPC名称即可创建对应名称的VPC。

    长度为2~128个字符,以英文大小字母或中文开头,可包含数字、下划线(_)和连字符(-)。

    vpc_mysql2redis

    IPv4网段

    在创建VPC时,您必须按照无类域间路由块(CIDR block)的格式为您的专有网络划分私网网段。阿里云VPC支持的网段信息请参见专有网络组成部分

    在网络规划时可以按照管理网段-开发网段-测试网段-生产网段等规则做好规划。网段一旦投入使用,调整过程复杂,因此规划十分重要。

    192.168.0.0/16

    资源组

    选择被授权的资源组。

    Vswitch名称

    建议您在部署过程中在新建的VPC内创建虚拟交换机。部署过程中填写交换机名称即可创建对应名称的虚拟交换机。

    长度为2~128个字符,以英文大小字母或中文开头,可包含数字、下划线(_)和连字符(-)。

    vsw_mysql2redis

    可用区

    在规划的地域内选择2个可用区,2台虚拟交换机分别部署在2个可用区。

    建议选择排序靠后的,一般此类可用区较新。新可用区资源更充沛,新规格也会在新的可用区优先上线。

    可用区 G

2. 创建云服务器ECS

您已经创建1个专有网络VPC和交换机。接下来您需要创建1个云服务器ECS实例,来配置和运行DTS订阅程序。

  1. 登录ECS管理控制台

  2. 在左侧导航栏,选择实例与镜像 > 实例

  3. 在顶部菜单栏,选择被授权的资源组(本文以Rds2Redis为例)和地域(本文以华东2(上海)地域为例)。

  4. 实例页面,单击创建实例

  5. 在云服务器ECS购买页面,创建1台云服务器ECS。

    项目

    说明

    示例值

    付费类型

    ECS实例的计费方式。

    ECS计费的详细信息请参见ECS计费方式概述。本文以按量付费为例。

    按量付费

    网络及可用区

    选择之前规划的专有网络VPC及交换机。

    实例和镜像

    实例

    ECS的实例规格及内核、vCPU数量。关于ECS选型的最佳实践请参见选型最佳实践

    ecs.g5.xlarge(4 vCPU 16 GiB)

    镜像

    ECS的“装机盘”,为ECS实例提供操作系统、预装软件等。

    CentOS

    镜像版本

    镜像的版本。

    CentOS 7.6 64位

    存储

    系统盘类型

    硬盘类型。

    ESSD云盘

    系统盘容量

    硬盘容量。

    40 GiB

    系统盘性能

    选择硬盘IOPS性能。

    PL1(单盘IOPS性能上限5万)

    带宽和安全组

    公网 IP

    选择是否分配公网 IPv4 地址。

    分配公网 IPv4 地址

    带宽计费模式

    带宽计费方式,用于计算流量成本。

    按使用流量

    带宽峰值

    本方案以100 Mbps为例。

    100 Mbps

    安全组

    新建安全组。

    开通IPv4端口:SSH (22)

    管理设置

    登录凭证

    本方案已自定义密码凭证为例。

    自定义密码

    登录名

    固定为root

    root

    登录密码

    设置登录ECS服务器的密码。

    password***

    确认密码

    高级选项

    实例名称

    配置云服务器ECS实例名称。

    ecs_mysql2redis

    资源组

    选择被授权的资源组。

3. 创建云数据库RDS MySQL版

您已经创建1台云服务器ECS。接下来您需要创建云数据库RDS MySQL版实例、数据库、数据库账号。您需要记录创建的云数据库RDS MySQL版的内网连接地址、数据库名称、账号、密码用于之后的数据传输服务DTS数据订阅的相关配置。

  1. 登录云数据库RDS MySQL控制台

  2. 创建云数据库RDS MySQL版实例:

    1. 概览页面,单击创建实例

    2. 在购买页面,购买1个云数据库RDS MySQL版实例:

    3. 项目

      说明

      示例值

      计费方案

      本方案以按量付费为例。

      按量付费

      地域

      本方案以华东2(上海)地域为例。

      华东2(上海)

      类型

      本方案以MySQL 8.0为例。

      MySQL 8.0

      产品系列

      为保证实例的高可用性,本方案选择高可用版本。选择高可用版本或者集群版本等,请参见如何选择系列

      高可用版

      架构

      云数据库RDS MySQL版实例的CPU架构支持ARM和X86架构,选择架构请参见如何选择架构

      X86

      存储类型

      云数据库RDS MySQL版实例支持多种不同的存储类型,选择存储类型请参见如何选择存储类型

      ESSD PL1云盘

      主节点可用区

      选择RDS MySQL实例部署主节点所在的可用区。

      上海 可用区G

      部署方案

      选择RDS MySQL实例部署方案,可以选择多可用区部署或者单可用区部署。

      单可用区部署

      实例规格

      选择RDS MySQL实例的规格,RDS MySQL支持各种不同的规格,请参见如何选择实例规格

      分类:独享规格

      规格代码:mysql.x4.medium.2c

      存储空间

      选择RDS MySQL实例的存储空间,请参见存储空间与自动扩展

      100GB

      VPC

      选择之前规划的专有网络VPC及交换机。

      主节点交换机

      加入白名单

      将VPC网段加入到RDS实例白名单中,使得同一VPC下的ECS实例可以访问RDS实例。

      资源组

      选择被授权的资源组。

      Rds2Redis

    4. 在页面右下角,单击下一步:确认订单,勾选服务协议后,完成支付。

  3. 创建数据库账号:

    1. RDS管理控制台左侧导航栏,选择实例列表

    2. 在顶部菜单栏,选择被授权的资源组(本文以Rds2Redis为例)和地域(本文以华东2(上海)地域为例)。

    3. 实例列表页面,单击创建的实例。

    4. 在左侧导航栏,选择账号管理

    5. 用户账号页签,单击创建账号

    6. 创建账号面板,设置数据库账号名称,选择账号类型为高权限账号,设置密码,然后单击确定

  4. 创建数据库:

    1. 在左侧导航栏,选择数据库管理

    2. 单击创建数据库

    3. 创建数据库面板,设置数据库名称,设置字符集为utf8mb4,然后单击创建

4. 创建云数据库Redis版

接下来您需要创建1个云数据库Redis版实例,数据库、数据库账号。您需要记录创建的云数据库Redis版的内网连接地址、数据库名称、账号、密码用于之后的数据传输服务DTS数据订阅的相关配置。

  1. 登录云数据库Redis控制台

  2. 创建云数据库Redis实例:

    1. 点击左侧导航栏实例列表

    2. 在顶部菜单栏,选择被授权的资源组(本文以Rds2Redis为例)和地域(本文以华东2(上海)地域为例)。

    3. 单击创建实例

    4. 在购买页面,购买1个云数据库Redis实例。

    5. 项目

      说明

      示例值

      产品

      选择产品引擎的类型,可选为Redis或者Tair版,Redis选型指南参见云数据库Redis版选型

      Redis

      付费方式

      云数据库 Redis 实例的计费方式。

      云数据库 Redis 计费的详细信息请参见云Redis计费方式概述

      按量付费

      部署模式

      云数据库 Redis 实例的部署模式(产品形态)。云数据库 Redis实例中部署模式经典实例与云原生实例模式区别参见经典实例和云原生实例对比

      云原生(原云盘)

      系列

      Redis实例的系列,本方案以标准版为例。

      标准版

      地域和可用区

      选择云数据库 Redis 实例所在的地域。

      华东2(上海 )

      可用区类型

      选择云数据库 Redis 实例的可用区类型。

      单可用区

      主可用区

      选择云数据库Redis实例部署主节点所在的可用区。

      可用区 G

      专有网络

      选择之前规划的专有网络VPC及交换机。

      虚拟交换机

      实例类型

      双机热备架构,数据持久化,提供数据可靠性。

      高可用

      版本号

      云数据库Redis引擎的内核版本,分为:Redis5.0、Redis6.0、Redis7.0版本。

      Redis 6.0

      架构类型

      云数据库Redis的架构类型分为标准主从架构和Cluster集群架构,具体架构的区别和选择参见云数据库Redis架构信息导航

      不启用集群

      分片规格

      未开启“集群”模式时,实例为标准主从架构,“分片规格”等同于“实例规格”。开启“集群”模式后,实例由多个分片构成,需选择分片数量。

      16 GB

      密码设置

      设置实例的访问密码。

      password***

      实例名称

      表示云数据库 Redis 实例备注名。

      rdsmysql2redis_redis

      资源组

      选择被授权的资源组。

配置DTS订阅任务

10

1. 配置DTS数据订阅

接下来您需要开通并且配置数据传输服务DTS数据订阅功能,需要创建和配置DTS数据订阅任务,用于之后的数据传输服务DTS数据订阅的相关配置。

  1. 登录数据传输服务DTS管理控制台

  2. 在顶部菜单栏,选择被授权的资源组(本文以Rds2Redis为例)和地域(本文以华东2(上海)地域为例)。

  3. 在左侧导航栏,选择数据订阅

  4. 订阅任务页面,单击创建任务

  5. 创建任务面板,创建1个DTS数据订阅任务。

    项目

    说明

    示例值

    任务名称

    数据传输服务DTS数据订阅任务名称。

    mysql2redis_dts

    源库信息

    数据库类型

    本方案选择MySQL。

    MySQL

    接入方式

    本方案选择云实例。

    云实例

    实例地区

    选择之前创建的RDS实例所在的地区。

    华东2(上海)

    是否跨阿里云账号

    数据传输服务DTS支持对不同阿里云账号下的实例配置数据迁移或同步,实现跨阿里云账号的数据迁移或同步

    不跨账号

    RDS实例ID

    选择之前创建的RDS实例ID。

    数据库账号

    配置之前在RDS MySQL实例中创建的数据库账号和密码。

    数据库密码

    连接方式

    连接方式,支持非加密连接、SSL安全连接,本方案选择非加密连接。

    非加密连接

    消费网络类型

    专有网络

    选择之前规划的专有网络VPC及交换机。

    虚拟交换机

    image.png

  1. 点击测试连接以进入下一步,进入到“配置任务对象及高级配置”界面。

  2. 在订阅对象框中选择需要订阅的库表对象,选择之前在RDS MySQL实例中创建的数据库,如图所示:

    image.png

  1. 选择对应的库表对象后,点击下一步高级配置

  2. 点击下一步保存任务并预检查

  1. 等待预检查完成,并且点击下一步购买进入DTS实例购买页面,如图所示:

    image.png

  1. 选择付费方式为后付费,资源组配置选择已被授权的资源组。勾选服务协议后,单击购买并启动。如图所示:

    image.png

  1. 查看任务详情,在订阅任务启动后,可以在操作列上点击任务详情开始查看订阅任务的详情信息,如图所示:

    image.png

2. 新增订阅消费组

在开通和配置DTS数据订阅任务后,接下来您需要配置DTS数据订阅任务新增消费组,并根据下游客户端选择订阅数据消费方式。

  1. 登录数据传输服务DTS管理控制台

  2. 在顶部菜单栏,选择被授权的资源组(本文以Rds2Redis为例)和地域(本文以华东2(上海)地域为例)。

  3. 在左侧导航栏,选择数据订阅

  4. 订阅任务页面,定位到上述步骤中创建的订阅任务,在操作列上点击任务详情

  5. 进入任务详情页面后,在左侧导航栏选择数据消费,点击新增消费组进行相关配置。

  6. 填写消费组名称(如mysql2redis_consumer_group)、账号(如demoUser)以及密码信息登,如图所示:

    image.png

说明
  • 数据订阅功能支持创建消费组。通过创建多个消费组,您可以对同一个数据源的数据进行重复消费,从而降低数据订阅的使用成本。

  • 一个数据订阅实例最多可以创建20个消费组,通过创建多个消费组可以实现数据的重复消费。

  • 一个消费组只能创建一个消费者(consumer),并通过该消费者执行数据消费。

  • 若DTS用于读取增量数据的模块DStore或者客户端切换,则可能会导致数据重复。

部署DTS订阅程序

20

说明

为了避免订阅程序单点故障引起的数据同步延迟,您可以在不同可用区下的两台ECS云服务器上部署订阅程序形成主备容灾。更多信息,请参见:数据订阅SDK容灾

1. 编写DTS订阅程序

上一步中已经开通并且配置好了数据传输服务DTS数据订阅任务,接下来您需要通过订阅RDS MySQL的binlog数据变更信息,基于业务系统的需求对订阅到的事件和数据进行逻辑处理,并且最后写入到Redis缓存中。针对这个模块,本方案提供DTS数据订阅的代码示例和操作引导,以辅助您能够快速地基于自身的业务定制化数据订阅和同步。

  1. 下载DTS数据订阅SDK示例代码,并且进行解压。

    说明

    文件夹中包含了已经编译好的、可直接执行的jar包(需要配合含有相关参数设定的config.properties文件,详见后文),您可以基于该jar包直接进行同步验证,也可以基于代码中的相关Java文件进行定制化修改。

  2. (可选)使用IntelliJ IDEA软件,以Maven工程打开解压后的SDK示例代码文件。

  3. (可选)在subscribe-demo/src/main/java/com/alibaba/dts/demo/路径下,浏览并且编辑DTSMySQL2RedisDemo.java文件。

  4. (可选)定位到main()函数,浏览brokerUrl、topic、sid、userName、password、redisUrl、redisPort、redisPassword参数,新建并且编辑config.properties文件,定义并且修改上述参数。

  5. (可选)在subscribe-demo/src/main/java/com/alibaba/dts/demo/路径下,浏览并且编辑RedisRecordListener.java文件,涉及到的BINLOG数据订阅和同步到Redis中的代码逻辑均在该文件中进行处理。可基于该代码文件进行定制化的修改,如:过滤需要同步的库、表、记录等对象,修改下游Redis中的key、value结构等类型和信息等。

  6. (可选)在IntelliJ IDEA软件界面的顶部,单击Run > Run运行该程序。

    参数

    说明

    获取方式

    brokerUrl

    数据订阅通道的网络地址及端口号信息。

    说明如果您部署SDK客户端所属的ECS实例与数据订阅通道属于经典网络或同一专有网络,建议通过内网地址进行数据订阅,网络延迟最小。

    在DTS控制台单击目标订阅实例ID,在基本信息页面的网络区域,您可以获取网络地址及端口号信息。

    image.png

    topic

    数据订阅通道的订阅Topic。

    在DTS控制台单击目标订阅实例ID,在基本信息页面的基本信息区域,您可以获取到订阅Topic

    image.png

    sid

    消费组ID。

    在DTS控制台单击目标订阅实例ID,然后单击数据消费,您可以获取到消费组ID和消费组的账号信息。

    说明:消费组账号的密码已在您新建消费组时指定。

    image.png

    userName

    消费组的账号。

    警告

    如您未使用本文提供的客户端,请按照<消费组的账号>-<消费组ID>的格式设置用户名(例如:dtstest-dtsae******bpv),否则无法正常连接。

    password

    该账号的密码。

    initCheckpoint

    消费位点,即SDK客户端消费第一条数据的时间戳,格式为Unix时间戳,例如1620962769。

    说明:消费位点信息可用于:

    • 当业务程序中断后,传入已消费位点继续消费数据,防止数据丢失。

    • 在订阅客户端启动时,传入所需的消费位点,调整订阅位点,实现按需消费数据。

    消费位点必须在订阅实例的数据范围(如图示)之内,并需转化为Unix时间戳。image.png

    说明:Unix时间戳转换工具可用搜索引擎获取。

    ConsumerContext.ConsumerSubscribeMode subscribeMode

    SDK客户端的使用模式,取值为:

    • ConsumerContext.ConsumerSubscribeMode.ASSIGN:ASSIGN模式,即一个消费组下仅支持一个SDK客户端消费订阅数据。

    • ConsumerContext.ConsumerSubscribeMode.SUBSCRIBE:SUBSCRIBE模式,即支持在同一个消费组下同时启动多个SDK客户端实现灾备。

    redisUrl

    Redis实例的网络地址信息。

    进入Redis实例的实例信息页签,在连接信息区域获取公网访问的连接地址。

    redisPort

    Redis实例的端口信息。

    进入Redis实例的实例信息页签,在连接信息区域获取公网访问的端口号(Port)。

    redisPassword

    重要

    Redis实例的账号及密码。

    数据库密码格式为<user>:<password>。例如,Redis实例自定义的用户名为admin,密码为Rp829dlwa,则此处填入的数据库密码为admin:Rp829dlwa。

    在您创建Redis实例时已指定。

    说明

    若您忘记密码,可以重新设置实例的密码,详情请参见修改或重置密码。

    说明

    针对上述示例程序中的示例行为和更新逻辑有如下说明:

    1. 更新到Redis中的数据均为HASH类型,采用HMSET的方式写入;

    2. 针对有主键表,KEY值格式为:库名:表名:<主键字段1的值>:<主键字段2的值>...

    3. 针对无主键表,KEY值格式为:库名:表名:<字段1的值>:<字段2的值>...

    4. 详细逻辑详见:subscribe-demo/src/main/java/com/alibaba/dts/demo/RedisRecordListener.java

2. 部署DTS订阅程序

上一步中已经下载并且编辑好了数据传输服务DTS数据订阅的示例代码,接下来需要对示例程序进行编译打包,并且部署到ECS服务器进行运行。对这个模块,本方案提供DTS数据订阅的代码编译和打包操作引导,以辅助您能够快速地进行部署。

  1. (可选)在IntelliJ IDEA软件界面的顶部,单击View > Tool Windows > Maven,此时会在右侧栏打开Maven操作界面,双击package即可完成程序的打包,此时会在代码目标下新建target文件夹,在该文件夹下会生成jar包,如subscribe-demo-1.0-SNAPSHOT.jar和subscribe-demo-1.0-SNAPSHOT-jar-with-dependencies.jar等文件。

    说明

    数据订阅SDK示例代码文件夹中包含了已经编译好的、可直接执行的jar包(文件位于subscribe-demo/target目标下,需要配合含有相关参数设定的config.properties文件,详见后文),您可以基于该jar包直接进行同步验证,也可以基于代码中的相关Java文件进行定制化修改。

  2. 将subscribe-demo-1.0-SNAPSHOT-jar-with-dependencies.jar文件拷贝到弹性计算ECS服务器上,存放到相应的目录下。

  3. 在jar包所在的目录下,新建并且编辑config.properties文件,编辑并且填写brokerUrl、topic、sid、userName、password、redisUrl、redisPort、redisPassword参数,如config.properties文件内容:

    // brokerUrl
    brokerUrl=dts-cn-shanghai.aliyuncs.com:18001
    
    // topic to consume, partition is 0
    topic=cn_shanghai_vpc_xxxxxxxxxxxxx__demouser_upgrade_from_old_version2
    
    // user password and sid for auth
    sid=dtsxxxxxxxxxxx
    userName=demoUser
    password=xxxxxxxxxx
    
    // initial checkpoint for first seek(a timestamp to set, eg 1566180200 if you want (Mon Aug 19 10:03:21 CST 2019))
    // String initCheckpoint=1566180200
    
    // when use subscribe mode, group config is required. kafka consumer group is enabled
    //ConsumerContext.ConsumerSubscribeMode subscribeMode=ConsumerContext.ConsumerSubscribeMode.ASSIGN
    subscribeMode=ASSIGN
    
    // if force use config checkpoint when start. for checkpoint reset, only assign mode works
    isForceUseInitCheckpoint=true
    
    //redis url and port
    redisUrl=r-xxxxxxxxxxxxxxx.redis.rds.aliyuncs.com
    
    //replace to you redis port
    redisPort=6379
    
    redisPassword=<user>:<password>
  4. 运行Java程序,启动DTS订阅,启动命令行为:

    java -jar subscribe-demo-1.0-SNAPSHOT-jar-with-dependencies.jar 
  5. 观察DTS订阅程序运行情况,如图所示:

    image.png

数据同步结果验证

10

1. 更新RDSMySQL数据

上一步中您已经在数据传输服务DTS管理控制台上配置了DTS延迟告警、检查了DTS同步延迟等情况,接下来可以向源端 RDS MySQL 上写入、更新、删除相关数据,以模拟RDS MySQL上面的数据变更,比如可以模拟TPCC压测程序等或者以业务系统真实的更新数据,以观察DTS订阅情况等。

通过DTS运行程序的标准输出日志情况,可以观察到DTS订阅任务在订阅源端数据变更的情况,如图所示:

image.png

2. 检查Redis最新数据

上一步中您已经部署好了数据传输服务DTS数据订阅程序,并且对源端RDS MySQL有数据更新行为发生,即RDS MySQL实例中已经有BINLOG日志的更新,通过上述步骤可以观察到DTS订阅程序可以订阅到BINLOG的最新事件,接下来检查Redis实例中是否已经有最新的数据写入和更新。

通过Redis客户端等工具连接到Redis,检查Redis实例中最新的数据,并且针对其中的key进行验证,如图所示:

image.png

同时,也可以通过如MySQL客户端等工具连接到RDS MySQL实例,检查RDS MySQL实例中对应的最新数据,如图所示:

image.png

说明

RDS MySQL数据库中的数据与Redis中的数据并不是强一致的,可能会存在一定的延迟。

3. 检查DTS订阅延迟

上一步中您已经部署好了数据传输服务DTS数据订阅程序,并且对源端RDS MySQL有数据更新行为发生,接下来您需要对DTS订阅和数据同步的效果进行验证。针对生产环境,建议您在数据传输服务DTS控制台配置好对DTS订阅程序的监控报警等。

  1. 登录数据传输服务DTS管理控制台

  2. 在顶部菜单栏,选择被授权的资源组(本文以Rds2Redis为例)和地域(本文以华东2(上海)地域为例)。

  3. 在左侧导航栏,选择数据订阅

  4. 订阅任务页面,定位到上述步骤中创建的订阅任务,在操作列上点击任务详情

  5. 进入任务详情页面后,在左侧导航栏选择数据消费,点击任务管理

  6. 查看增量数据采集等页面,检查DTS订阅延迟情况等,如图所示:

    image.png

完成及清理

20

方案验证

完成了DTS订阅任务部署,以及数据同步结果验证等步骤后,您可以通过配置和观察DTS监控报警性能监控等来观察数据同步的可用性、延迟等,通过观察RDS MySQL实例和Redis实例中相关的记录来验证同步的正确性和一致性(注意考虑延迟带来的不一致情况)。

清理资源

在本方案中,您创建了1个专有网络VPC、1台交换机、1个云数据库 RDS MySQL 实例、1个云数据库 Redis 实例、1个数据传输服务DTS实例以及1个云服务器ECS实例。测试完方案后,您可以参考以下规则处理基础设施和云服务的实例,避免继续产生费用:

  1. 释放1个云数据库 RDS MySQL 实例:

    登录RDS管理控制台实例列表页面,找到目标实例,然后在操作列选择216更多-竖向..png>释放设置,根据界面提示释放实例。

  2. 释放1个云数据库 Redis 实例:

    登录Redis管理控制台,在实例列表页面,找到目标实例,然后在操作列选择216更多-竖向..png>释放,根据界面提示释放实例。

  3. 释放1个数据传输服务 DTS 数据订阅任务:

    登录DTS管理控制台,在数据订阅页面,找到目标任务,然后在操作列选择216更多-竖向..png>释放任务,根据界面提示释放实例。

  4. 释放1个云服务器 ECS 实例:

    登录ECS管理控制台,在实例页面,找到目标实例,然后在操作列选择216更多-竖向..png>释放设置,根据界面提示释放实例。

  5. 释放1台交换机:

    登录专有网络控制台,在交换机页面,找到目标交换机,然后在操作列单击删除,按照界面提示释放交换机。

  6. 释放1个专有网络VPC:

    登录专有网络控制台,在专有网络页面,找到目标VPC,然后在操作列单击删除,按照界面提示释放专有网络。

一键部署

80

https://www.aliyun.com/solution/tech-solution/rtsorarctebcc

方案概览

在许多业务场景中(比如商品信息查询、库存管理、账户余额查询、交易记录查询、用户信息查询等),为了提高数据查询速度和降低数据库压力,我们通常会使用Redis作为缓存层。然而,保持MySQL与Redis缓存之间的数据一致性是一个关键挑战。本方案将探讨基于Cache-Aside Pattern模式下的一种高效的MySQL与Redis缓存同步一致性方案,以确保业务数据的实时性和准确性,提高数据查询速度,降低数据库压力。

说明

Cache-Aside Pattern的优点是可以有效减轻数据库的压力,提高应用程序的性能和可扩展性。缺点是若缓存中的数据失效或未更新,可能导致应用程序读取到旧数据。此外,Cache-Aside Pattern不适用于数据更新频繁的应用程序,因为缓存不断失效和更新会导致缓存中的数据不稳定。

方案架构

方案提供的默认设置(如地域、VPC、安全组、vSwitch、实例名称等)完成部署后在阿里云上搭建的RDS MySQL实时数据同步到云数据库 ClickHouse 进行加速分析的架构图如下图所示。实际部署时您可以根据资源规划修改部分设置,但最终形成的运行环境与下图相似。

42ee575d2247542d249498e4acdd3bb6.png

本方案的技术架构包括以下基础设施和云服务:

  • 地域和可用区:云数据库 RDS MySQL 实例、云数据库 Redis 实例以及数据传输服务 DTS 实例必须在同一个地域中,但可以选择部署在不同的可用区。

  • 1个专有网络VPC:云数据库 RDS MySQL 实例、云数据库 Redis 实例以及数据传输服务 DTS 实例必须在同一个 VPC 网络环境中。

  • 1个云数据库RDS MySQL版实例:为线上订单/票务等服务提供数据持久化服务和事务一致性服务。

  • 1个云数据库Redis版实例:为线上订单/票务等服务提供缓存加速、库存查询以及秒杀限流等服务。

  • 1个数据传输服务DTS实例:用于订阅云数据库RDS MySQL中相关的数据表的更新事件。

  • 1台云服务器ECS实例:用于部署DTS订阅应用程序,用于接收数据传输服务DTS订阅云数据库RDS实例的更新事件,并且通过应用程序对云数据库Redis进行更新。

部署准备

10

开始部署前,请按以下指引完成账号申请、账号充值、RAM用户创建和授权。

准备账号

  1. 如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。

  2. 为阿里云账号充值

    1. 为节省成本,本方案默认选择使用按量付费资源,使用按量付费资源需要确保账户余额不小于100元。

    2. 完成本方案的部署及体验,预计产生费用不超过20元(假设您选择下表中的相关规格资源,且运行时间不超过2小时,如果调整了资源规格,请以控制台显示的实际报价以及最终账单为准)。

      云服务

      规格配置

      地域

      预估费用参考

      云服务器 ECS

      ecs.g5.xlarge,4 vCPU 16 GB

      华东2(上海)

      配置费用:1.864 元/小时

      公网流量费用:0.800 元/GB

      云数据库 RDS MySQL 版

      mysql.x4.medium.2c

      华东2(上海)

      1.8 元/小时

      云数据库 Redis

      Redis 16G集群(2节点)

      华东2(上海)

      3.13 元/小时

      数据传输服务 DTS

      数据订阅功能

      华东2(上海)

      3.00 元/小时

      按量费用:9.784 元/小时

      公网流量费用:0.800 元/GB

  3. 阿里云账号拥有操作资源的最高权限,从云资源安全角度考虑,建议您创建一个RAM用户,使RAM用户仅能操作有限的资源,然后由RAM用户完成本方案。

    1. 访问资源组页面,单击创建资源组,创建一个资源组,例如命名为Rds2Redis

    2. 访问RAM控制台-用户页面,单击创建用户,勾选控制台访问OpenAPI 调用访问,填写其他信息,创建一个RAM用户。

    3. 访问RAM控制台-权限策略页面,单击创建权限策略,单击脚本编辑,并复制粘贴以下内容,完成创建自定义权限策略。

      自定义权限策略

        {
            "Version": "1",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "ecs:Describe*",
                        "vpc:Describe*",
                        "kvstore:*",
                        "ros:*",
                        "dts:*"
                    ],
                    "Resource": "*"
                }
            ]
        }
    4. 访问RAM控制台-用户页面,授予权限。

      1. 单击目标RAM用户操作列的添加权限,选择授权范围指定资源组(例如Rds2Redis),然后选择系统策略AliyunECSFullAccess、AliyunRDSFullAccess和AliyunVPCFullAccess,单击确定

      2. 再次单击目标RAM用户操作列的添加权限,选择授权范围整个云账号,然后选择前面创建的自定义权限策略,单击确定

    5. 创建AliyunDTSDefaultRole角色,用于DTS服务访问当前云账号下的RDS、ECS等云资源。

      1. 访问RAM访问控制台-角色页面,单击创建角色角色类型选择阿里云账号角色名称配置为AliyunDTSDefaultRole,单击完成

      2. 找到已创建的AliyunDTSDefaultRole角色,单击操作列的精准授权选择权限类型系统策略输入策略名称AliyunDTSRolePolicy,单击确定

      3. 单击已创建的AliyunDTSDefaultRole角色名,切换至信任策略管理页签,单击修改信任策略,将信任策略修改为如下内容后,单击确定

        AliyunDTSDefaultRole角色信任策略

        {
          "Statement": [
            {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                "Service": [
                  "dts.aliyuncs.com"
                ]
              }
            }
          ],
          "Version": "1"
        }
      说明

      详细步骤参考:

一键部署

40

资源编排(ROS)可以让您通过YAML或JSON文件清晰简洁地描述所需的云资源及其依赖关系,然后自动化地创建和配置这些资源。您可以通过下方提供的ROS一键部署链接,来自动化地完成这些资源的创建和配置。

本文介绍的ROS模板主要完成了以下内容:

  • 部署1个专有网络VPC。

  • 部署1台交换机。

  • 部署1台云服务器 ECS。

  • 部署1个云数据库RDS MySQL。

  • 部署1个云数据库Redis。

  • 配置1个数据传输服务DTS订阅任务。

  • 已在ECS中部署DTS订阅程序。

    说明

    为了避免订阅程序单点故障引起的数据同步延迟,您可以在不同可用区下的两台ECS云服务器上部署订阅程序形成主备容灾。更多信息,请参见:数据订阅SDK容灾

  1. 打开一键配置模板链接前往ROS控制台,系统自动打开使用新资源创建资源栈的面板。

    说明

    ROS控制台默认处于您上一次访问控制台时的地域,请根据您创建的资源所在地域修改地域后再执行下一步。

  2. 确认好地域后(本教程以华东2(上海)地域为例),在配置参数模板步骤中配置资源栈名称ECSDatabase

    配置项

    参数

    说明

    示例值

    资源栈名称

    资源栈名称

    ROS一键部署任务名称,可自定义。

    rds2redis

    ECS

    交换区可用区

    ECS实例所在的可用区。

    可用区G

    实例类型

    ECS实例的架构、分类和规格配置。

    X86计算通用型:ecs.g5.xlarge

    系统盘类型

    ECS实例的硬盘类型。

    ESSD云盘

    实例密码

    ECS实例的密码。

    RDS

    实例规格

    云数据库RDS实例的规格。

    mysql.x4.medium.2c

    数据库名

    创建的数据库名称。

    RDS数据库账号

    RDS实例的数据库账号和密码。

    RDS数据库密码

    Redis

    实例规格

    云数据库Redis的规格。

    Redis 16G集群(2节点):

    redis.logic.sharding.8g.2db.0rodb.4proxy.default

    实例密码

    Redis实例的密码。

    DTS

    消费组账号

    DTS订阅消费组的账号和密码。

    消费组账号的密码

  3. 单击两次下一步,跳转至配置资源栈(可选)步骤,选择资源组为被授权的资源组(本文以Rds2Redis为例)。

  4. 单击创建,系统将自动创建并部署本教程所需的资源。

  5. 资源栈信息页面的状态显示为创建成功时表示一键配置完成。

    说明

    创建时间较久,耗时约30分钟,请耐心等待。

    image.png

  1. 单击资源页签,找到已创建的RDS实例,单击实例ID,进入RDS实例详情页,获取RDS的公网连接地址。

  2. 登录RDS实例,向源端 RDS MySQL 上写入、更新、删除相关数据,以模拟RDS MySQL上面的数据变更。

数据同步结果验证

10

1. 更新RDSMySQL数据

上一步中您已经在数据传输服务DTS管理控制台上配置了DTS延迟告警、检查了DTS同步延迟等情况,接下来可以向源端 RDS MySQL 上写入、更新、删除相关数据,以模拟RDS MySQL上面的数据变更,比如可以模拟TPCC压测程序等或者以业务系统真实的更新数据,以观察DTS订阅情况等。

通过DTS运行程序的标准输出日志情况,可以观察到DTS订阅任务在订阅源端数据变更的情况,如图所示:

image.png

2. 检查Redis最新数据

上一步中您已经部署好了数据传输服务DTS数据订阅程序,并且对源端RDS MySQL有数据更新行为发生,即RDS MySQL实例中已经有BINLOG日志的更新,通过上述步骤可以观察到DTS订阅程序可以订阅到BINLOG的最新事件,接下来检查Redis实例中是否已经有最新的数据写入和更新。

通过Redis客户端等工具连接到Redis,检查Redis实例中最新的数据,并且针对其中的key进行验证,如图所示:

image.png

同时,也可以通过如MySQL客户端等工具连接到RDS MySQL实例,检查RDS MySQL实例中对应的最新数据,如图所示:

image.png

说明

RDS MySQL数据库中的数据与Redis中的数据并不是强一致的,可能会存在一定的延迟。

3. 检查DTS订阅延迟

上一步中您已经部署好了数据传输服务DTS数据订阅程序,并且对源端RDS MySQL有数据更新行为发生,接下来您需要对DTS订阅和数据同步的效果进行验证。针对生产环境,建议您在数据传输服务DTS控制台配置好对DTS订阅程序的监控报警等。

  1. 登录数据传输服务DTS管理控制台

  2. 在顶部菜单栏,选择被授权的资源组(本文以Rds2Redis为例)和地域(本文以华东2(上海)地域为例)。

  3. 在左侧导航栏,选择数据订阅

  4. 订阅任务页面,定位到上述步骤中创建的订阅任务,在操作列上点击任务详情

  5. 进入任务详情页面后,在左侧导航栏选择数据消费,点击任务管理

  6. 查看增量数据采集等页面,检查DTS订阅延迟情况等,如图所示:

    image.png

完成及清理

20

方案验证

完成了数据同步结果验证等步骤后,您可以通过配置和观察DTS监控报警性能监控等来观察数据同步的可用性、延迟等,通过观察RDS MySQL实例和Redis实例中相关的记录来验证同步的正确性和一致性(注意考虑延迟带来的不一致情况)。

清理资源

在本方案中,您创建了1个专有网络VPC、1台交换机、1个云数据库 RDS MySQL 实例、1个云数据库 Redis 实例、1个数据传输服务DTS实例以及1个云服务器ECS实例。测试完方案后,您可以在ROS控制台找到目标资源栈,然后直接删除资源栈即可(删除时,删除方式选择为释放资源)。