环境准备与基础搭建:JDK、MySQL、Kafka、Zookeeper

说实话,搭建CDC系统最磨人的不是写代码,而是环境。我见过太多人卡在版本兼容性上,一卡就是半天。这一章咱们就把地基打牢,把JDK、MySQL、Kafka、Zookeeper这四个组件一次性装好配通。

本章核心目标: 四件套全部跑起来,能互相通信,为后续的CDC同步链路铺路。
CDC 实时同步系统 - 环境依赖关系 CDC 同步引擎 JDK 1.8+ MySQL 8.0 Zookeeper Kafka 安装顺序: JDK → MySQL → Zookeeper → Kafka。Kafka 强依赖 Zookeeper,必须先启动 ZK。

2.1 JDK 安装与配置

JDK 是整个系统的基石。Kafka、Zookeeper、甚至某些 CDC 工具都跑在 JVM 上。我个人习惯用 JDK 1.8,虽然现在都出到 17 了,但 1.8 的生态最稳,坑最少。

2.1.1 下载与安装

  1. 去 Oracle 官网或 Adoptium 下载 jdk-8uXXX-linux-x64.tar.gz
  2. 解压到 /usr/local/ 目录
  3. 配置环境变量
# 解压
tar -zxvf jdk-8uXXX-linux-x64.tar.gz -C /usr/local/
mv /usr/local/jdk1.8.0_XXX /usr/local/jdk

# 配置环境变量(编辑 /etc/profile 或 ~/.bashrc)
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 使配置生效
source /etc/profile

# 验证
java -version
我的习惯: 把 JAVA_HOME 单独拎出来,后面 Kafka、Zookeeper 的启动脚本都要引用它。别偷懒写死路径,不然换版本时你会哭。

2.1.2 避坑指南

  • 版本冲突: 我曾经在一台机器上装了三个 JDK 版本,结果 Kafka 启动时报 UnsupportedClassVersionError。后来统一用 1.8,再没出过问题。
  • 权限问题: 解压后记得 chmod -R 755 /usr/local/jdk,不然普通用户启动不了。
  • 多用户环境: 建议把环境变量写在 /etc/profile 里,所有用户都能用。

2.2 MySQL 安装与配置

MySQL 是 CDC 的数据源。我们后面要读取它的 binlog,所以配置上有几个关键点必须注意。

2.2.1 安装步骤

我用的是 MySQL 8.0,社区版就够用。生产环境建议用 5.7 或 8.0,别用 5.6 了,binlog 功能太弱。

# 添加 MySQL Yum 源
rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# 安装
yum install mysql-community-server -y

# 启动
systemctl start mysqld
systemctl enable mysqld

# 获取临时密码
grep 'temporary password' /var/log/mysqld.log

# 安全配置
mysql_secure_installation

2.2.2 必须开启的配置

CDC 要读 binlog,所以下面这些参数一个都不能少。我见过有人配漏了 log_bin,折腾半天找不到 binlog 文件。

参数 值 说明
log_bin ON 开启二进制日志,CDC 的数据源
binlog_format ROW 行模式,记录每行变更,CDC 必须
binlog_row_image FULL 记录完整行数据,避免数据丢失
server_id 1 集群内唯一,CDC 连接时要用
expire_logs_days 7 binlog 保留 7 天,够用了
# 编辑 /etc/my.cnf,在 [mysqld] 下添加
[mysqld]
log_bin=mysql-bin
binlog_format=ROW
binlog_row_image=FULL
server_id=1
expire_logs_days=7

# 重启 MySQL
systemctl restart mysqld

# 验证 binlog 是否开启
mysql -u root -p -e "SHOW VARIABLES LIKE 'log_bin';"
注意: binlog_format 必须设为 ROW。STATEMENT 模式只记录 SQL 语句,对于 CDC 来说信息不够;MIXED 模式在某些场景下会回退到 STATEMENT,也不可靠。直接上 ROW,省心。

2.2.3 创建 CDC 专用用户

别用 root 连 CDC,风险太大。创建一个只有读取 binlog 权限的用户就好。

CREATE USER 'cdc_user'@'%' IDENTIFIED BY 'Cdc@2024!';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'cdc_user'@'%';
FLUSH PRIVILEGES;

2.3 Zookeeper 安装与配置

Zookeeper 是 Kafka 的"大管家"。Kafka 的元数据、Broker 状态、消费者组信息都靠 ZK 来协调。说白了,没有 ZK,Kafka 就是个单机玩具。

