在OpenShift开云体育官方注册网址上部署Debezium

这个过程是设置Debezium连接器在红帽的开云体育官方注册网址OpenShift集装箱平台。对于OpenShift上的开发或测试,您可以使用CodeRady容器

要更快地开始,请尝试开云体育官方注册网址Debezium在线学习场景.它为您启动了一个OpenShift集群,这让您可以在几分钟内开始在浏览器中使用Debezium。开云体育官方注册网址

先决条件

为了保持容器与集群上的其他工作负载分离,可以为Debezium创建一个专用项目。开云体育官方注册网址在本文档的其余部分中,开云体育官方注册网址debezium-example命名空间将被使用:

新建项目debezium-exam开云体育官方注册网址ple

部署Strimzi操作符

对于Debezi开云体育官方注册网址um部署,我们将使用Strimzi项目,管理Kafka在OpenShift集群上的部署。安装Strimzi最简单的方法是安装Strimzi操作符OperatorHub.在OpenShift UI中导航到“OperatorHub”选项卡,选择“Strimzi”并点击“安装”按钮。

Openshift strimzi运算符

如果你更喜欢命令行工具,你也可以用这种方式安装Strimzi操作符:

$ cat << EOF | oc create -f - apiVersion: operators.coreos.com/v1alpha1 kind:订阅元数据:name: my-strimzi-kafka-operator namespace: openshift-operators spec: channel: stable name: strimzi-kafka-operator source: operatorhubio-catalog sourceNamespace: olm EOF

为数据库创建秘密开云体育电动老虎机

稍后,在部署Debezium Kafka连接器时,开云体育官方注册网址我们将需要为连接器提供用户名和密码,以便能够连接到数据库。开云体育电动老虎机出于安全原因,最好不要直接提供凭据,而是将它们保存在单独的安全位置。OpenShift提供秘密对象用于此目的。除了创建秘密对象本身,我们还必须创建一个角色和角色绑定,以便Kafka可以访问凭据。

让我们创建秘密对象:

$ cat << EOF | oc create -f - apiVersion: v1 kind: Secret metadata: name: 开云体育官方注册网址debezu - Secret namespace: debezu -example type: Opaque data: username: ZGViZXppdW0= password: ZGJ6 EOF . user: ZGViZXppdW0

用户名而且密码包含base64编码的凭证(开云体育官方注册网址/dbz)用于连接到MySQL数据库,我们将在后面部署。开云体育电动老虎机

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

