Debezium发布历史03

原文地址: https://debezium.io/blog/2016/05/31/Debezium-on-Kubernetes/

Debezium on Kubernetes
May 31, 2016 by Christian Posta
发布 mysql docker

更新(2019 年 10 月 11 日):在 Kubernetes 上运行 Debezium(以及一般的 Apache Kafka 和 Kafka Connect)的另一种更简单的方法是使用 K8s 运算符,例如Strimzi。您可以在此处找到在 OpenShift 上设置 Debezium 的说明,类似的步骤适用于普通 Kubernetes。

我们的Debezium 教程通过安装、启动和链接在单个主机上运行的所有 Docker 容器,逐步引导您使用 Debezium。当然,您可以使用 Docker Compose 或您自己的脚本之类的东西来使这变得更容易,尽管这只是在一台机器上自动运行所有容器。您真正想要的是在机器集群上运行容器。在本博客中,我们将使用 Red Hat 和 Google 的容器集群管理器Kubernetes来运行 Debezium 。

Kubernetes是一个容器(Docker/Rocket/Hyper.sh)集群管理工具。与许多其他流行的集群管理和计算资源调度平台一样,Kubernetes 的根源在于 Google,而 Google 对大规模运行容器并不陌生。他们每周启动、停止和集群20 亿个容器,他们贡献了大量 Linux 内核基础,使容器成为可能。他们的一篇著名论文谈到了一位名叫 Borg 的内部集群管理器。有了 Kubernetes,Google 厌倦了每个人都用 Java 实现他们的论文,所以他们决定自己实现这个:)

Kubernetes 是用 Go-lang 编写的,并且正在迅速成为大规模调度、管理和集群容器的事实上的 API。本博客无意作为 Kubernetes 的入门读物,因此我们建议您转到入门文档以了解有关 Kubernetes 的更多信息。

入门
首先,我们需要访问 Kubernetes 集群。入门非常简单:只需遵循入门指南即可。我们最喜欢的是OpenShift 的全合一虚拟机或红帽容器开发套件,它们提供了强化的、可用于生产的 Kubernetes 发行版。安装并登录后,您应该能够运行kubectl get pod以获取可能正在运行的 Kubernetes Pod 的列表。您不需要在 Kubernetes 内运行任何其他内容即可开始使用。

要获取并构建 Kubernetes 清单文件(yaml 描述符),请克隆Debezium Kubernetes存储库并运行以下命令:

$ mvn clean
$ mvn install
该项目使用很棒的Fabric8 Maven 插件自动生成 Kubernetes 清单文件。这是生成的示例$PROJECT_ROOT/zk-standalone/target/classes/kubernetes.yml

apiVersion: "v1"
items:
- apiVersion: "v1"
  kind: "Service"
  metadata:
    annotations: {}
    labels:
      project: "zookeeper"
      provider: "debezium"
      version: "0.1-SNAPSHOT"
      group: "io.debezium"
    name: "zookeeper"
  spec:
    deprecatedPublicIPs: []
    externalIPs: []
    ports:
    - port: 2181
      protocol: "TCP"
      targetPort: 2181
    selector:
      project: "zookeeper"
      provider: "debezium"
      group: "io.debezium"
- apiVersion: "v1"
  kind: "ReplicationController"
  metadata:
    annotations:
      fabric8.io/git-branch: "master"
      fabric8.io/git-commit: "004e222462749fbaf12c3ee33edca9b077ee9003"
    labels:
      project: "zookeeper"
      provider: "debezium"
      version: "0.1-SNAPSHOT"
      group: "io.debezium"
    name: "zk-standalone"
  spec:
    replicas: 1
    selector:
      project: "zookeeper"
      provider: "debezium"
      version: "0.1-SNAPSHOT"
      group: "io.debezium"
    template:
      metadata:
        annotations: {}
        labels:
          project: "zookeeper"
          provider: "debezium"
          version: "0.1-SNAPSHOT"
          group: "io.debezium"
      spec:
        containers:
        - args: []
          command: []
          env:
          - name: "KUBERNETES_NAMESPACE"
            valueFrom:
              fieldRef:
                fieldPath: "metadata.namespace"
          image: "docker.io/debezium/zookeeper:0.1"
          imagePullPolicy: "IfNotPresent"
          name: "zk-standalone"
          ports:
          - containerPort: 3888
            name: "election"
          - containerPort: 2888
            name: "peer"
          - containerPort: 2181
            name: "client"
          securityContext: {}
          volumeMounts: []
        imagePullSecrets: []
        nodeSelector: {}
        volumes: []