2.3.1 下载与安装

# 下载(我用的是 3.8.0,稳定版)
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gz

# 解压
tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz -C /usr/local/
mv /usr/local/apache-zookeeper-3.8.0-bin /usr/local/zookeeper

# 创建数据目录
mkdir -p /data/zookeeper/data
mkdir -p /data/zookeeper/logs

2.3.2 配置文件

# 复制模板
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg

# 编辑 zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181
maxClientCnxns=60
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
说个经验: autopurge 参数一定要配。我见过有人没配,Zookeeper 跑了半年,快照文件把磁盘撑爆了,整个 Kafka 集群瘫痪。保留 3 个快照,每小时清理一次,够用。

2.3.3 启动与验证

# 启动
/usr/local/zookeeper/bin/zkServer.sh start

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

# 连接测试
/usr/local/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
# 在 zkCli 中执行 ls / 能看到 [zookeeper] 节点就对了

2.4 Kafka 安装与配置

Kafka 是整个 CDC 系统的"数据高速公路"。MySQL 的 binlog 变更会变成消息,通过 Kafka 分发到下游。嗯,这里要注意版本匹配——Kafka 3.x 虽然宣称可以脱离 ZK,但生产环境我还是建议用 2.8.x 配合 ZK,最稳。

2.4.1 下载与安装

# 下载(我选的是 kafka_2.13-2.8.1,scala 2.13 版本)
wget https://archive.apache.org/dist/kafka/2.8.1/kafka_2.13-2.8.1.tgz

# 解压
tar -zxvf kafka_2.13-2.8.1.tgz -C /usr/local/
mv /usr/local/kafka_2.13-2.8.1 /usr/local/kafka

# 创建数据目录
mkdir -p /data/kafka/logs

2.4.2 核心配置

# 编辑 /usr/local/kafka/config/server.properties
broker.id=0
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://你的服务器IP:9092
log.dirs=/data/kafka/logs
num.partitions=3
default.replication.factor=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
zookeeper.connect=127.0.0.1:2181
log.retention.hours=72
log.retention.bytes=1073741824
参数 推荐值 为什么这么配
num.partitions 3 CDC 场景下,一个 Topic 就够了,3 个分区保证并行度
log.retention.hours 72 保留 3 天,CDC 消费端挂了也有足够时间恢复
log.retention.bytes 1GB 单个日志段 1GB,方便管理和清理
踩坑提醒: advertised.listeners 一定要配成你的服务器 IP 或域名,别用 0.0.0.0。我曾经配错了,客户端连不上 Kafka,查了半天才发现是 advertised.listeners 没配对。客户端拿到的连接地址是 0.0.0.0,当然连不上。

2.4.3 启动与验证

# 先确保 Zookeeper 已启动
/usr/local/zookeeper/bin/zkServer.sh status

# 启动 Kafka
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties

# 验证:创建 Topic
/usr/local/kafka/bin/kafka-topics.sh --create --topic cdc-test --bootstrap-server 127.0.0.1:9092 --partitions 3 --replication-factor 1

# 查看 Topic 列表
/usr/local/kafka/bin/kafka-topics.sh --list --bootstrap-server 127.0.0.1:9092

# 发送测试消息
echo "hello cdc" | /usr/local/kafka/bin/kafka-console-producer.sh --topic cdc-test --bootstrap-server 127.0.0.1:9092

# 消费测试消息
/usr/local/kafka/bin/kafka-console-consumer.sh --topic cdc-test --from-beginning --bootstrap-server 127.0.0.1:9092

如果能看到 "hello cdc" 这条消息,恭喜你,四件套全部跑通了。

2.5 环境验证清单

最后,我习惯列一个检查清单,确保每个组件都正常工作。你照着跑一遍,没问题就可以进入下一阶段了。

组件 验证命令 预期结果
JDK java -version 显示 1.8.x 版本信息
MySQL mysql -u root -p -e "SHOW VARIABLES LIKE 'log_bin';" Value 为 ON
Zookeeper echo stat | nc 127.0.0.1 2181 显示 Mode: standalone
Kafka kafka-topics.sh --list --bootstrap-server 127.0.0.1:9092 显示 cdc-test
我的建议: 把这四个组件的启动命令写成脚本,放到 /etc/rc.local 里,开机自启。生产环境还可以用 systemd 管理,但开发环境这样够用了。