介绍
之前我用的是MyBatis Intercept 来同步ES数据,存在两个问题,一是跨库时数据不好同步,二是人为操作数据库修改的数据无法获取。所以这次使用Maxwell+kafka来同步MySQL binlog,通过解析binlog的方式将数据写入ES。
环境
- kafka_2.12-2.6.0.tgz
- maxwell-1.23.5.tar.gz
- elasticsearch-7.7.1-linux-x86_64.tar.gz
- MySQL_5.7.26
- Linux version 4.15.6-1.el7.elrepo.x86_64 - Red Hat 4.8.5-16
MySQL
Binlog 开启
# 修改my.cnf,添加如下配置。
[root@Server1d220 mysql]$ sudo vim /etc/my.cnf
# 随机指定一个不能和其他集群中机器重名的字符串,如果只有一台机器,那就可以随便指定了
server_id=1
log-bin=master
# 选择row模式
binlog_format=row
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 重启数据库
systemctl restart mysqld.service
# 启动MySql设置参数
mysql> set global binlog_format=ROW;
mysql> set global binlog_row_image=FULL;
其他命令
# 查看binlog是否开启
show global variables like '%log_bin%'
# 查看binlog
show binlog events;
# 查看最新一个binlog日志文件名称
show master status;
# 查找binlog日志
find / -name mysql-bin -type f
# 查看详细的日志配置信息
SHOW GLOBAL VARIABLES LIKE '%log%';
# mysql数据存储目录
show variables like '%dir%';
# 查看binlog内容
show binlog events in 'mysql-bin.000003';
Kafka
Kafka 安装
- Kafka官网
- 因为发行版的Kafka 自带了zookeeper 所以不需要单独下载 Zookeeper
- 这里是单机安装
# 下载Kafka
[root@Server1d220] wget https://www.apache.org/dyn/closer.cgi?path=/kafka/2.6.0/kafka_2.12-2.6.0.tgz
# 解压安装
[root@Server1d220]# tar -zxvf kafka_2.12-2.6.0.tgz
修改Kafka、zookeeper 配置
# 修改Kafka 配置
[root@Server1d220 kafka_2.12-2.6.0]# vim config/server.properties
# 改成内网IP
listeners=PLAINTEXT://192.168.1.220:9092
# 外网客户端访问返回地址
advertised.listeners=PLAINTEXT://192.168.1.220:9092
# 修改日志位置
log.dirs=/home/lib/kafka_2.12-2.6.0/data
# 设置zookeeper地址
zookeeper.connect=localhost:2181
# 设置消息过期时间
log.retention.hours=24
# 设置清理策略
log.cleanup.policy=delete
# 超过10g 删除旧数据
log.retention.bytes=10737418240
[root@Server1d220 kafka_2.12-2.6.0]# vim config/consumer.properties
# 设置集群地址
bootstrap.servers=192.168.1.220:9092
# 设置组
group.id=dev-consumer-group
# 修改Zookeeper 配置
[root@Server1d220 kafka_2.12-2.6.0]# vim config/zookeeper.propertie
# 修改文件目录
dataDir=/home/lib/kafka_2.12-2.6.0/zookeeper/data
# 修改端口
clientPort=2181
启动Kafka 与Zookeeper
# 后台启动Zookeeper
[root@Server1d220 kafka_2.12-2.6.0]# nohup ./bin/zookeeper-server-start.sh ./config/zookeeper.properties >logs/zookeeper.log 2>&1 &
# 后台启动Kafka
[root@Server1d220 kafka_2.12-2.6.0]# nohup ./bin/kafka-server-start.sh ./config/server.properties >logs/kafka.log 2>&1 &
# 创建Kafka Topic 名字是maxwell
[root@Server1d220 kafka_2.12-2.6.0]# ./bin/kafka-topics.sh --create --zookeeper 192.168.1.220:2181 --replication-factor 1 --partitions 1 --topic maxwell
统一启动脚本
#!/bin/sh
#启动zookeeper
nohup ./bin/zookeeper-server-start.sh ./config/zookeeper.properties >/dev/null 2>&1 &
sleep 3 #等3秒后执行
#启动kafka
nohup ./bin/kafka-server-start.sh ./config/server.properties >/dev/null 2>&1 &
集群配置
在集群配置上,需要修改的地方不多,主要注意以下几个点:
- 修改zookeeper.properties
# 配置以下参数
[root@Server1d238 kafka_2.12-2.6.0] vim config/zookeeper.properties
dataDir=/usr/local/kafka/my_dir/zookeeper/data
initLimit=10
syncLimit=5
maxClientCnxns=0
server.1=192.168.1.238:2888:3888
server.2=192.168.110.70:2888:3888
server.3=192.168.110.71:2888:3888
# 在dataDir 目录下创建myid 文件
# myid 的内容就是上面server.后面的1、2、3
238机器 :echo 1 > myid
70机器 :echo 2 > myid
71机器 :echo 3 > myid
- 修改 server.properties
[root@Server1d238 kafka_2.12-2.6.0]vim config/server.properties
# 集群下需要修改下面的配置
# 唯一标示
broker.id=0
# 监听地址,改成本机ip端口
listeners=PLAINTEXT://192.168.1.238:9092
advertised.listeners=PLAINTEXT://192.168.1.238:9092
# 改成zookeeper 集群地址
zookeeper.connect=192.168.1.238:2181,192.168.110.70:2181,192.168.110.71:2181
其他命令
# 查询服务topic列表
[root@Server1d220 kafka_2.12-2.6.0]# ./bin/kafka-topics.sh --list --zookeeper 127.0.0.1:2181
# 删除topic
# 需要在server.properties 设置 delete.topic.enable=true
[10080@Server1d220 kafka_2.12-2.6.0]$ ./bin/kafka-topics.sh --delete --zookeeper 127.0.0.1:2181 --topic contradictionmediation__member_info
# 查询topic 详情
[10080@Server1d220 kafka_2.12-2.6.0]$ ./bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --topic contradictionmediation__member_info --describe
# 查询consumer 消息
[10080@Server1d220 kafka_2.12-2.6.0]$ ./bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic contradictionmediation__member_info --from-beginning
# 查询kafka节点下的consumer列表
[10080@Server1d220 kafka_2.12-2.6.0]$ ./bin/kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --list
# 删除一个grop
[10080@Server1d220 kafka_2.12-2.6.0]$ ./bin/kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --delete --group tablePartiesInfoConsumer
# Kafka停止命令
[root@Server1d220 kafka_2.12-2.6.0]# ./bin/kafka-server-stop.sh
# zookepper 停止命令
[root@Server1d220 kafka_2.12-2.6.0]# ./bin/zookeeper-server-stop.sh
# zookepper 查询kafka borkes信息
[root@Server1d220 kafka_2.12-2.6.0]# ./bin/zookeeper-shell.sh 127.0.0.1:2181
[root@Server1d220 kafka_2.12-2.6.0]# ls /brokers/ids
# 清空数据
# 在每台服务器上执行
[root@Server1d238 kafka_2.12-2.6.0]# rm -rf logs/*
[root@Server1d238 kafka_2.12-2.6.0]# rm -rf data/*
[root@Server1d238 kafka_2.12-2.6.0]# rm -rf zookeeper/version-2/
# 查询zookepper 节点配置信息
# 查询节点0
[root@Server1d238 kafka_2.12-2.6.0]# bin/zookeeper-shell.sh localhost:2181 <<< "get /brokers/ids/0"
异常相关
- 异常:The Cluster ID 4EneH1qLR3KH69gubQF8kg doesn't match stored clusterId Some(WslSvgQJQMiTl4rT18Eugg) in meta.properties. The broker is trying to join the wrong cluster. Configured zookeeper.connect may be wrong.
解决:删除log.dirs=/home/lib/kafka_2.12-2.6.0/logs 下的文件即可- 异常:Replication factor: 3 larger than available brokers: 1.
解决:Kafka服务当前可用Broker小于设置的replication-factor。修改Topic 的replication-factor 参数。
Maxwell
Maxwell 安装
Maxwell GitHub
这里是单机安装
# 下载
[root@Server1d220 lib]# wget https://github.com/zendesk/maxwell/releases/download/v1.23.5/maxwell-1.23.5.tar.gz
# 解压安装
[root@Server1d220 lib]# tar -zxvf maxwell-1.23.5.tar.gz
Maxwell 修改配置
# 配置文件重命名
[root@Server1d220 maxwell-1.23.5]# mv config.properties.example config.properties
# 修改配置文件
[root@Server1d220 maxwell-1.23.5]# vim config.properties
#示例id
client_id=maxwell-dev
# log配置
# 第一次启动时建议改为debug,可以开到mysql数据与kafka请求,稳定后再改为info
log_level=info
# kafka 配置
producer=kafka
kafka.bootstrap.servers=192.168.1.220:9092
# mysql配置
host=192.168.110.232
user=maxwell
password=Maxwell@2020
# 解析规则配置(例:只匹配contradictionmediation库下的所有表)
filter= exclude: contradictionmediation.*, include: contradictionmediation.*
Maxwell 启动
# 直接启动
[root@Server1d220 maxwell-1.23.5]# nohup ./bin/maxwell >logs/maxwell.log 2>&1 &
# 带参数的启动
[root@Server1d220 maxwell-1.23.5]# nohub ./bin/maxwell --user='maxwell' --password='Maxwell@2020' --host='192.168.110.232' --producer=kafka --kafka.bootstrap.servers=192.168.1.220:9092 --kafka_topic=maxwell >logs/maxwell.log 2>&1 &
# 最后jps -l 看一下有没有进程,然后看下日志,成功的话会打印:BinlogConnectorLifecycleListener - Binlog connected.
# 解析规则
# 仅匹配foodb数据库的tbl表和所有table_数字的表
--filter='exclude: foodb.*, include: foodb.tbl, include: foodb./table_\d+/'
# 排除所有库所有表,仅匹配db1数据库
--filter = 'exclude: *.*, include: db1.*'
# 排除含db.tbl.col列值为reject的所有更新
--filter = 'exclude: db.tbl.col = reject'
# 排除任何包含col_a列的更新
--filter = 'exclude: *.*.col_a = *'
# blacklist 黑名单,完全排除bad_db数据库,若要恢复,必须删除maxwell库
--filter = 'blacklist: bad_db.*'
Maxwell 可配置参数列表
Maxwell 多实例
可以部署多个实例,每个实例单独启动即可
Maxwell 其他命令
# 全量初始化某个表的数据
[root@Server1d220 maxwell-1.23.5]# ./bin/maxwell-bootstrap --user maxwell --password Maxwell@2020 --host 192.168.110.232 --database contradictionmediation --table member_info --client_id maxwell-dev
# 请求数据
# 在Maxwell 数据库中
delete from maxwell.`databases` where id is not null ;
delete from maxwell.`tables`where id is not null;
delete from maxwell.`schemas`where id is not null;
delete from maxwell.bootstrap where id is not null ;
delete from maxwell.columns where id is not null ;
delete from maxwell.heartbeats where true;
delete from maxwell.positions where true;
总结
总体上不难,一步一做就可以了。后面我会写下kafka的接入,以及将数据同步到es的实现。