亚马逊云科技Amazon MSK基于S3云服务器实现导出导入、备份还原、迁移方案

news2024/11/24 17:10:10

亚马逊云科技Amazon MSK是Amazon云平台提供的托管Kafka服务。在系统升级或迁移时,用户常常需要将一个Amazon MSK集群中的数据导出(备份),然后在新集群或另一个集群中再将数据导入(还原)。通常,Kafka集群间的数据复制和同步多采用Kafka MirrorMaker,但是,在某些场景中,受环境限制,两个于Kafka集群之间的网络可能无法连通,或者两个亚马逊云科技账号相互隔离,亦或是需要将Kafka的数据沉淀为文件存储以备他用。此时,基于Kafka Connect S3 Source/Sink Connector的方案会是一种较为合适的选择,本文就将介绍一下这一方案的具体实现。

 数据的导出、导入、备份、还原通常都是一次性操作,为此搭建完备持久的基础设施并无太大必要,省时省力,简单便捷才是优先的考量因素。为此,本文将提供一套开箱即用的解决方案,方案使用Docker搭建Kafka Connect,所有操作均配备自动化Shell脚本,用户只需设置一些环境变量并执行相应脚本即可完成全部工作。这种基于Docker的单体模式可以应对中小型规模的数据同步和迁移,如果要寻求稳定、健壮的解决方案,可以考虑将Docker版本的Kafka Connect迁移到Kubernetes或Amazon MSK Connect,实现集群化部署。

 整体架构

 首先介绍一下方案的整体架构。导出/导入和备份/还原其实是两种高度类似的场景,但为了描述清晰,我们还是分开讨论。先看一下导出/导入的架构示意图:

 在这个架构中,Source端的MSK是数据流的起点,安装了S3 Sink Connector的Kafka Connect会从Source端的MSK中提取指定Topic的数据,然后以Json或Avro文件的形式存储到S3上;同时,另一个安装了S3 Source Connector的Kafka Connect会从S3上读取这些Json或Avro文件,然后写入到Sink端MSK的对应Topic中。如果Source端和Sink端的MSK集群不在同一个Region,可以在各自的Region分别完成导入和导出,然后在两个Region之间使用S3的Cross-Rejion Replication进行数据同步。

 该架构只需进行简单的调整,即可用于MSK集群的备份/还原,如下图所示:先将MSK集群的数据备份到S3上,待完成集群的升级、迁移或重建工作后,再从S3上将数据恢复到新建集群即可。

 预设条件

 本文聚焦于Kafka Connect的数据导出/导入和备份/还原操作,需要提前准备:

 一台基于Amazon Linux2的EC2实例(建议新建纯净实例),本文所有的实操脚本都将在该实例上执行,该实例也是运行Kafka Connect Docker Container的宿主机。

 两个MSK集群,一个作为Source,一个作为Sink;如果只有一个MSK集群也可完成验证,该集群将既作Source又作Sink。

 为聚焦Kafka Connect S3 Source/Sink Connector的核心配置,预设MSK集群没有开启身份认证(即认证类型为Unauthenticated),数据传输方式为PLAINTEXT,以便简化Kafka Connect的连接配置。

 网络连通性上要求EC2实例能访问S3、Source端MSK集群、Sink端MSK集群。如果在实际环境中无法同时连通Source端和Sink端,则可以在两台分属于不同网络的EC2上进行操作,但它们必须都能访问S3。如果是跨Region或账号隔离,则另需配置S3 Cross-Region Replication或手动拷贝数据文件。

 全局配置

 由于实际操作将不可避免地依赖到具体的亚马逊云科技账号以及本地环境里的各项信息(如AKSK,服务地址,各类路径,Topic名称等),为了保证本文给出的操作脚本具有良好的可移植性,将所有与环境相关的信息抽离出来,以全局变量的形式在实操前集中配置。以下就是全局变量的配置脚本,读者需要根据个人环境设定这些变量的取值:

 为了便于演示和解读,本文将使用下面的全局配置,其中前6项配置与账号和环境强相关,仍需用户自行修改,脚本中给出的仅为示意值,而后5项配置与MSK数据的导入导出息息相关,不建议修改,因为后续的解读将基于这里设定的值展开,待完成验证后,您可再根据需要灵活修改后5项配置以完成实际的导入导出工作。

 回到操作流程,登录准备好的EC2实例,修改下面脚本中与账号和环境相关的前6项配置,然后执行修改后的脚本。此外,需要提醒注意的是:在后续操作中,部分脚本执行后将不再返回,而是持续占用当前窗口输出日志或Kafka消息,因此需要新开命令行窗口,每次新开窗口都需要执行一次这里的全局配置脚本。

 关于上述脚本中的后5项配置,有如下详细说明:

 我们就以脚本中设定的值为例,解读一下这5项配置联合起来将要实现的功能,同时也是本文将演示的主要内容:

 在Source端的MSK集群上存在两个名为source-topic-1和source-topic-2的Topic,通过安装有S3 Sink Connector的Kafka Connect(Docker容器)将两个Topic的数据导出到S3的指定存储桶中,然后再通过安装有S3 Source Connector的Kafka Connect(Docker容器,可以和S3 Source Connector共存为一个Docker容器)将S3存储桶中的数据写入到Sink端的MSK集群上,其中原source-topic-1的数据将被写入sink-topic-1,原source-topic-2的数据将被写入sink-topic-2。

 特别地,如果是备份/还原场景,需要保持导出/导入的Topic名称一致,此时,可直接删除S3 Source Connector中以transforms开头的4项配置(将在下文中出现),或者将下面两项改为:

 如果只有一个MSK集群,同样可以完成本文的验证工作,只需将SOURCE_KAFKA_BOOTSTRAP_SEVERS和SINK_KAFKA_BOOTSTRAP_SEVERS同时设置为该集群即可,这样,该集群既是Source端又是Sink端,由于配置中的Source Topics和Sink Topics并不同名,所以不会产生冲突。

 环境准备

 安装工具包

 在EC2上执行以下脚本,安装并配置jq,yq,docker,jdk,kafka-console-client五个必须的软件包,可以根据自身EC2的情况酌情选择安装全部或部分软件。建议使用纯净的EC2实例,完成全部的软件安装:

 创建S3存储桶

 整个方案以S3作为数据转储媒介,为此需要在S3上创建一个存储桶。Source端MSK集群的数据将会导出到该桶中并以Json文件形式保存,向Sink端MSK集群导入数据时,读取的也是存储在该桶中的Json文件。

 在源MSK上创建Source Topics

 为了确保Topics数据能完整备份和还原,S3 Source Connector建议Sink Topics的分区数最好与Source Topics保持一致,如果让MSK自动创建Topic,则很有可能会导致Source Topics和Sink Topics的分区数不对等,所以,选择手动创建Source Topics和Sink Topics,并确保它们的分区数一致。以下脚本将创建source-topic-1和source-topic-2两个Topic,各含9个分区:

 在目标MSK上创建Sink Topics

 原因同上,以下脚本将创建:sink-topic-1和sink-topic-2两个Topic,各含9个分区:

 制作Kafka Connect镜像

 接下来是制作带S3 Sink Connector和S3 Source Connector的Kafka Connect镜像,镜像和容器均以kafka-s3-syncer命名,以下是具体操作:

 配置并启动Kafka Connect

 镜像制作完成后,就可以启动了Kafka Connect了。Kafka Connect有很多配置项,需要提醒注意的是:在下面的配置中,使用的是Kafka Connect内置的消息转换器:JsonConverter,如果你的输入/输出格式是Avro或Parquet,则需要另行安装对应插件并设置正确的Converter Class。

 上述脚本执行后,命令窗口将不再返回,而是会持续输出容器日志,因此下一步操作需要新开一个命令行窗口。

 配置并启动S3 Sink Connector

 在第5节的操作中,已经将S3 Sink Connector安装到了Kafka Connect的Docker镜像中,但是还需要显式地配置并启动它。新开一个命令行窗口,先执行一遍《实操步骤(1):全局配置》,声明全局变量,然后执行以下脚本:

 配置并启动S3 Source Connector

 同上,在第5节的操作中,已经将S3 Source Connector安装到了Kafka Connect的Docker镜像中,同样需要显式地配置并启动它:

 至此,整个环境搭建完毕,一个以S3作为中转媒介的MSK数据导出、导入、备份、还原链路已经处于运行状态。

 测试

 现在,来验证一下整个链路是否能正常工作。首先,使用kafka-console-consumer.sh监控source-topic-1和sink-topic-1两个Topic,然后使用脚本向source-topic-1持续写入数据,如果在sink-topic-1看到了相同的数据输出,就说明数据成功地从source-topic-1导出然后又导入到了sink-topic-1中,相应的,在S3存储桶中也能看到“沉淀”的数据文件。

 打开Source Topic

 新开一个命令行窗口,先执行一遍《实操步骤(1):全局配置》,声明全局变量,然后使用如下命令持续监控source-topic-1中的数据:

 打开Sink Topic

 新开一个命令行窗口,先执行一遍《实操步骤(1):全局配置》,声明全局变量,然后使用如下命令持续监控sink-topic-1中的数据:

 向Source Topic写入数据

 新开一个命令行窗口,先执行一遍《实操步骤(1:全局配置》,声明全局变量,然后使用如下命令向source-topic-1中写入数据:

 现象与结论

 执行上述写入操作后,从监控source-topic-1的命令行窗口中可以很快看到写入的数据,这说明Source端MSK已经开始持续产生数据了,随后(约1分钟),即可在监控sink-topic-1的命令行窗口中看到相同的输出数据,这说明目标端的数据同步也已开始正常工作。此时,打开S3的存储桶会发现大量Json文件,这些Json是由S3 Sink Connector从source-topic-1导出并存放到S3上的,然后S3 Source Connector又读取了这些Json并写入到了sink-topic-1中,至此,整个方案的演示与验证工作全部结束。

 清理

 在验证过程中,可能需要多次调整并重试,每次重试最好恢复到初始状态,以下脚本会帮助清理所有已创建的资源:

 小结

 本方案主要定位于轻便易用,在S3 Sink Connector和S3 Source Connector中还有很多与性能、吞吐量相关的配置,例如:s3.part.size, flush.size, s3.poll.interval.ms, tasks.max等,可以在实际需要自行调整,此外,Kafka Connect也可以方便地迁移到Kubernetes或Amazon MSK Connect中以实现集群化部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1343455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络安全 | CTF】FlatScience

该题考察SQL注入 正文 后台扫到robots.txt 页面内容如下&#xff1a; 进入login.php 页面源代码如图&#xff1a; 传参debug得到php代码&#xff1a; <?php if(isset($_POST[usr]) && isset($_POST[pw])){$user $_POST[usr];$pass $_POST[pw];$db new SQLite3…

Linux(ubuntu)下git / github/gitee使用

先附上git命令 linuxchenxiao:~$ cd Templates/ 先进入一个目录&#xff0c;也可mkdir新建一个目录&#xff1a;用于接下来初始化为git可以管理的仓库 这个目录就是所说的工作目录&#xff0c;指当前正在进行开发的项目的本地目录。 linuxchenxiao:~/Templates$ git init 已…

Web自动化测试:Selenium入门到精通

前言 说到自动化测试&#xff0c;就不得不提大名鼎鼎的Selenium。Selenium 是如今最常用的自动化测试工具之一&#xff0c;支持快速开发自动化测试框架&#xff0c;且支持在多种浏览器上执行测试。 Selenium学习难度小&#xff0c;开发周期短。对测试人员来说&#xff0c;如果…

C# 使用ZXing.Net生成二维码和条码

写在前面 条码生成是一个经常需要处理的功能&#xff0c;本文介绍一个条码处理类库&#xff0c;ZXing用Java实现的多种格式的一维二维条码图像处理库&#xff0c;而ZXing.Net是其.Net版本的实现。 在WinForm下使用该类库需要从NuGet安装两个组件&#xff1a; ZXing.Net ZXing…

python+django网上银行业务综合管理系统vue_bvj8b

本课题主要研究如何用信息化技术改善传统网上银行综合管理行业的经营和管理模式&#xff0c;简化网上银行综合管理的难度&#xff0c;根据管理实际业务需求&#xff0c;调研、分析和编写系统需求文档&#xff0c;设计编写符合银行需要的系统说明书&#xff0c;绘制数据库结构模…

网络安全应急响应工具之-流量安全取证NetworkMiner

在前面的一些文章中&#xff0c;用了很多的章节介绍流量分析和捕获工具wireshark。Wireshark是一款通用的网络协议分析工具&#xff0c;非常强大&#xff0c;关于wireshark的更多介绍&#xff0c;请关注专栏&#xff0c;wireshark从入门到精通。本文将介绍一个专注于网络流量取…

Ubuntu 安装MySQL以及基本使用

前言 MySQL是一个开源数据库管理系统&#xff0c;通常作为流行的LAMP&#xff08;Linux&#xff0c;Apache&#xff0c;MySQL&#xff0c;PHP / Python / Perl&#xff09;堆栈的一部分安装。它使用关系数据库和SQL&#xff08;结构化查询语言&#xff09;来管理其数据。 安装…

Kafka:本地设置

这是设置 Kafka 将数据从 Elasticsearch 发布到 Kafka 主题的三部分系列的第一部分;该主题将被 Neo4j 使用。第一部分帮助您在本地设置 Kafka。第二部分将讨论如何设置Elasticsearch将数据发布到Kafka主题。最后 将详细介绍如何使用连接器订阅主题并使用数据。 Kafka Kafka 是…

3.云原生之kubesphere运维

文章目录 k8s节点状态介绍配置宿主机使用k8s内部域名使用KubeKey 升级kubesphere使用KubeKey添加节点使用KubeKey下架节点使用k8s命令添加新节点k8s集群备份与恢复环境准备备份与还原在集群A和B中安装Velero集群A备份操作集群B还原备份操作 注意&#xff1a;所有节点运维操作前…

TON 入门之旅:从 0 到 1 探索 TON 生态钱包开发路径

TON 区块链被设计为分布式超级计算机或“超级服务器&#xff08;superserver&#xff09;”&#xff0c;旨在提供各种产品和服务&#xff0c;以促进去中心化的发展。顺利从 TON 生态入门区块链开发世界需要理解哪些智能合约语言&#xff0c;掌握哪些应用搭建技巧&#xff1f;第…

Apache Flink连载(二十):Flink On Yarn运行 - Yarn Per-Job模式(弃用)

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. 任务提交命令 2. 任务…

DM、Oracle、GaussDB、Kingbase8(人大金仓数据库)和HIVE给列增加注释

DM数据库给列增加注释 1、创建表 CREATE TABLE test222 ( id int NOT NULL PRIMARY KEY, name varchar(1000) DEFAULT NULL, email varchar(1000) DEFAULT NULL, phone varchar(1000) DEFAULT NULL ) 2、给列添加注释 comment on column TEST222.NAME is 这是一个列注释; 例如…

WPF+Halcon 培训项目实战(7):目标匹配助手

前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享&#xff0c;想要源码或者教学视频可以和他联系一下。 相关链接 微软系列技术教程 WPF 年度公益课程 Halcon开发 CSD…

HarmonyOS4.0系统性深入开发08服务卡片架构

服务卡片概述 服务卡片&#xff08;以下简称“卡片”&#xff09;是一种界面展示形式&#xff0c;可以将应用的重要信息或操作前置到卡片&#xff0c;以达到服务直达、减少体验层级的目的。卡片常用于嵌入到其他应用&#xff08;当前卡片使用方只支持系统应用&#xff0c;如桌…

封装uniapp签字板

新开发的业务涉及到签字功能&#xff0c;由于是动态的表单&#xff0c;无法确定它会出现在哪里&#xff0c;不得已封装模块。 其中涉及到一个难点就是this的指向性问题&#xff0c; 第二个是微信小程序写法&#xff0c; 我这个写法里用了u-view的写法&#xff0c;可以自己修改组…

java中如何使用elasticsearch—RestClient操作文档(CRUD)

目录 一、案例分析 二、Java代码中操作文档 2.1 初始化JavaRestClient 2.2 添加数据到索引库 2.3 根据id查询数据 2.4 根据id修改数据 2.4 删除操作 三、java代码对文档进行操作的基本步骤 一、案例分析 去数据库查询酒店数据&#xff0c;导入到hotel索引库&#xff0…

最新Jasmine博客模板:简洁美观的自适应Typecho主题

Jasmine是一个专为博客类网站设计的Typecho主题。它以简洁为基础&#xff0c;力求展现出精致而美观的风格。主题采用了响应式设计&#xff0c;即使在移动设备上也能提供良好的使用体验。此外&#xff0c;主题还进行了针对性的优化&#xff0c;包括SEO、夜间模式和代码高亮等方面…

楼宇对讲门铃选型分析

目前很多的高层住宅都使用了对讲门铃了&#xff0c;在频繁使用中&#xff0c;门铃会出现的越来越多种类&#xff0c;下面我就简单的介绍会有用到的几款芯片. 语音通话芯片&#xff1a;D34018,D34118,D5020,D31101; D34018 单片电话机通话电路&#xff0c;合并了必 需的放大器…

【23.12.29期--Redis缓存篇】谈一谈Redis的集群模式

谈一谈Redis的集群模式 ✔️ 谈一谈Redis的集群模式✔️主从模式✔️ 特点✔️Redis主从模式Demo ✔️哨兵模式✔️Redis哨兵模式Demo✔️特点 ✔️Cluster模式✔️Redis Cluster模式Demo✔️特点 ✔️ 谈一谈Redis的集群模式 Redis有三种主要的集群模式&#xff0c;用于在分布…

Unity Meta Quest 一体机开发(十二):【手势追踪】Poke 交互 - 用手指点击由 3D 物体制作的 UI 按钮

文章目录 &#x1f4d5;教程说明&#x1f4d5;给玩家配置 HandPokeInteractor&#x1f4d5;用 3D 物体制作可以被点击的 UI 按钮⭐搭建物体层级⭐给物体添加脚本⭐为脚本变量赋值 &#x1f4d5;模仿官方样例按钮的样式&#x1f4d5;在按钮上添加文字&#x1f4d5;修改按钮图片 …