Debezium日常分享系列之:在 OpenShift 上部署 Debezium

news2024/11/27 21:51:43

Debezium日常分享系列之:在 OpenShift 上部署 Debezium

  • 一、先决条件
  • 二、部署 Strimzi Operator
  • 三、为数据库创建机密
  • 四、部署Apache Kafka
  • 五、部署数据源
  • 六、部署 Debezium 连接器
  • 七、创建 Debezium 连接器
  • 八、验证部署

此过程用于在 Red Hat 的 OpenShift 容器平台上设置 Debezium 连接器。要在 OpenShift 上进行开发或测试,您可以使用 CodeRady 容器。

一、先决条件

为了使容器与集群上的其他工作负载分开,请为 Debezium 创建一个专用项目。在本文档的其余部分中,将使用 debezium-example 命名空间:

oc new-project debezium-example

二、部署 Strimzi Operator

对于 Debezium 部署,我们将使用 Strimzi 项目,该项目管理 OpenShift 集群上的 Kafka 部署。安装 Strimzi 最简单的方法是从 OperatorHub 安装 Strimzi 操作器。导航到 OpenShift UI 中的“OperatorHub”选项卡,选择“Strimzi”并单击“安装”按钮。

在这里插入图片描述
如果您更喜欢命令行工具,也可以通过以下方式安装 Strimzi 操作符:

使用"<<"操作符和"oc create"命令来创建一个Kubernetes对象。通过将以下内容复制到终端中并按下Enter键执行命令:

cat << EOF | oc create -f -
<对象配置内容>
EOF

请将"<对象配置内容>"替换为您要创建的Kubernetes对象的配置。将其粘贴到命令中并按下Enter键,Kubernetes将创建该对象。
$ cat << EOF | oc create -f -
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: my-strimzi-kafka-operator
  namespace: openshift-operators
spec:
  channel: stable
  name: strimzi-kafka-operator
  source: operatorhubio-catalog
  sourceNamespace: olm
EOF

三、为数据库创建机密

稍后,在部署 Debezium Kafka 连接器时,我们需要提供连接器的用户名和密码才能连接到数据库。出于安全原因,最好不要直接提供凭据,而是将它们保存在单独的安全位置。 OpenShift 为此提供了 Secret 对象。除了创建 Secret 对象本身之外,我们还必须创建一个角色和角色绑定,以便 Kafka 可以访问凭证。

我们先创建 Secret 对象:

$ cat << EOF | oc create -f -
apiVersion: v1
kind: Secret
metadata:
  name: debezium-secret
  namespace: debezium-example
type: Opaque
data:
  username: ZGViZXppdW0=
  password: ZGJ6
EOF

用户名和密码包含用于连接 MySQL 数据库的 Base64 编码凭据 (debezium/dbz),我们稍后将部署该数据库。

现在,我们可以创建一个角色,它引用上一步中创建的秘密:

$ cat << EOF | oc create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: connector-configuration-role
  namespace: debezium-example
rules:
- apiGroups: [""]
  resources: ["secrets"]
  resourceNames: ["debezium-secret"]
  verbs: ["get"]
EOF

我们还必须将此角色绑定到 Kafka Connect 集群服务帐户,以便 Kafka Connect 可以访问密钥:

$ cat << EOF | oc create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: connector-configuration-role-binding
  namespace: debezium-example
subjects:
- kind: ServiceAccount
  name: debezium-connect-cluster-connect
  namespace: debezium-example
roleRef:
  kind: Role
  name: connector-configuration-role
  apiGroup: rbac.authorization.k8s.io
EOF

一旦我们部署 Kafka Connect,服务帐户将由 Strimzi 创建。服务帐户的名称采用 $KafkaConnectName-connect 形式。稍后,我们将创建名为 debezium-connect-cluster 的 Kafka Connect 集群,因此我们在这里使用 debezium-connect-cluster-connect 作为 subject.name。

四、部署Apache Kafka

接下来,部署一个(单节点)Kafka 集群:

$ cat << EOF | oc create -n debezium-example -f -
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: debezium-cluster
spec:
  kafka:
    replicas: 1
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: tls
      - name: external
        port: 9094
        type: nodeport
        tls: false
    storage:
      type: jbod
      volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
    config:
      offsets.topic.replication.factor: 1
      transaction.state.log.replication.factor: 1
      transaction.state.log.min.isr: 1
      default.replication.factor: 1
      min.insync.replicas: 1
  zookeeper:
    replicas: 1
    storage:
      type: persistent-claim
      size: 100Gi
      deleteClaim: false
  entityOperator:
    topicOperator: {}
    userOperator: {}
