Debezium 的容器镜像结构得到了巨大的改进,最近,使得扩展其行为变得非常简单。

这是一个小型教程,展示了如何例如添加 Sentry,“一个开源错误跟踪 [软件],帮助开发人员实时监控和修复崩溃”。这里我们将使用它来收集和报告 Kafka Connect 及其连接器的任何异常。请注意,这仅适用于 Debezium 0.9+。

我们需要一些东西来使 Sentry 工作,我们将添加所有这些,然后有一个 Dockerfile 来正确地将它们组合在一起

  • 配置 Log4j

  • sentry.io 的 SSL 证书,因为它默认不在 JVM 受信任链中

  • sentrysentry-log4j

Log4j 配置

让我们创建文件 config/log4j.properties 在本地项目中,它是 Debezium 镜像中附带文件的副本,然后添加 Sentry。请注意,我们将 Sentry 添加到了 log4j.rootLogger 中,并创建了 log4j.appender.Sentry 部分,其余部分与原始配置相同。

kafka.logs.dir=logs

log4j.rootLogger=INFO, stdout, appender, Sentry

# Disable excessive reflection warnings - KAFKA-5229
log4j.logger.org.reflections=ERROR

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold=INFO
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %-5p  %X{dbz.connectorType}|%X{dbz.connectorName}|%X{dbz.connectorContext}  %m   [%c]%n

log4j.appender.appender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.appender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.appender.File=${kafka.logs.dir}/connect-service.log
log4j.appender.appender.layout=org.apache.log4j.PatternLayout
log4j.appender.appender.layout.ConversionPattern=%d{ISO8601} %-5p  %X{dbz.connectorType}|%X{dbz.connectorName}|%X{dbz.connectorContext}  %m   [%c]%n

log4j.appender.Sentry=io.sentry.log4j.SentryAppender
log4j.appender.Sentry.threshold=WARN

Sentry.io SSL 证书

sentry.io 下载 getsentry.pem 文件,并将其放在项目目录下的 ssl/ 文件夹中。

Dockerfile

现在我们可以将所有内容整合到我们的 Debezium 镜像中。

  • 让我们先创建一个包含 Sentry 证书的 JKS 文件;这使用了 Docker 的多阶段构建过程,其中我们生成了一个 certificates.jks 文件,稍后我们将将其复制到我们的 Kafka Connect with Debezium 阶段。

  • log4j.properties 复制到 $KAFKA_HOME/config/log4j.properties

  • 从多阶段构建中复制 JKS 文件

  • 设置 Sentry 版本和 m5sums 的 ENV 变量

  • 下载 Sentry 依赖项,您看到的脚本 docker-maven-download 是我们默认包含在镜像中的一个辅助工具。在这种情况下,我们使用它从 Maven Central 下载一个 JAR 文件并将其放入 Kafka libs 目录。我们通过设置 ENV 变量 MAVEN_DEP_DESTINATION=$KAFKA_HOME/libs 来实现这一点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
FROM fabric8/java-centos-openjdk8-jdk:1.6 as ssl-jks

ARG JKS_STOREPASS="any random password, you can also set it outside via the arguments from docker build"

USER root:root

COPY /ssl /ssl

RUN chown -R jboss:jboss /ssl

USER jboss:jboss

WORKDIR /ssl

RUN keytool -import -noprompt -alias getsentry \
    -storepass "${JKS_STOREPASS}" \
    -keystore certificates.jks \
    -trustcacerts -file "/ssl/getsentry.pem"

FROM debezium/connect:0.10 AS kafka-connect

EXPOSE 8083

COPY config/log4j.properties "$KAFKA_HOME/config/log4j.properties"

COPY --from=ssl-jks --chown=kafka:kafka /ssl/certificates.jks /ssl/

ENV SENTRY_VERSION=1.7.23 \
    MAVEN_DEP_DESTINATION=$KAFKA_HOME/libs

RUN docker-maven-download \
        central io/sentry sentry "$SENTRY_VERSION" 4bf1d6538c9c0ebc22526e2094b9bbde && \
    docker-maven-download \
        central io/sentry sentry-log4j "$SENTRY_VERSION" 74af872827bd7e1470fd966449637a77

构建和运行

现在我们可以简单地构建镜像。

$ docker build -t debezium/connect-sentry:1 --build-arg=JKS_STOREPASS="123456789" .

运行时,我们必须通过设置 KAFKA_OPTS: -Djavax.net.ssl.trustStore=/ssl/certificates.jks -Djavax.net.ssl.trustStorePassword=<YOUR TRUSTSTORE PASSWORD> 来配置 Kafka Connect 应用程序加载 JKS 文件。

Sentry 可以 通过多种方式配置,我喜欢通过环境变量进行配置,最少需要设置的是 Sentry DSN(这对于指向您的项目是必需的)以及实际运行的环境名称(例如:production,staging)。

在这种情况下,我们可以配置以下变量:SENTRY_DSN=<在 SENTRY 的仪表盘中获取 DSN>SENTRY_ENVIRONMENT=dev

如果您想了解更多关于使用 Debezium 容器镜像的信息,请 查看我们的教程

就是这样,这是一个使用 Sentry 作为示例来扩展我们 Docker 设置的基本方法;其他修改也应该像这个一样简单。例如,Kafka producer 的 RecordTooLarge 异常在这个设置中会是什么样子,请参见下图。

Sentry Exception example

结论

得益于最近对 Debezium 容器镜像的重构,用自定义扩展来修改它们变得非常容易。下载外部依赖项并将其添加到镜像中已成为一项微不足道的工作,我们很乐意听取您对此的反馈!

如果您对重构本身感到好奇,可以在 pull request debezium/container-images#131 中找到详细信息。

Renato Mefi

Renato Mefi 是 Usabilla (SurveyMonkey) 的首席工程师,他主要在 Kafka、Docker 和 DevOps 领域进行创新,并为 Kafka、Debezium 等项目做出过贡献。他住在阿姆斯特丹,以骑自行车为乐并用于通勤。

   


关于 Debezium

Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。

参与进来

我们希望您觉得 Debezium 有趣且有用,并希望尝试一下。在 Twitter @debezium 上关注我们,在 Zulip 上与我们聊天,或加入我们的 邮件列表 与社区交流。所有代码都在 GitHub 上开源,因此请在本地构建代码,帮助我们改进现有连接器并添加更多连接器。如果您发现问题或有改进 Debezium 的想法,请告诉我们或 记录一个问题

版权所有 © Debezium 及其作者。保留所有权利。有关我们的商标详情,请访问我们的 商标政策商标列表。第三方商标属于其各自所有者,在此提及并不表示任何认可或关联。
×