kind: "List"

在 Kubernetes 上启动 Zookeeper 和 Kafka
要在 Kubernetes 中启动Apache Zookeeper或Apache Kafka,您有两种选择。如果您的计算机上有kubectl命令行(或ocOpenShift 客户端发行版中的工具),您可以应用任何新生成的 Kubernetes 清单文件,如下所示:

$ kubectl create -f
或者您可以使用 Fabric8 Maven 插件及其fabric8:apply目标来应用清单文件。请注意,要使这两个选项中的任何一个起作用,您当前必须登录到 Kubernetes 集群。(此外,OpenShiftoc login 使这变得超级简单,或者请参阅使用 kubectl 登录 Kubernetes 集群以获取更多信息。)

首先,让我们将 Zookeeper 部署到 Kubernetes 集群。我们需要进入$PROJECT_ROOT/zk-standalone目录,然后应用 Kubernetes 配置。首先,让我们看看如何使用kubectl命令来执行此操作:

$ cd zk-standalone
$ kubectl create -f target/classes/kubernetes.yml

service “zookeeper” created
replicationcontroller “zk-standalone” created
您可以使用 Maven 和 Fabric8 maven 插件执行相同的操作:

$ cd zk-standalone
$ mvn fabric8:apply

Java HotSpot™ 64-Bit Server VM warning: ignoring option MaxPermSize=1512m; support was removed in 8.0
[INFO] Scanning for projects…
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building zk-standalone 0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] — fabric8-maven-plugin:2.2.115:apply (default-cli) @ zk-standalone —
[INFO] Using kubernetes at: https://172.28.128.4:8443/ in namespace ticket
[INFO] Kubernetes JSON: /Users/ceposta/dev/idea-workspace/dbz/debezium-kubernetes/zk-standalone/target/classes/kubernetes.json
[INFO] OpenShift platform detected
[INFO] Using namespace: ticket
[INFO] Looking at repo with directory /Users/ceposta/dev/idea-workspace/dbz/debezium-kubernetes/.git
[INFO] Creating a Service from kubernetes.json namespace ticket name zookeeper
[INFO] Created Service: zk-standalone/target/fabric8/applyJson/ticket/service-zookeeper.json
[INFO] Creating a ReplicationController from kubernetes.json namespace ticket name zk-standalone
[INFO] Created ReplicationController: zk-standalone/target/fabric8/applyJson/ticket/replicationcontroller-zk-standalone.json
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.661 s
[INFO] Finished at: 2016-05-19T15:59:26-07:00
[INFO] Final Memory: 26M/260M
[INFO] ------------------------------------------------------------------------
Zookeeper已经部署完毕,我们继续部署Kafka。导航到$PROJECT_ROOT/kafka,然后应用 Kafka 部署配置:

$ cd …/kafka
$ kubectl create -f target/classes/kubernetes.yml

service “kafka” created
replicationcontroller “kafka” created
或者使用fabric8 maven插件:

$ cd …/kafka
$ mvn fabric8:apply