EOF

等待它准备好:

oc wait kafka/debezium-cluster --for=condition=Ready --timeout=300s

五、部署数据源

下面将使用MySQL作为数据源。除了使用 MySQL 运行 pod 之外,还需要一个适当的服务来指向带有 DB 本身的 pod。它可以被创建,例如如下:

$ cat << EOF | oc create -f -
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: quay.io/debezium/example-mysql:2.3
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: debezium
        - name: MYSQL_USER
          value: mysqluser
        - name: MYSQL_PASSWORD
          value: mysqlpw
        ports:
        - containerPort: 3306
          name: mysql
EOF

六、部署 Debezium 连接器

要部署 Debezium 连接器,您需要在实例化实际连接器本身之前部署具有所需连接器插件的 Kafka Connect 集群。第一步,必须创建带有插件的 Kafka Connect 容器映像。如果您已经构建了容器镜像并在注册表中可用,则可以跳过此步骤。本文档以MySQL连接器为例。

创建 Kafka Connect 集群

同样,我们将使用 Strimzi 来创建 Kafka Connect 集群。 Strimzi 还可以用于为我们构建和推送所需的容器镜像。事实上,这两个任务可以合并在一起,并且可以直接在 KafkaConnect 对象规范中提供构建容器映像的说明:

$ cat << EOF | oc create -f -
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: debezium-connect-cluster
  annotations:
    strimzi.io/use-connector-resources: "true"
spec:
  version: 3.1.0
  replicas: 1
  bootstrapServers: debezium-cluster-kafka-bootstrap:9092
  config:
    config.providers: secrets
    config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider
    group.id: connect-cluster
    offset.storage.topic: connect-cluster-offsets
    config.storage.topic: connect-cluster-configs
    status.storage.topic: connect-cluster-status
    # -1 means it will use the default replication factor configured in the broker
    config.storage.replication.factor: -1
    offset.storage.replication.factor: -1
    status.storage.replication.factor: -1
  build:
    output:
      type: docker
      image: image-registry.openshift-image-registry.svc:5000/debezium-example/debezium-connect-mysql:latest
    plugins:
      - name: debezium-mysql-connector
        artifacts:
          - type: tgz
            url: https://repo1.maven.org/maven2/io/debezium/debezium-connector-mysql/{debezium-version}/debezium-connector-mysql-{debezium-version}-plugin.tar.gz
EOF

在这里,我们利用了 OpenShift 内置注册表,它已经作为服务在 OpenShift 集群上运行。

为简单起见,我们跳过了下载工件的校验和验证。如果您想确保工件已正确下载,请通过 sha512sum 属性指定其校验和。

如果您在本地或远程注册表(例如 quay.io 或 DockerHub)中已经有合适的容器映像,则可以使用此简化版本:

$ cat << EOF | oc create -f -
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: debezium-connect-cluster
  annotations:
    strimzi.io/use-connector-resources: "true"
spec:
  version: 3.1.0
  image: 10.110.154.103/debezium-connect-mysql:latest
  replicas: 1
  bootstrapServers: debezium-cluster-kafka-bootstrap:9092
  config:
    config.providers: secrets
    config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider
    group.id: connect-cluster
    offset.storage.topic: connect-cluster-offsets
    config.storage.topic: connect-cluster-configs
    status.storage.topic: connect-cluster-status
    # -1 means it will use the default replication factor configured in the broker
    config.storage.replication.factor: -1
    offset.storage.replication.factor: -1
    status.storage.replication.factor: -1
EOF

您还可以注意到,我们已将机密提供程序配置为使用 Strimzi 机密提供程序 Strimzi 机密提供程序将为该 Kafka Connect 集群创建服务帐户(我们已将其绑定到适当的角色),并允许 Kafka Connect 访问我们的 Secret 对象。

在创建 Debezium 连接器之前,请检查所有 pod 是否已在运行:

在这里插入图片描述

七、创建 Debezium 连接器

要创建 Debezium 连接器,您只需创建具有适当配置的 KafkaConnector,在本例中为 MySQL:

$ cat << EOF | oc create -f -
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnector
metadata:
  name: debezium-connector-mysql
  labels:
    strimzi.io/cluster: debezium-connect-cluster
