环境准备:JDK安装、Kafka集群搭建、Zookeeper配置、MySQL源端准备

说实话,很多人在Debezium踩坑,根源都在环境准备阶段。我见过太多人一上来就急着配Connector,结果Kafka集群起不来,或者MySQL的binlog格式不对,折腾半天才发现是基础没打好。

这一章,咱们就把地基夯实。JDK、Zookeeper、Kafka、MySQL源端,一个都不能少。

2.1 JDK安装与配置

Debezium和Kafka都是Java系的东西,JDK是跑不掉的。我个人习惯用JDK 11,稳定、主流,社区支持也最好。JDK 8虽然也能用,但有些新特性不支持,没必要给自己找麻烦。

版本建议: 推荐使用 JDK 11 LTS(如 OpenJDK 11 或 Amazon Corretto 11)。JDK 17 也可以,但生产环境建议等生态再成熟一点。

安装步骤很简单,我快速过一遍:

  1. 下载:去 https://adoptium.net/ 下载 JDK 11 的 tar.gz 包。
  2. 解压:tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.18_10.tar.gz -C /usr/local/
  3. 配置环境变量:编辑 /etc/profile,添加以下内容:
export JAVA_HOME=/usr/local/jdk-11.0.18
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  1. 生效并验证:source /etc/profile && java -version

输出类似下面这样,就说明成了:

openjdk version "11.0.18" 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10)
OpenJDK 64-Bit Server VM (build 11.0.18+10, mixed mode)
注意: 不要用系统自带的 OpenJDK(比如 yum install 的),版本往往太老。我曾经在一个项目里图省事用了系统自带的 JDK 8,结果 Kafka 3.x 启动直接报错,查了半天才发现是 JDK 版本不兼容。

2.2 Zookeeper集群搭建

Kafka重度依赖Zookeeper来做元数据管理和Leader选举。虽然Kafka 2.8+开始支持KRaft模式(去ZK),但生产环境主流还是ZK模式。咱们按3节点集群来搭,这是生产的最低要求。

2.2.1 下载与解压

wget https://archive.apache.org/dist/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz
tar -zxvf apache-zookeeper-3.8.1-bin.tar.gz -C /usr/local/
mv /usr/local/apache-zookeeper-3.8.1-bin /usr/local/zookeeper

2.2.2 配置文件

在 /usr/local/zookeeper/conf 目录下,复制 zoo_sample.cfg 为 zoo.cfg:

cp zoo_sample.cfg zoo.cfg

编辑 zoo.cfg,核心配置如下:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181

# 集群节点配置
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888

这里解释一下几个关键参数:

  • tickTime:ZK的基本时间单位,毫秒。2000就是2秒。
  • initLimit:Follower启动时与Leader同步的时限,这里是10个tick,即20秒。
  • syncLimit:Follower与Leader通信的超时时间,5个tick,即10秒。
  • dataDir:数据存储目录,建议用独立磁盘,别跟系统盘混在一起。
  • server.X:格式是 server.节点ID=IP:Leader选举端口:数据同步端口。

2.2.3 创建myid文件

在每个节点的 /data/zookeeper 目录下,创建一个 myid 文件,内容就是对应的节点ID:

# 在 192.168.1.101 上
echo "1" > /data/zookeeper/myid

# 在 192.168.1.102 上
echo "2" > /data/zookeeper/myid

# 在 192.168.1.103 上
echo "3" > /data/zookeeper/myid

2.2.4 启动与验证

# 每个节点都执行
/usr/local/zookeeper/bin/zkServer.sh start

# 查看状态
/usr/local/zookeeper/bin/zkServer.sh status

正常会看到其中一个节点是 Mode: leader,另外两个是 Mode: follower。如果全是 standalone,说明集群没配好,检查一下 zoo.cfg 里的IP和端口。

避坑指南: 我曾经在生产环境遇到过一个问题——三个节点都显示 standalone。查了半天,发现是防火墙把2888和3888端口给拦了。ZK集群节点之间通信全靠这两个端口,一定要放行。

2.3 Kafka集群搭建

Kafka集群我建议至少3个Broker,跟ZK节点数保持一致。咱们用Kafka 3.4.0版本,兼容性最好。

2.3.1 下载与解压

wget https://archive.apache.org/dist/kafka/3.4.0/kafka_2.13-3.4.0.tgz
tar -zxvf kafka_2.13-3.4.0.tgz -C /usr/local/
mv /usr/local/kafka_2.13-3.4.0 /usr/local/kafka

