这是一篇与来自 Vanguard 的 Raghu Boppanna 合着的客座文章。
At 前锋, Enterprise Advice 业务线通过数字访问高级、个性化和负担得起的财务建议来改善投资者的成果。 在某种程度上,他们通过具有高度弹性和高效技术平台的投资者在全球范围内推动规模经济,从而使这一切成为可能。 Vanguard 为此工作负载选择了多区域架构,以帮助防止区域服务受损。 出于高可用性目的,需要使工作负载使用的数据不仅在主要区域中可用,而且在辅助区域中也可用,并且复制延迟最小。 如果主要区域出现服务损坏,解决方案应该能够故障转移到次要区域,同时尽可能少地丢失数据并能够恢复数据摄取。
Vanguard Cloud Technology Office 和 AWS 合作在 AWS 上构建满足其弹性要求的基础设施解决方案。 多区域解决方案支持强大的故障转移机制,具有内置的可观察性和恢复能力。 该解决方案还支持将来自多个来源的数据流式传输到不同的 Kinesis 数据流。 该解决方案目前正在推广到不同业务线的团队,以改善他们工作负载的弹性状况。
此处讨论的用例需要变更数据捕获 (CDC) 将数据从远程数据源(大型机 DB2)流式传输到 Amazon Kinesis数据流,因为业务能力取决于此数据。 Kinesis Data Streams 是一种完全托管、大规模可扩展、持久且低成本的流式服务,可以持续捕获和流式传输来自多个来源的大量数据,并使数据在几毫秒内可供使用。 该服务构建为具有高度弹性,并使用多个可用区来处理和存储数据。
这篇文章中讨论的解决方案解释了 AWS 和 Vanguard 如何通过创新来构建弹性架构来满足他们的高可用性目标。
解决方案概述
该解决方案使用 AWS Lambda 将数据从主要区域中的 Kinesis 数据流复制到次要区域。 如果任何服务受损影响 CDC 管道,故障转移过程会将次要区域提升为生产者和消费者的主要区域。 我们用 Amazon DynamoDB 全局表 对于复制检查点,它允许从检查点恢复数据流,并且还维护一个主要区域配置标志,以防止来回复制相同数据的无限循环。
该解决方案还为 Kinesis Data Streams 消费者提供了使用同一 AWS 账户中的主要或任何次要区域的灵活性。
下图说明了参考架构。
让我们详细看看每个组件:
- CDC 处理器(生产商) – 在此参考架构中,生产者部署在 亚马逊弹性计算云 (Amazon EC2) 在主要和次要区域中,并且在主要区域中处于活动状态,在次要区域中处于待机模式。 它从外部数据源(如上面架构中所示的 DB2 数据库)捕获 CDC 数据,并流式传输到主要区域中的 Kinesis Data Streams。 先锋使用 3rd 方工具 Qlik Replicate 作为他们的 CDC 处理器。 除了来自远程数据源的实际行数据之外,它还会生成格式良好的有效负载,其中包括 DB2 提交时间戳到 Kinesis 数据流。 (
example-stream-1
在这个例子中)。 以下代码是一个示例负载,仅包含更改记录的主键和提交时间戳(为简单起见,表行数据的其余部分未在下面显示):{ "eventSource": "aws:kinesis", "kinesis": { "ApproximateArrivalTimestamp": "Mon July 18 20:00:00 UTC 2022", "SequenceNumber": "49544985256907370027570885864065577703022652638596431874", "PartitionKey": "12349999", "KinesisSchemaVersion": "1.0", "Data": "eyJLZXkiOiAxMjM0OTk5OSwiQ29tbWl0VGltZXN0YW1wIjogIjIwMjItMDctMThUMjA6MDA6MDAifQ==" }, "eventId": "shardId-000000000000:49629136582982516722891309362785181370337771525377097730", "invokeIdentityArn": "arn:aws:iam::6243876582:role/kds-crr-LambdaRole-1GZWP67437SD", "eventName": "aws:kinesis:record", "eventVersion": "1.0", "eventSourceARN": "arn:aws:kinesis:us-east-1:6243876582:stream/kds-stream-1/consumer/kds-crr:6243876582", "awsRegion": "us-east-1" }
的Base64解码值
Data
如下。 实际的 Kinesis 记录将包含更改的表行的整个行数据,以及主键和提交时间戳。{"Key": 12349999,"CommitTimestamp": "2022-07-18T20:00:00"}
CommitTimestamp
,在Data
字段用于复制检查点,对于准确跟踪有多少流数据已复制到辅助区域至关重要。 然后检查点可用于促进 CDC 处理器(生产者)故障转移,并准确地从复制检查点时间戳开始恢复生产数据。使用远程数据源的替代方法
CommitTimestamp
(如果不可用)是使用ApproximateArrivalTimestamp
(这是记录实际写入数据流时的时间戳)。 - 跨区域复制 Lambda 函数 – 该功能部署到主要和次要区域。 它设置有事件源映射到包含 CDC 数据的数据流。 可以使用相同的功能来复制多个流的数据。 它使用来自 Kinesis Data Streams 的一批记录进行调用,并将该批次复制到目标复制区域(通过 Lambda 配置环境提供)。 出于成本考虑,如果CDC数据只主动生产到主Region中,则secondary Region中函数的预留并发可以设置为XNUMX,在region failover时修改。 该功能有 AWS身份和访问管理 (IAM) 角色权限以执行以下操作:
- 在同一个账户中读取和写入此解决方案中使用的 DynamoDB 全局表。
- 在同一账户的两个区域中读取和写入 Kinesis Data Streams。
- 将自定义指标发布到 亚马逊CloudWatch 在同一账户的两个区域中。
- 复制检查点 – 复制检查点在主要和次要区域中使用 DynamoDB 全局表。 跨区域复制 Lambda 函数使用它来将最后一个复制记录的提交时间戳保留为为复制配置的每个流的复制检查点。 对于这篇文章,我们创建并使用一个名为
kdsReplicationCheckpoint
. - 活动区域配置 – 活动区域在主要和次要区域中都使用 DynamoDB 全局表。 它使用全局表的原生跨区域复制能力来复制配置。 它预先填充了关于哪个是流的主要区域的数据,以防止备用区域中的 Lambda 函数复制回主要区域。 如果备用区域中的 Lambda 函数将预留并发设置为零,则可能不需要此配置,但可以作为安全检查以避免数据的无限复制循环。 对于这篇文章,我们创建了一个名为
kdsActiveRegionConfig
并放置一个包含以下数据的项目:{ "stream-name": "example-stream-1", "active-region" : "us-east-1" }
- Kinesis 数据流 – CDC 处理器向其生成数据的流。 对于这篇文章,我们使用一个名为
example-stream-1
在两个区域中,具有相同的分片配置和访问策略。
跨区域复制的步骤顺序
让我们使用以下序列图简要了解一下该体系结构是如何运行的。
该序列由以下步骤组成:
- CDC处理器(在
us-east-1
) 从远程数据源读取 CDC 数据。 - CDC处理器(在
us-east-1
) 将 CDC 数据流式传输到 Kinesis Data Streams(在us-east-1
). - 跨区域复制 Lambda 函数(在 us-east-1 中)从数据流(在
us-east-1
). 增强的扇出模式推荐用于跨区域复制的专用和增加的吞吐量。 - 复制器 Lambda 函数(在
us-east-1
) 借助正在使用的流的活动区域配置验证其当前区域kdsActiveRegionConfig
DynamoDB 全局表以下示例代码(Java 语言)可以帮助说明正在评估的条件:// Fetch the current AWS Region from the Lambda function’s environment String currentAWSRegion = System.getenv(“AWS_REGION”); // Read the stream name from the first Kinesis Record once for the entire batch being processed. This is done because we are reusing the same Lambda function for replicating multiple streams. String currentStreamNameConsumed = kinesisRecord.getEventSourceARN().split(“:”)[5].split(“/”)[1]; // Build the DynamoDB query condition using the stream name Map<String, Condition> keyConditions = singletonMap(“streamName”, Condition.builder().comparisonOperator(EQ).attributeValueList(AttributeValue.builder().s(currentStreamNameConsumed).build()).build()); // Query the DynamoDB Global Table QueryResponse queryResponse = ddbClient.query(QueryRequest.builder().tableName("kdsActiveRegionConfig").keyConditions(keyConditions).attributesToGet(“ActiveRegion”).build());
- 该函数使用以下代码评估来自 DynamoDB 的响应:
// Evaluate the response if (queryResponse.hasItems()) { AttributeValue activeRegionForStream = queryResponse.items().get(0).get(“ActiveRegion”); return currentAWSRegion.equalsIgnoreCase(activeRegionForStream.s()); }
- 根据响应,函数会采取以下操作:
- 如果响应是
true
,复制器函数将记录生成到 Kinesis Data Streams 中us-east-2
以顺序的方式。- 如果出现故障,则跟踪记录的序号并中断迭代。 该函数返回失败序列号的列表。 通过返回失败的序列号,该解决方案使用了以下功能 Lambda 检查点 能够恢复处理部分失败的一批记录。 这在处理任何服务损伤时很有用,在这种情况下,函数会尝试跨区域复制数据以确保流奇偶校验并且没有数据丢失。
- 如果没有失败,则返回一个空列表,表示批处理成功。
- 如果响应是
false
,复制器函数返回而不执行任何复制。 为了降低 Lambda 调用的成本,您可以在 DR Region (us-east-2
)为零。 这将阻止调用该函数。 故障转移时,可以根据 CDC 吞吐量将此值更新为合适的数字,并在中设置函数的预留并发数us-east-1
为零以防止它不必要地执行。
- 如果响应是
- 在将所有记录生成到 Kinesis Data Streams 之后
us-east-2
,复制函数检查点到kdsReplicationCheckpoint
DynamoDB 全局表(在us-east-1
) 具有以下数据:{ "streamName": "example-stream-1", "lastReplicatedTimestamp": "2022-07-18T20:00:00" }
- 该函数在成功处理该批记录后返回。
性能考量
应根据以下因素了解解决方案的性能预期:
- 区域选择 – 复制延迟与数据传输的距离成正比,因此请了解您的区域选择
- 速度 – 数据的传入速度或正在复制的数据量
- 有效载荷大小 – 被复制的有效负载的大小
监控跨区域复制
建议在复制发生时对其进行跟踪和观察。 您可以定制 Lambda 函数以在每次调用结束时使用以下指标将自定义指标发布到 CloudWatch。 将这些指标发布到主要区域和次要区域有助于保护您自己免受影响主要区域可观察性的损害。
- 生产能力 – 当前的 Lambda 调用批量大小
- 复制延迟秒数 – 当前时间戳(处理完所有记录后)与
ApproximateArrivalTimestamp
被复制的最后一条记录
以下示例 CloudWatch 指标图显示平均复制延迟为 2 秒,吞吐量为 100 条记录,从 us-east-1
至 us-east-2
.
常见的故障转移策略
在影响主要区域中的 CDC 管道的任何损伤期间,业务连续性或灾难恢复需求可能要求将管道故障转移到次要(备用)区域。 这意味着在此故障转移过程中需要完成几件事:
- 如果可能,请停止 CDC 处理器工具中的所有 CDC 任务
us-east-1
. - CDC 处理器必须故障转移到辅助区域,以便它可以在备用区域外运行时从远程数据源读取 CDC 数据。
-
kdsActiveRegionConfig
DynamoDB 全局表需要更新。 例如,对于流example-stream-1
在我们的示例中使用,活动区域更改为us-east-2
:
{ "stream-name": "example-stream-1", "active-Region" : "us-east-2"
}
- 所有的流检查点都需要从
kdsReplicationCheckpoint
DynamoDB 全局表(在us-east-2
),并且来自每个检查点的时间戳用于在 producer 工具中启动 CDC 任务us-east-2
地区。 这最大限度地减少了数据丢失的可能性,并准确地从检查点时间戳开始从远程数据源恢复流式传输 CDC 数据。 - 如果使用保留并发来控制 Lambda 调用,请在主要区域中将该值设置为零(
us-east-1
) 和次要区域中的合适的非零值 (us-east-2
).
Vanguard 的多步故障转移策略
Vanguard 使用的一些第三方工具具有两步 CDC 流程,可将数据从远程数据源流式传输到目的地。 Vanguard 为其 CDC 处理器选择的工具遵循这种两步法:
- 第一步涉及设置一个日志流任务,该任务从远程数据源读取数据并保存在暂存位置。
- 第二步涉及设置从暂存位置读取数据的个人消费者任务——可以在 亚马逊弹性文件系统 (亚马逊 EFS) 或 亚马逊FSx,例如——并将其流式传输到目的地。 这里的灵活性在于,可以触发这些消费者任务中的每一个以从不同的提交时间戳流式传输。 日志流任务通常从消费者任务使用的所有提交时间戳中的最小值开始读取数据。
让我们看一个例子来解释这个场景:
- 消费者任务 A 正在将数据从提交时间戳 2022-07-19T20:00:00 开始流式传输到
example-stream-1
. - 消费者任务 B 正在将数据从提交时间戳 2022-07-19T21:00:00 开始流式传输到
example-stream-2
. - 在这种情况下,日志流应该从消费者任务使用的时间戳中的最小时间戳开始从远程数据源读取数据,即 2022-07-19T20:00:00。
以下序列图演示了在故障转移到 us-east-2
(备用区域)。
步骤如下:
- 故障转移过程在备用 Region 中触发(
us-east-2
在此示例中)需要时。 请注意,可以使用主要区域中管道的全面健康检查来自动触发。 - 故障转移过程使用区域的新值更新 kdsActiveRegionConfig DynamoDB 全局表作为
us-east-2
对于所有流名称。 - 下一步是从
kdsReplicationCheckpoint
DynamoDB 全局表(在us-east-2
). - 读取检查点信息后,故障转移过程找到所有的最小值
lastReplicatedTimestamp
. - CDC处理器工具中的日志流任务启动于
us-east-2
使用在第 4 步中找到的时间戳。它从该时间戳开始从远程数据源读取 CDC 数据,并将它们保存在 AWS 上的暂存位置。 - 下一步是启动所有消费者任务以从暂存位置读取数据并将其流式传输到目标数据流。 这是为每个消费者任务提供适当的时间戳的地方
kdsReplicationCheckpoint
表根据streamName
任务将数据流式传输到其中。
所有消费者任务启动后,数据将生成到 us-east-2 中的 Kinesis 数据流。 从这里开始,跨区域复制的过程与前面描述的相同——复制 Lambda 函数在 us-east-2
开始将数据复制到数据流中 us-east-1
.
从流中读取数据的消费者应用程序应该是幂等的,以便能够处理重复项。 由于多种原因,可能会在流中引入重复项,其中一些原因在下面列出。
- 生产者或 CDC 处理器在故障转移期间重放 CDC 数据时将重复项引入流中
- DynamoDB 全局表使用跨区域的数据异步复制,如果
kdsReplicationCheckpoint
表数据有复制滞后,故障转移过程可能会使用较旧的检查点时间戳来重放 CDC 数据。
此外,消费者应用程序应该检查被消费的最后一条记录的 CommitTimestamp。 这是为了促进更好的监控和恢复。
成熟之路:自动恢复
理想状态是完全自动化故障转移过程,减少恢复时间并满足弹性服务水平目标 (SLO)。 然而,在大多数组织中,故障转移、故障恢复和触发故障转移的决定需要人工干预来评估情况和决定结果。 创建脚本自动化来执行可由人运行的故障转移是一个很好的起点。
Vanguard 已将故障转移的所有步骤自动化,但仍然需要人工来决定何时调用它。 您可以自定义解决方案以满足您的需求,具体取决于您在环境中使用的 CDC 处理器工具。
结论
在本文中,我们描述了 Vanguard 如何创新并构建一个解决方案,用于在 Kinesis Data Streams 中跨区域复制数据,从而使数据高度可用。 我们还演示了一个强大的检查点策略,以在需要时促进复制过程的区域故障转移。 该解决方案还说明了如何使用 DynamoDB 全局表来跟踪复制检查点和配置。 借助此架构,Vanguard 能够根据 CDC 数据将工作负载部署到多个区域,以满足在主要区域中的服务损伤影响 CDC 管道时的高可用性业务需求。
如果您有任何反馈,请在下面的评论部分发表评论。
关于作者
拉古博帕纳 在 Vanguard 的首席技术办公室担任企业架构师。 Raghu 擅长数据分析、数据迁移/复制,包括 CDC 管道、灾难恢复和数据库。 他获得了多项 AWS 认证,包括 AWS Certified Security – Specialty 和 AWS Certified Data Analytics – Specialty。
帕拉米斯瓦兰五世·瓦伊迪亚纳坦 是 Amazon Web Services 的高级云弹性架构师。 他通过在 AWS 云上设计和构建可扩展且有弹性的解决方案来帮助大型企业实现业务目标。
里查考尔 是为金融服务客户提供客户解决方案的高级领导者。 她常驻纽约。 她在大规模云转型、卓越员工和下一代数字解决方案方面拥有丰富的经验。 她和她的团队专注于通过构建高性能、弹性和敏捷的解决方案来优化云的价值。 Richa 喜欢铁人三项、音乐和学习新技术等多项运动。
米希尔普拉萨德 是 Amazon Web Services 的首席客户解决方案经理。 在他的职位上,Mithil 与客户合作推动云价值实现,提供思想领导力以帮助企业实现速度、敏捷性和创新。
- SEO 支持的内容和 PR 分发。 今天得到放大。
- 柏拉图区块链。 Web3 元宇宙智能。 知识放大。 访问这里。
- Sumber: https://aws.amazon.com/blogs/big-data/how-vanguard-made-their-technology-platform-resilient-and-efficient-by-building-cross-region-replication-for-amazon-kinesis-data-streams/
- 1
- 100
- 2022
- 28
- a
- 对,能力--
- Able
- 关于
- 以上
- ACCESS
- 根据
- 账号管理
- 准确
- 横过
- 行动
- 要积极。
- 积极地
- 通
- 增加
- 忠告
- 影响
- 实惠
- 后
- 驳
- 敏捷
- 所有类型
- 允许
- 替代
- Amazon
- Amazon EC2
- 亚马逊Kinesis
- 亚马逊网络服务
- 量
- 分析
- 和
- 应用领域
- 的途径
- 适当
- 架构
- 自动化
- 自动化
- 自动化
- 可用性
- 可使用
- 避免
- AWS
- AWS 认证
- 背部
- 基于
- 因为
- 作为
- 如下。
- 更好
- 之间
- 简要地
- 破
- 建立
- 建筑物
- 建
- 内建的
- 商业
- 业务连续性
- 企业
- 被称为
- 捕获
- 捕获
- 案件
- 疾病预防控制中心
- 认证
- 认证
- 可能性
- 更改
- 查
- 支票
- 首席
- 选择
- 云端技术
- 云技术
- 码
- 评论
- 注释
- 承诺
- 元件
- 全面
- 计算
- 流程条件
- 配置
- 注意事项
- 消费
- 消费者
- 消费者
- 消费
- 一直
- 控制
- 价格
- 可以
- 情侣
- 创建信息图
- 创造
- 危急
- 电流
- 目前
- 习俗
- 顾客
- 客户解决方案
- 合作伙伴
- 定制
- data
- 数据分析
- 数据丢失
- 数据库
- 数据库
- 决定
- 决定
- 专用
- 证明
- 演示
- 根据
- 依靠
- 部署
- 部署
- 描述
- 目的地
- 细节
- 差异
- 不同
- 数字
- 直接
- 灾害
- 讨论
- 距离
- 驾驶
- 驾驶
- 重复
- ,我们将参加
- 每
- 此前
- 赚
- 经济
- 规模经济
- 高效
- 员工
- 使
- 增强
- 确保
- 企业
- 企业
- 整个
- 环境
- 醚(ETH)
- 评估
- 评估
- 活动
- 所有的
- 例子
- 追求卓越
- 执行
- 期望
- 预期
- 体验
- 说明
- 介绍
- 广泛
- 外部
- 面部彩妆
- 促进
- 因素
- 失败
- 失败
- 失败
- 专栏
- 反馈
- 部分
- 文件
- 金融
- 金融服务
- 发现
- 姓氏:
- 高度灵活
- 专注焦点
- 以下
- 如下
- 对于投资者
- 发现
- 止
- 充分
- 功能
- 代
- 全球
- 地球
- 理想中
- 非常好
- 图形
- 客人
- 游客发表
- 处理
- 处理
- 发生
- 健康管理
- 帮助
- 帮助
- 此处
- 高
- 高度
- 创新中心
- How To
- 但是
- HTTPS
- 人
- 人类
- IAM
- 理想
- 身分
- 减值
- 改善
- 提高
- in
- 包含
- 来电
- 增加
- 表示
- 个人
- 信息
- 基础设施
- 創新
- 例
- 介入
- 介绍
- 推出
- 投资者
- 投资者
- 涉及
- IT
- 迭代
- 爪哇岛
- 七月
- 键
- Kinesis 数据流
- 大
- 名:
- 潜伏
- 领导者
- 领导团队
- 学习
- 离开
- Level
- Line
- 线
- 清单
- 小
- 圖書分館的位置
- 看
- 离
- 制成
- 维护
- 使
- 制作
- 管理
- 经理
- 方式
- 手册
- 许多
- 制图
- 大规模
- 到期
- 手段
- 机制
- 满足
- 会议
- 公
- 指标
- 最小
- 最低限度
- 时尚
- 改性
- 监控
- 最先进的
- 多
- 多
- 音乐
- 姓名
- 名称
- 本地人
- 需求
- 打印车票
- 需要
- 全新
- 新技术
- 纽约
- 下页
- 数
- 数字
- 目标
- 观察
- 办公
- 操作
- 追求项目的积极优化
- 组织
- 成果
- 平价
- 部分
- 合作
- 党
- 模式
- 演出
- 性能
- 执行
- 权限
- 仍然存在
- 个性化你的
- 管道
- 地方
- 平台
- 柏拉图
- 柏拉图数据智能
- 柏拉图数据
- 请
- 政策
- 可能
- 帖子
- 可能
- 防止
- 小学
- 校长
- 过程
- 处理
- 处理器
- 生成
- 制片人
- 生产者
- 促进
- 保护
- 提供
- 提供
- 提供
- 发布
- 出版
- 目的
- 放
- 阅读
- 阅读
- 实现
- 原因
- 建议
- 记录
- 记录
- 恢复
- 恢复
- 减少
- 减少
- 地区
- 区域性
- 地区
- 远程
- 复制
- 重复
- 复制
- 必须
- 岗位要求
- 需要
- 保留的
- 弹性
- 弹性
- 响应
- REST的
- 简历
- 回报
- 返回
- 回报
- 健壮
- 角色
- 轧制
- 行
- 运行
- 实现安全
- 同
- 可扩展性
- 鳞片
- 脚本
- 其次
- 次
- 秒
- 部分
- 保安
- 前辈
- 序列
- 服务
- 服务
- 特色服务
- 服务
- 集
- 设置
- 几个
- 应该
- 如图
- 作品
- 简单
- 情况
- 尺寸
- So
- 方案,
- 解决方案
- 一些
- 来源
- 来源
- 专业
- 其他
- 速度
- 运动
- 分期
- 开始
- 开始
- 启动
- 州/领地
- 步
- 步骤
- 仍
- Stop 停止
- 商店
- 策略
- 流
- 流
- 流媒体服务
- 流
- 成功
- 顺利
- 合适的
- 优于
- 提供
- 支持
- 系统
- 表
- 需要
- 目标
- 任务
- 任务
- 团队
- 队
- 文案
- 技术
- 专业技术
- 其
- 事
- 第三方
- 思想
- 精神领袖
- 通过
- 吞吐量
- 次
- 时间戳
- 至
- 工具
- 工具
- 跟踪时
- 跟踪
- 转型
- 旅行
- 触发
- 引发
- 理解
- 了解
- 不必要的
- 更新
- 更新
- 最新动态
- 使用
- 用例
- 平时
- UTC
- 折扣值
- 前锋
- 速度
- 通过
- 体积
- 卷筒纸
- Web服务
- 这
- 而
- 将
- 中
- 也完全不需要
- 合作
- 将
- 写
- 书面
- 您一站式解决方案
- 你自己
- 和风网
- 零
- 区