spec:
  class: io.debezium.connector.mysql.MySqlConnector
  tasksMax: 1
  config:
    tasks.max: 1
    database.hostname: mysql
    database.port: 3306
    database.user: ${secrets:debezium-example/debezium-secret:username}
    database.password: ${secrets:debezium-example/debezium-secret:password}
    database.server.id: 184054
    topic.prefix: mysql
    database.include.list: inventory
    schema.history.internal.kafka.bootstrap.servers: debezium-cluster-kafka-bootstrap:9092
    schema.history.internal.kafka.topic: schema-changes.inventory
EOF

您可以注意到,我们在连接器配置中没有使用纯文本用户名和密码,而是引用我们之前创建的 Secret 对象。

八、验证部署

要验证一切正常,您可以例如开始观看 mysql.inventory.customers Kafka 主题:

$ oc run -n debezium-example -it --rm --image=quay.io/debezium/tooling:1.2  --restart=Never watcher -- kcat -b debezium-cluster-kafka-bootstrap:9092 -C -o beginning -t mysql.inventory.customers

连接MySQL数据库:

$ oc run -n debezium-example -it --rm --image=mysql:8.0 --restart=Never --env MYSQL_ROOT_PASSWORD=debezium mysqlterm -- mysql -hmysql -P3306 -uroot -pdebezium

在客户表中做一些更改:

sql> update customers set first_name="Sally Marie" where id=1001;

您现在应该能够观察 Kafka 主题上的更改事件:

{
...
  "payload": {
    "before": {
      "id": 1001,
      "first_name": "Sally",
      "last_name": "Thomas",
      "email": "sally.thomas@acme.com"
    },
    "after": {
      "id": 1001,
      "first_name": "Sally Marie",
      "last_name": "Thomas",
      "email": "sally.thomas@acme.com"
    },
    "source": {
      "version": "{debezium-version}",
      "connector": "mysql",
      "name": "mysql",
      "ts_ms": 1646300467000,
      "snapshot": "false",
      "db": "inventory",
      "sequence": null,
      "table": "customers",
      "server_id": 223344,
      "gtid": null,
      "file": "mysql-bin.000003",
      "pos": 401,
      "row": 0,
      "thread": null,
      "query": null
    },
    "op": "u",
    "ts_ms": 1646300467746,
    "transaction": null
  }
}

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

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

相关文章

【C++技能树】Vector类解析与模拟实现

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我bua&#xff01; Vector 0.Vector简介1.Vector常用接口1.1constructor构造函数1.2 iteratorsort与findfindsort 1.3 Capacity相关接口1.4 Modify相关接口 2. Vector模拟实…

uniapp 微信小程序 placeholder字体、颜色自定义

效果图&#xff1a; 1、template <input type"text" placeholder"搜索标题" placeholder-class"placeholder-style"></input>2、style .placeholder-style{color: #2D94FF; }

python_day13_综合案例

导包准备 from pyspark import SparkConf, SparkContext import os import jsonos.environ["PYSPARK_PYTHON"] "D:/dev/python/python3.10.4/python.exe" conf SparkConf().setMaster("local[*]").setAppName("test_spark") sc Sp…

生命游戏(力扣)思维 JAVA

根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 &…

FreeRTOS源码分析-4 SysTick系统时钟详解

目录 1 SysTick初始化 2 SysTick中断服务函数 3 SysTick任务调度 1 SysTick初始化 初始化流程 配置SysTick装载值使能SysTick时钟源 使能SysTick中断 使能SysTick 其中装载值1ms、10ms、100ms都可以&#xff0c;但是不要小于1ms //main.c //--->osKernelStart(); //--…

vue开源基础框架之岗位管理配置及使用

JVS是面向软件开发团队可以快速实现应用的基础开发脚手架&#xff0c;主要定位于企业信息化通用底座&#xff0c;采用微服务分布式框架&#xff0c;提供丰富的基础功能&#xff0c;集成众多业务引擎&#xff0c;它灵活性强&#xff0c;界面化配置对开发者友好&#xff0c;底层容…

机器视觉:工业自动化和智能化的核心技术

机器视觉作为实现工业自动化和智能化的关键核心技术&#xff0c;是人工智能领域发展最迅速的分支之一。它包括四个关键构件&#xff1a;光源、摄像机、图像采集卡和视觉处理软件&#xff08;集成了AI算法&#xff09;。其中&#xff0c;图像采集卡是工厂自动化中常用的外购组件…

Java多线程基础复习