2.3.2 配置文件

编辑 /usr/local/kafka/config/server.properties,核心配置如下:

broker.id=1  # 每个节点不同,依次为1、2、3
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://192.168.1.101:9092  # 改为本机IP
log.dirs=/data/kafka/logs
num.partitions=3
default.replication.factor=2
offsets.topic.replication.factor=2
transaction.state.log.replication.factor=2
transaction.state.log.min.isr=2
zookeeper.connect=192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181
auto.create.topics.enable=false

几个关键参数说明:

  • broker.id:集群内唯一,从1开始递增。
  • advertised.listeners:客户端连接时使用的地址,必须写本机真实IP,不能写0.0.0.0或localhost。
  • log.dirs:日志存储目录,建议用独立磁盘。
  • default.replication.factor:默认副本数,2就够,3节点集群可以设2或3。
  • auto.create.topics.enable:建议关掉,防止误创建Topic。

2.3.3 启动与验证

# 每个节点都执行
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties

# 验证集群状态
/usr/local/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server 192.168.1.101:9092

能看到三个Broker的版本信息,就说明集群起来了。

小技巧: 启动时加上 -daemon 参数,进程会在后台运行。如果不加,关掉终端Kafka就停了,生产环境千万别忘。

2.4 MySQL源端准备

Debezium要捕获MySQL的变更,前提是MySQL开启了binlog,并且格式是 ROW。这是硬性要求,没得商量。

2.4.1 开启binlog

编辑MySQL配置文件 /etc/my.cnf,在 [mysqld] 段下添加:

server-id=1  # 每个MySQL实例唯一
log_bin=mysql-bin
binlog_format=ROW
binlog_row_image=FULL
expire_logs_days=7
max_binlog_size=1G

参数说明:

  • server-id:集群内唯一,不能跟其他MySQL节点重复。
  • binlog_format=ROW:必须设为ROW,Debezium才能解析出每一行的变更。
  • binlog_row_image=FULL:记录完整行数据,包括所有列。如果设为MINIMAL,Debezium拿不到完整数据。
  • expire_logs_days:binlog保留天数,建议7天以上,防止Debezium断连后追不上。

2.4.2 创建Debezium用户

Debezium需要一个专门的MySQL用户,用来读取binlog和元数据。权限要给够,但别给太多:

CREATE USER 'debezium'@'%' IDENTIFIED BY 'debezium_pass';
GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'debezium'@'%';
FLUSH PRIVILEGES;

权限说明:

  • SELECT:读取表结构。
  • RELOAD:执行 FLUSH 操作。
  • SHOW DATABASES:列出数据库。
  • REPLICATION SLAVE:读取binlog。
  • REPLICATION CLIENT:获取主从状态。

2.4.3 验证binlog配置

登录MySQL,执行以下命令确认配置生效:

SHOW VARIABLES LIKE 'log_bin';
SHOW VARIABLES LIKE 'binlog_format';
SHOW VARIABLES LIKE 'binlog_row_image';

输出应该是:

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
| binlog_format | ROW   |
| binlog_row_image | FULL |
+---------------+-------+
注意: 修改MySQL配置后需要重启MySQL服务。如果是在生产环境,建议先确认业务低峰期再操作。我曾经在白天直接重启MySQL,结果业务中断了5分钟,被运维同事追着骂。

2.5 整体架构图

下面这张图展示了我们搭建好的环境全貌。JDK是底层基础,Zookeeper和Kafka构成消息层,MySQL作为数据源,Debezium Connector跑在Kafka Connect上。

Debezium 环境架构图 JDK 11 (Java 运行环境) Zookeeper 集群 (3节点) Kafka 集群 (3 Broker) MySQL 源端 (binlog=ROW) Debezium MySQL Connector 说明 JDK 11 为所有组件提供运行环境;Zookeeper 管理 Kafka 元数据;Kafka 存储变更事件;MySQL 作为数据源提供 binlog

2.6 环境验证清单

所有组件都装好后,我建议你按这个清单逐项检查,避免遗漏:

组件 验证命令 预期结果
JDK java -version 显示 JDK 11 版本信息
Zookeeper zkServer.sh status 1个leader,2个follower
Kafka kafka-broker-api-versions.sh 显示3个Broker的版本
MySQL binlog SHOW VARIABLES LIKE 'binlog_format' ROW
MySQL 用户 SELECT USER(), CURRENT_USER() 显示 debezium 用户