Java HotSpot™ 64-Bit Server VM warning: ignoring option MaxPermSize=1512m; support was removed in 8.0
[INFO] Scanning for projects…
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building kafka 0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] — fabric8-maven-plugin:2.2.115:apply (default-cli) @ kafka —
[INFO] Using kubernetes at: https://172.28.128.4:8443/ in namespace ticket
[INFO] Kubernetes JSON: /Users/ceposta/dev/idea-workspace/dbz/debezium-kubernetes/kafka/target/classes/kubernetes.json
[INFO] OpenShift platform detected
[INFO] Using namespace: ticket
[INFO] Looking at repo with directory /Users/ceposta/dev/idea-workspace/dbz/debezium-kubernetes/.git
[INFO] Creating a Service from kubernetes.json namespace ticket name kafka
[INFO] Created Service: kafka/target/fabric8/applyJson/ticket/service-kafka.json
[INFO] Creating a ReplicationController from kubernetes.json namespace ticket name kafka
[INFO] Created ReplicationController: kafka/target/fabric8/applyJson/ticket/replicationcontroller-kafka.json
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.563 s
[INFO] Finished at: 2016-05-19T16:03:25-07:00
[INFO] Final Memory: 26M/259M
[INFO] ------------------------------------------------------------------------
使用kubectl get pod命令查看正在运行的内容:

$ kubectl get pod

NAME READY STATUS RESTARTS AGE
kafka-mqmxt 1/1 Running 0 46s
zk-standalone-4mo02 1/1 Running 0 4m
您是否注意到我们在启动容器时没有手动“链接”容器?Kubernetes 有一个名为Kubernetes Services 的集群服务发现功能,它可以进行负载平衡,并允许我们使用内部 DNS(或集群 IP)来发现 Pod。例如,在kubernetes.ymlKafka 的部署配置中,您将看到以下内容:

  ...
    containers:
    - args: []
      command: []
      env:
      - name: "KAFKA_ADVERTISED_PORT"
        value: "9092"
      - name: "KAFKA_ADVERTISED_HOST_NAME"
        value: "kafka"
      - name: "KAFKA_ZOOKEEPER_CONNECT"
        value: "zookeeper:2181"
      - name: "KAFKA_PORT"
        value: "9092"
      - name: "KUBERNETES_NAMESPACE"
        valueFrom:
          fieldRef:
            fieldPath: "metadata.namespace"
      image: "docker.io/debezium/kafka:0.1"
      imagePullPolicy: "IfNotPresent"
      name: "kafka"
    ...

我们为KAFKA_ZOOKEEPER_CONNECTDocker 镜像使用的环境变量指定值,从而使 Kafka 能够发现 Zookeeper Pod,无论它们在哪里运行。尽管我们可以使用任何主机名,但为了简单起见,我们仅使用zookeeperDNS 名称。因此,如果您要登录其中一个 pod 并尝试访问名为 的主机zookeeper,Kubernetes 会将该请求透明地解析到 Zookeeper pod 之一(如果有多个)。光滑!这种发现机制也用于其余组件。(注意,DNS永远不会解析此集群 IP无论给定服务存在多少个 Pod,Kubernetes 服务的生命周期都会发生变化。这意味着您可以依赖此服务发现,而不会遇到所有可能遇到的 DNS 缓存问题。)

下一步是创建schema-changesDebezium 的 MySQL 连接器将使用的主题。让我们使用 Kafka 工具来创建它:

$ KAFKA_POD_NAME=$(kubectl get pod | grep -i running | grep kafka | awk ‘{ print $1 }’)

$ kubectl exec K A F K A P O D N A M E − − / k a f k a / b i n / k a f k a − t o p i c s . s h − − c r e a t e − − z o o k e e p e r z o o k e e p e r : 2181 − − r e p l i c a t i o n − f a c t o r 1 − − p a r t i t i o n s 1 − − t o p i c s c h e m a − c h a n g e s . i n v e n t o r y 在 K u b e r n e t e s 上启动 M y S Q L 数据库启动 M y S Q L 数据库遵循与安装 Z o o k e e p e r 或 K a f k a 相同的说明。我们将导航到该 KAFKA_POD_NAME -- /kafka/bin/kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic schema-changes.inventory 在 Kubernetes 上启动 MySQL 数据库 启动 MySQL 数据库遵循与安装 Zookeeper 或 Kafka 相同的说明。我们将导航到该 KAFKAPODNAME/kafka/bin/kafkatopics.shcreatezookeeperzookeeper:2181replicationfactor1partitions1topicschemachanges.inventoryKubernetes上启动MySQL数据库启动MySQL数据库遵循与安装ZookeeperKafka相同的说明。我们将导航到该PROJECT_ROOT/mysql56目录,并使用MySQL 5.6 OpenShift Docker 映像,以便它可以在 vanilla Kubernetes 和 OpenShift v3.x 上运行。这是kubectl启动 MySQL 实例的命令:

$ cd …/mysql56
$ kubectl create -f target/classes/kubernetes.yml

service “mysql” created
replicationcontroller “mysql56” created
或者等效的 Maven 命令:

$ cd mysql56
$ mvn fabric8:apply
现在,当我们运行时,kubectl get pod我们应该看到 MySQL 数据库也在运行:

名称就绪状态重新开始年龄
kafka-mqmxt 1/1 运行 0 17m
mysql56-b4f36 1/1 运行 0 9m
zk-standalone-4mo02 1/1 运行 0 21m
让我们运行一个命令来获取客户端对数据库的访问权限。首先,将一些环境变量设置为 pod 的名称和 IP 地址:

$ MYSQL_POD_NAME=$(kubectl get pod | grep Running | grep ^mysql | awk ‘{ print $1 }’)
$ MYSQL_POD_IP=$(kubectl describe pod $MYSQL_POD_NAME | grep IP | awk ‘{ print $2 }’)
然后,登录运行 MySQL 数据库的 Kubernetes pod,并启动 MySQL 命令客户端:

$ kubectl exec -it M Y S Q L P O D N A M E − − / o p t / r h / r h − m y s q l 56 / r o o t / u s r / b i n / m y s q l − h MYSQL_POD_NAME -- /opt/rh/rh-mysql56/root/usr/bin/mysql -h MYSQLPODNAME/opt/rh/rhmysql56/root/usr/bin/mysqlhMYSQL_POD_IP -P3306 -uroot -padmin
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright © 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>
这表明kubectl命令行可以让我们轻松访问 pod 或 Docker 容器,无论它在集群中的哪个位置运行。

接下来,退出 mysql shell(键入exit)并运行以下命令来下载填充示例数据库的SQL 脚本inventory:

$ kubectl exec -it M Y S Q L P O D N A M E − − b a s h − c " c u r l − s − L h t t p s : / / g i s t . g i t h u b . c o m / c h r i s t i a n − p o s t a / e 20 d d b 5 c 945845 b 4 b 9 f 6 e b a 94 a 98 a f 09 / r a w ∣ / o p t / r h / r h − m y s q l 56 / r o o t / u s r / b i n / m y s q l − h MYSQL_POD_NAME -- bash -c "curl -s -L https://gist.github.com/christian-posta/e20ddb5c945845b4b9f6eba94a98af09/raw | /opt/rh/rh-mysql56/root/usr/bin/mysql -h MYSQLPODNAMEbashc"curlsLhttps://gist.github.com/christianposta/e20ddb5c945845b4b9f6eba94a98af09/raw∣/opt/rh/rhmysql56/root/usr/bin/mysqlhMYSQL_POD_IP -P3306 -uroot -padmin"
现在,如果我们重新登录 MySQL pod,我们可以显示数据库和表:

$ kubectl exec -it M Y S Q L P O D N A M E − − / o p t / r h / r h − m y s q l 56 / r o o t / u s r / b i n / m y s q l − h MYSQL_POD_NAME -- /opt/rh/rh-mysql56/root/usr/bin/mysql -h MYSQLPODNAME/opt/rh/rhmysql56/root/usr/bin/mysqlhMYSQL_POD_IP -P3306 -uroot -padmin -e ‘use inventory; show tables;’

±--------------------+
| Tables_in_inventory |
±--------------------+
| customers |
| orders |
| products |
| products_on_hand |
±--------------------+
4 rows in set (0.00 sec)
启动 Kafka Connect 和 Debezium
导航到目录$PROJECT_ROOT/connect-mysql目录。在这里,我们将启动一个 Kubernetes pod,该 pod 运行 Kafka Connect,并已安装 Debezium MySQL 连接器。Debezium MySQL 连接器连接到 MySQL 数据库,读取二进制日志,并将这些行事件写入 Kafka。与之前的组件类似,在 Kubernetes 上启动 Kafka Connect 和 Debezium:

$ cd …/connect-mysql
$ kubectl create -f target/classes/kubernetes.yml

service “connect-mysql” created
replicationcontroller “connect-mysql” created
或者使用fabric8 maven插件:

$ cd …/connect-mysql
$ mvn fabric8:apply
Java HotSpot™ 64-Bit Server VM warning: ignoring option MaxPermSize=1512m; support was removed in 8.0
[INFO] Scanning for projects…
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building connect-mysql 0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] — fabric8-maven-plugin:2.2.115:apply (default-cli) @ connect-mysql —
[INFO] Using kubernetes at: https://172.28.128.4:8443/ in namespace ticket
[INFO] Kubernetes JSON: /Users/ceposta/dev/idea-workspace/dbz/debezium-kubernetes/connect-mysql/target/classes/kubernetes.json
[INFO] OpenShift platform detected
[INFO] Using namespace: ticket
[INFO] Looking at repo with directory /Users/ceposta/dev/idea-workspace/dbz/debezium-kubernetes/.git
[INFO] Creating a Service from kubernetes.json namespace ticket name connect-mysql
[INFO] Created Service: connect-mysql/target/fabric8/applyJson/ticket/service-connect-mysql.json
[INFO] Creating a ReplicationController from kubernetes.json namespace ticket name connect-mysql
[INFO] Created ReplicationController: connect-mysql/target/fabric8/applyJson/ticket/replicationcontroller-connect-mysql.json
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.255 s
[INFO] Finished at: 2016-05-25T09:21:04-07:00
[INFO] Final Memory: 27M/313M
[INFO] ------------------------------------------------------------------------
就像 Debezium 的 Docker 教程一样,我们现在想要将 JSON 对象发送到 Kafka Connect API 以启动 Debezium 连接器。首先,我们需要公开 Kafka Connect 集群的 API。您可以按照自己的意愿执行此操作:在 Kubernetes(Ingress 定义、NodePort 服务等)或 OpenShift 上,您可以使用OpenShift Routes。对于这个简单的示例,我们将使用简单的 Pod 端口转发将connect-mysqlpod 的8083端口转发到我们的本地计算机(同样,无论 Pod 实际在何处运行集群。(这是 Kubernetes 的一个令人难以置信的功能,使它如此轻松开发分布式服务!)

让我们确定 pod 名称,然后使用端口转发到我们的本地计算机:

$ CONNECT_POD_NAME=$(kubectl get pod | grep -i running | grep ^connect | awk ‘{ print $1 }’)
$ kubectl port-forward $CONNECT_POD_NAME 8083:8083

I0525 09:30:08.390491 6651 portforward.go:213] Forwarding from 127.0.0.1:8083 -> 8083
I0525 09:30:08.390631 6651 portforward.go:213] Forwarding from [::1]:8083 -> 8083
我们正在将 pod 的端口转发8083到本地机器的8083. 现在,如果我们点击http://localhost:8083它将被定向到运行我们的 Kafka Connect 和 Debezium 服务的 Pod。

由于查看 pod 的输出以了解是否存在任何异常可能很有用,因此启动另一个终端并键入以下内容以跟踪 Kafka Connect 输出:

$ CONNECT_POD_NAME=$(kubectl get pod | grep -i running | grep ^connect | awk ‘{ print $1 }’)
$ kubectl logs -f $CONNECT_POD_NAME
现在,让我们使用 HTTP 客户端将 Debezium 连接器/任务发布到我们刚刚在本地公开的端点:

curl -i -X POST -H “Accept:application/json” -H “Content-Type:application/json” http://localhost:8083/connectors/ -d ‘{ “name”: “inventory-connector”, “config”: { “connector.class”: “io.debezium.connector.mysql.MySqlConnector”, “tasks.max”: “1”, “database.hostname”: “mysql”, “database.port”: “3306”, “database.user”: “replicator”, “database.password”: “replpass”, “database.server.id”: “184054”, “database.server.name”: “mysql-server-1”, “database.binlog”: “mysql-bin.000001”, “database.whitelist”: “inventory”, “database.history.kafka.bootstrap.servers”: “kafka:9092”, “database.history.kafka.topic”: “schema-changes.inventory” } }’
如果我们观察connect-mysqlpod 的日志输出,我们会看到它最终看起来像这样:

2016-05-27 18:50:14,580 - 警告 [kafka-生产者-网络线程 | Producer-1:NetworkClient D e f a u l t M e t a d a t a U p d a t e r @ 582 ] − 获取相关 I D 为 2 的元数据时出错: m y s q l − s e r v e r − 1. i n v e n t o r y . p r o d u c t s = L E A D E R N O T A V A I L A B L E 2016 − 05 − 2718 : 50 : 14 , 690 − 警告 [ k a f k a − 生产者 − 网络线程 ∣ P r o d u c e r − 1 : N e t w o r k C l i e n t DefaultMetadataUpdater@582] - 获取相关 ID 为 2 的元数据时出错:{mysql-server-1.inventory.products=LEADER_NOT_AVAILABLE} 2016-05-27 18:50:14,690 - 警告 [kafka-生产者-网络线程 | Producer-1:NetworkClient DefaultMetadataUpdater@582]获取相关ID2的元数据时出错:mysqlserver1.inventory.products=LEADERNOTAVAILABLE2016052718:50:14,690警告[kafka生产者网络线程Producer1:NetworkClientDefaultMetadataUpdater@582] - 获取相关 ID 为 3 的元数据时出错:{mysql-server-1.inventory.products=LEADER_NOT_AVAILABLE}
2016-05-27 18:50:14,911 - 警告 [kafka-生产者-网络线程 | Producer-1:NetworkClient D e f a u l t M e t a d a t a U p d a t e r @ 582 ] − 获取相关 I D 为 7 的元数据时出错: m y s q l − s e r v e r − 1. i n v e n t o r y . p r o d u c t s o n h a n d = L E A D E R N O T A V A I L A B L E 2016 − 05 − 2718 : 50 : 15 , 136 − 警告 [ k a f k a − 生产者 − 网络线程 ∣ P r o d u c e r − 1 : N e t w o r k C l i e n t DefaultMetadataUpdater@582] - 获取相关 ID 为 7 的元数据时出错:{mysql-server-1.inventory.products_on_hand=LEADER_NOT_AVAILABLE} 2016-05-27 18:50:15,136 - 警告 [kafka-生产者-网络线程 | Producer-1:NetworkClient DefaultMetadataUpdater@582]获取相关ID7的元数据时出错:mysqlserver1.inventory.productsonhand=LEADERNOTAVAILABLE2016052718:50:15,136警告[kafka生产者网络线程Producer1:NetworkClientDefaultMetadataUpdater@582] - 获取相关 ID 为 10 的元数据时出错:{mysql-server-1.inventory.customers=LEADER_NOT_AVAILABLE}
2016-05-27 18:50:15,362 - 警告 [kafka-生产者-网络线程 | Producer-1:NetworkClient$DefaultMetadataUpdater@582] - 获取相关 ID 为 13 的元数据时出错:{mysql-server-1.inventory.orders=LEADER_NOT_AVAILABLE}
这些错误只是 Kafka 告诉我们主题不存在但已创建的方式。

如果我们现在在 Kafka 中列出我们的主题,我们应该会看到 mysqlinventory数据库中每个表的 Kafka 主题:

$ kubectl exec $KAFKA_POD_NAME – /kafka/bin/kafka-topics.sh --list --zookeeper zookeeper:2181
__consumer_offsets
my-connect-configs
my-connect-offsets
mysql-server-1.inventory.customers
mysql-server-1.inventory.orders
mysql-server-1.inventory.products
mysql-server-1.inventory.products_on_hand
schema-changes.inventory
让我们看一下其中一个主题的内容:

$ kubectl exec $KAFKA_POD_NAME – /kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --new-consumer --topic mysql-server-1.inventory.customers --from-beginning --property print.key=true
{“schema”:{“type”:“struct”,“fields”:[{“type”:“int32”,“optional”:false,“field”:“id”}],“optional”:false,“name”:“inventory.customers/pk”},“payload”:{“id”:1001}} {“schema”:{“type”:“struct”,“fields”:[{“type”:“int32”,“optional”:false,“field”:“id”},{“type”:“string”,“optional”:false,“field”:“first_name”},{“type”:“string”,“optional”:false,“field”:“last_name”},{“type”:“string”,“optional”:false,“field”:“email”}],“optional”:false,“name”:“inventory.customers”},“payload”:{“id”:1001,“first_name”:“Sally”,“last_name”:“Thomas”,“email”:“[email protected]”}}
{“schema”:{“type”:“struct”,“fields”:[{“type”:“int32”,“optional”:false,“field”:“id”}],“optional”:false,“name”:“inventory.customers/pk”},“payload”:{“id”:1002}} {“schema”:{“type”:“struct”,“fields”:[{“type”:“int32”,“optional”:false,“field”:“id”},{“type”:“string”,“optional”:false,“field”:“first_name”},{“type”:“string”,“optional”:false,“field”:“last_name”},{“type”:“string”,“optional”:false,“field”:“email”}],“optional”:false,“name”:“inventory.customers”},“payload”:{“id”:1002,“first_name”:“George”,“last_name”:“Bailey”,“email”:“[email protected]”}}
{“schema”:{“type”:“struct”,“fields”:[{“type”:“int32”,“optional”:false,“field”:“id”}],“optional”:false,“name”:“inventory.customers/pk”},“payload”:{“id”:1003}} {“schema”:{“type”:“struct”,“fields”:[{“type”:“int32”,“optional”:false,“field”:“id”},{“type”:“string”,“optional”:false,“field”:“first_name”},{“type”:“string”,“optional”:false,“field”:“last_name”},{“type”:“string”,“optional”:false,“field”:“email”}],“optional”:false,“name”:“inventory.customers”},“payload”:{“id”:1003,“first_name”:“Edward”,“last_name”:“Walker”,“email”:“[email protected]”}}
{“schema”:{“type”:“struct”,“fields”:[{“type”:“int32”,“optional”:false,“field”:“id”}],“optional”:false,“name”:“inventory.customers/pk”},“payload”:{“id”:1004}} {“schema”:{“type”:“struct”,“fields”:[{“type”:“int32”,“optional”:false,“field”:“id”},{“type”:“string”,“optional”:false,“field”:“first_name”},{“type”:“string”,“optional”:false,“field”:“last_name”},{“type”:“string”,“optional”:false,“field”:“email”}],“optional”:false,“name”:“inventory.customers”},“payload”:{“id”:1004,“first_name”:“Anne”,“last_name”:“Kretchmar”,“email”:“[email protected]”}}
发生了什么?当我们启动 Debezium 的 MySQL 连接器时,它开始从 MySQL 服务器读取二进制复制日志,并重播所有历史记录并为每个 INSERT、UPDATE 和 DELETE 操作生成一个事件(尽管在我们的示例数据库中我们只有inventoryINSERT) 。如果我们或某些客户端应用程序要向数据库提交其他更改,Debezium 会立即看到这些更改并将其写入正确的主题。换句话说,Debezium 将 MySQL 数据库的所有更改记录为 Kafka 主题中的事件!从那里,任何工具、连接器或服务都可以独立地使用来自 Kafka 的事件流并对其进行处理或将它们放入不同的数据库、Hadoop、elasticsearch、数据网格等中。

清理
如果您想删除连接器,只需发出 REST 请求即可将其删除:

curl -i -X DELETE -H “Accept:application/json” http://localhost:8083/connectors/inventory-connector

你可能感兴趣的:(debezium,CDC,FlinkCDC,数据库,大数据,java)