文章目录 多线程1.进程进程属性并发和并行虚拟地址空间 2.线程概念线程的创建方式 3.Thread类常见构造方法和属性线程的状态优先级后台线程线程是否存活start和run 4. 线程的一些基本操作线程中断(interrupted)线程等待joincurrentThread&#xff08;获取当前线程引用&#xff…

安全开发-JS应用原生开发JQuery库Ajax技术加密编码库断点调试逆向分析元素属性操作

文章目录 JS原生开发-文件上传-变量&对象&函数&事件JS导入库开发-登录验证-JQuery库&Ajax技术JS导入库开发-编码加密-逆向调试 JS原生开发-文件上传-变量&对象&函数&事件 1、布置前端页面 2、JS获取提交数据 3、JS对上传格式判断 <script>…

Spring MVC 详解(2)

目录 3. 返回数据的功能 3.1 返回静态页面 3.2 请求转发 VS 请求重定向 前言 上一篇文章已经介绍了 Spring MVC 框架的两个功能&#xff0c;和前端建立连接的功能和从前端获取参数的功能&#xff0c;还有最后一个功能就是 输出数据的功能。 3. 返回数据的功能 返回的数据大致…

2min搞定 mac pycharm新建导入python项目

mac pycharm新建和导入python项目&虚拟环境配置&下载类库 一、通用设置step1 、通过自定义配置&#xff0c;指定默认虚拟环境变量step2、设置虚拟环境和指定默认工作空间step3 、导入或者新建python项目 二、pycharm新建python项目step1、点击新建【file->newProjec…

appscan 应用

HCL appscan是个常见的web app DAST 扫描工具 有企业版和standalone 版本。大家常用的都是单机版本。企业版平台&#xff0c;集成了IAST。 appscan 使用比较简单&#xff0c;基本输入url 账号密码就开扫了。 用了一段时间几点体验 1 还是需要手动explore的&#xff0c;他自…

ShardingSphere分库分表实战之读写分离原理解析

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

MFC第十九天 记事本项目功能完善和开发、CTabCtrl类与分页模式开发

文章目录 记事本项目功能完善和开发查找界面的记忆功能 、使用F3快捷键自动向下查找功能 的开发单次替换的算法研究 CFileDialog 构造函数详解 应用另存为时选择编码 &#xff08;三种方案&#xff09;vista 样式文件对话框 bVistaStyle 为TRUE时 1pch.hCApp NotePad.cpp 对编码…

《Docker与持续集成/持续部署:构建高效交付流程,打造敏捷软件交付链》

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

【算法基础:搜索与图论】3.5 求最小生成树算法(PrimKruskal)

文章目录 最小生成树介绍朴素Prim算法算法思路⭐例题&#xff1a;858. Prim算法求最小生成树 Kruskal算法算法思路⭐例题&#xff1a;859. Kruskal算法求最小生成树 最小生成树介绍 最小生成树 有关树的定义 生成子图&#xff1a;生成子图是从原图中选取部分节点以及这些节点…

16.喝水

喝水 html部分 <h1>Goal: 2 Liters</h1> <div class"cup cupbig"><div class"remained"><span id"liters">2L</span><small>Remained</small></div><div class"percentage&quo…

欧姆龙cp1h-e串口以太网连接怎么设置欧姆龙CX系列

捷米特JM-ETH-CX串口转以太网通讯处理器是为满足日益增多的工厂设备信息化需求&#xff08;设备网络监控和生产管理&#xff09;而设计&#xff0c;用于欧姆龙 CPM、CQM、C200、C1000、C2000 等多个系列 PLC 的以太网数据采集&#xff0c; 非常方便构建生产管理系统。 捷米特J…

【字符流】案例:文件到集合(改进版)

案例&#xff1a;文件到集合&#xff08;改进版&#xff09; 1.需求&#xff1a; 把文本文件中的数据读取到集合中&#xff0c;并遍历集合。要求&#xff1a;文件中每一行数据是一个学生对象的成员变量值 ​ 举例&#xff1a;001,郝佳乐,20,西安 2.思路&#xff1a; 定义学…

Vue第六篇:电商网站图片放大镜功能

本文参考&#xff1a;https://blog.csdn.net/liushi21/article/details/127497487 效果如下&#xff1a; 功能实现分解如下&#xff1a; &#xff08;1&#xff09;商品图区域&#xff1a;主要是浏览图片&#xff0c;根据图片的url显示图片。当鼠标离开此区域时"放大镜区…