Debezium SqlServer Source无法读取数据写入Kafka问题排查
问题根因
核心问题分两类,直接导致生产者初始化失败、数据无法同步:
- 连接器SSL配置存在笔误+配置缺失
- 现有配置中
database.history.consumer.ssl.truststore.password项填的是信任库文件路径/app/.truststore.jks,不是密码值,属于明显配置错误。 - 仅给schema变更历史用的内部producer/consumer配置了SSL参数,Kafka Connect实际写入业务数据主题、读写偏移量/配置/状态内部主题的核心producer/consumer完全没有配置SSL规则,根本无法完成Heroku Kafka的SSL认证。
- 现有配置中
- JKS密钥库存在损坏/密码不匹配问题
抛出的javax.crypto.BadPaddingException: Given final block not properly padded异常,本质是密钥库/私钥的输入密码和生成JKS时设置的实际密码不一致,或是PEM转JKS的流程有误导致文件损坏,私钥条目无法正常解密。
解决步骤
- 第一步:重新生成合规的JKS证书文件
先删除原有损坏的.keystore.jks和.truststore.jks,按以下流程重新生成,全程统一密码避免混淆:- 将客户端证书、私钥、根证书打包为PKCS12中间格式:
openssl pkcs12 -export -in client_cert.pem -inkey client_key.pem -out kafka.client.p12 -name heroku-kafka-client -CAfile trusted_cert.pem -caname root -passout pass:你设置的统一证书密码 - 将PKCS12文件转换为JKS格式密钥库:
keytool -importkeystore -deststorepass 你设置的统一证书密码 -destkeypass 你设置的统一证书密码 -destkeystore /app/.keystore.jks -srckeystore kafka.client.p12 -srcstoretype PKCS12 -srcstorepass 你设置的统一证书密码 -alias heroku-kafka-client - 生成信任库并导入服务端根证书:
keytool -import -alias heroku-kafka-root -file trusted_cert.pem -keystore /app/.truststore.jks -storepass 你设置的统一证书密码 -noprompt
keytool -list -v -keystore /app/.keystore.jks -storepass 你的证书密码验证,能正常列出证书条目无报错,就说明JKS文件可用。 - 将客户端证书、私钥、根证书打包为PKCS12中间格式:
- 第二步:修正连接器配置
修正原有配置笔误,补上核心producer/consumer的SSL配置项,完整补充的配置片段如下:
注意所有password配置项必须填实际设置的密码字符串,不能填文件路径。{ // 修正原有history客户端的配置错误 "database.history.consumer.ssl.truststore.location": "/app/.truststore.jks", "database.history.consumer.ssl.truststore.password": "你设置的统一证书密码", "database.history.producer.ssl.truststore.password": "你设置的统一证书密码", // 补上核心数据生产者SSL配置(写入业务表主题用) "producer.security.protocol": "SSL", "producer.ssl.keystore.location": "/app/.keystore.jks", "producer.ssl.keystore.password": "你设置的统一证书密码", "producer.ssl.truststore.location": "/app/.truststore.jks", "producer.ssl.truststore.password": "你设置的统一证书密码", "producer.ssl.key.password": "你设置的统一证书密码", // 补上核心消费者SSL配置(读写偏移量、状态、配置主题用) "consumer.security.protocol": "SSL", "consumer.ssl.keystore.location": "/app/.keystore.jks", "consumer.ssl.keystore.password": "你设置的统一证书密码", "consumer.ssl.truststore.location": "/app/.truststore.jks", "consumer.ssl.truststore.password": "你设置的统一证书密码", "consumer.ssl.key.password": "你设置的统一证书密码" } - 第三步:权限校验与重启验证
确认Kafka Connect运行进程对/app路径下的两个jks文件有可读权限,重启Connect worker后重新提交连接器配置,观察日志不再出现密钥库加载、生产者构造失败的报错后,等待1-2分钟即可在对应主题看到同步的数据。
提前手动创建主题的操作没有问题,只要主题名和
database.server.name前缀匹配、分区数符合预期,不会影响同步流程,不需要删除重建。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