$ cat << EOF | oc create -f - apiVersion: rbac.authorization.k8s。io/v1 kind:角色元数据:name: connector-configuration-role namespace: debeium -e开云体育官方注册网址xample rules:—apiGroups: ["" "] resources: ["secrets"] resourceNames: [" debeium -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美元.稍后,我们将创建Kafka Connect集群开云体育官方注册网址debezium-connect-cluster因此我们使用开云体育官方注册网址debezium-connect-cluster-connect这里作为subjects.name

部署Apache Kafka

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

$ cat << EOF | oc create -n 开云体育官方注册网址debezum -example -f - apiVersion: kafka.strimzi. exeio / v1beta2:卡夫卡元数据:名称:debezium-cluster开云体育官方注册网址规范:卡夫卡:副本:1听众:-名称:普通端口:9092类型:内部tls:错:名称:tls端口:9093类型:内部tls:真正的身份验证:类型:tls -名称:外部端口:9094类型:nodeport tls:错误的存储:类型:文件卷:- id: 0类型:persistent-claim大小:100 gi deleteClaim:错误的配置: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:持久化-claim size: 100Gi deletecclaim: false entityOperator: topicOperator: {} userOperator: {} EOF
  • 等到它准备好了:

$ oc wait kafka/开云体育官方注册网址 debian -cluster——for=condition=Ready——timeout=300s

部署数据源

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

$ cat << EOF | oc create -f - apiVersion: v1 kind:服务元数据:name: mysql spec: ports: - port: 3306 selector: app: mysql clusterIP: None——apiVersion: apps/v1 kind:部署元数据:name: mysql spec: selector: matchLabels: app: mysql strategy: type:重建模板:元数据:labels: app: mysql spec: containers: - image: queue .io/debezium/example-mysql:2.1 name: mysql env: - name:开云体育官方注册网址 MYSQL_ROOT_PASSWORD值:debezium - name: MYSQL_USER值:mysqluser - name: MYSQL_PASSWORD值:debeziummysqlpw ports:—containerPort: 3306 name: mysql EOF

部署Debezium连接开云体育官方注册网址器

要部署Debezium连开云体育官方注册网址接器,在实例化实际连接器本身之前,您需要部署一个Kafka Connect集群,其中包含所需的连接器插件。作为第一步,必须为Kafka Connect创建一个带有插件的容器映像。如果已经构建了容器映像,并且在注册表中可用,则可以跳过此步骤。本文以MySQL连接器为例进行说明。

创建Kafka连接集群

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

$ cat << EOF | oc create -f - apiVersion: kafka.strimzi。io/v1beta2 kind: KafkaConnect元数据:name: debezu 开云体育官方注册网址-connect-cluster注释:strimzi。io/use-connector-resources: "true" spec: version: 3.1.0 replicas: 1 bootstrapServers: 开云体育官方注册网址debezum -cluster-kafka-bootstrap:9092 config: config。config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider组。Id: connect-cluster offset.storage.topic: connect-cluster-offset config.storage.topic: connect-cluster-configs status.storage.topic: connect-cluster-status # -1表示它将使用代理中配置的默认复制因子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/开云体育官方注册网址 debezu -example/ debezu -connect-mysql:latest plugins:—name: debezu -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属性。看到Strimzi文档欲知详情。

如果您已经在本地或远程注册中心(如quay。io或DockerHub),你可以使用这个简化版本:

$ cat << EOF | oc create -f - apiVersion: kafka.strimzi。io/v1beta2 kind: KafkaConnect元数据:name: debezu 开云体育官方注册网址-connect-cluster注释:strimzi。io/use-connector-resources: "true" spec: version: 3.1.0 image: 10.110.154.103/开云体育官方注册网址 debian -connect-mysql:latest replicas: 1 bootstrapServers: debian -cluster-kafka-bootstrap:9092 config: config. execonfig.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider组。id: connect-cluster offset.storage.topic: connect-cluster-offset config.storage.topic: connect-cluster-configs status.storage.topic: connect-cluster-status # -1表示它将使用代理中配置的默认复制因子

你也可以注意到,我们已经配置了秘密提供者使用Strimzi秘密提供者Strimzi秘密提供者将为这个Kafka Connect集群创建服务帐户(并且我们已经绑定到适当的角色),并允许Kafka Connect访问我们的秘密对象。

在创建Debezium连接器之前,检开云体育官方注册网址查所有pod都已经在运行:

openshift豆荚

创建Debezium连开云体育官方注册网址接器

要创建Debezium连开云体育官方注册网址接器,只需要创建一个KafkaConnector使用适当的配置,MySQL在这种情况下:

$ cat << EOF | oc create -f - apiVersion: kafka.strimzi。io/v1beta2 kind: KafkaConnector元数据:name: debezu 开云体育官方注册网址-connector-mysql labels: strimzi。io. debezu .开云体育官方注册网址connector.mysql. mysqlconnector tasksMax: 1配置:任务。最大值:1个数开云体育电动老虎机据库。主机名:mysql数据库。开云体育电动老虎机端口:3306数据库。开云体育电动老虎机用户:${secrets:deb开云体育官方注册网址ezium-example/debezium-secret:use开云体育电动老虎机rname}数据库。密码: ${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

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

验证部署结果

为了验证一切正常,你可以开始观看mysql.inventory.customers卡夫卡的话题:

$ oc run -n 开云体育官方注册网址debezium-example -it——rm——image=quay.io/debezium/ tools: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": "{debezi开云体育官方注册网址e -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}}

如果您有任何关于在Kubernetes或OpenShift上运行Debezium的问题或请求,请在我们的开云体育官方注册网址用户组或者在Debeziu开云体育官方注册网址m开发人员的聊天