环境准备:JDK安装、Kafka集群搭建、Zookeeper配置、MySQL源端准备
说实话,很多人在Debezium踩坑,根源都在环境准备阶段。我见过太多人一上来就急着配Connector,结果Kafka集群起不来,或者MySQL的binlog格式不对,折腾半天才发现是基础没打好。
这一章,咱们就把地基夯实。JDK、Zookeeper、Kafka、MySQL源端,一个都不能少。
2.1 JDK安装与配置
Debezium和Kafka都是Java系的东西,JDK是跑不掉的。我个人习惯用JDK 11,稳定、主流,社区支持也最好。JDK 8虽然也能用,但有些新特性不支持,没必要给自己找麻烦。
安装步骤很简单,我快速过一遍:
- 下载:去
https://adoptium.net/下载 JDK 11 的 tar.gz 包。 - 解压:
tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.18_10.tar.gz -C /usr/local/ - 配置环境变量:编辑
/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
- 生效并验证:
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)
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 |
+---------------+-------+
2.5 整体架构图
下面这张图展示了我们搭建好的环境全貌。JDK是底层基础,Zookeeper和Kafka构成消息层,MySQL作为数据源,Debezium Connector跑在Kafka Connect上。
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 用户 |