Docker-compose搭建maxwell
Maxwell同步MySQL binlog到Kafka,并使用Python消费者处理消息架构如下:
+------------+ +------------+ +-----------------+ +-----------------+
| MySQL | binlog | Maxwell | Kafka | Kafka topic | Python | Consumer |
| database +------------> connector +-------------> (message queue) +------------> application(s) |
| | | | | | | |
+------------+ +------------+ +-----------------+ +-----------------+
maxwell实现同步数据库binlog前期准备:
请参照我的前面的的文章:
搭建mysql服务:Docker-compose搭建Mysql8.0(并开启binlog)
搭建kafka 服务:Docker-compose搭建Kafka(并开启kafka manage界面)
1.目录结构
.
└── docker_maxwell
├── docker-compose.yml
├── maxwell
└── conf
└── config.properties
2. docker-compose.yml
version: '3.5'
services:
maxwell:
image: zendesk/maxwell
network_mode: "host"
command: bin/maxwell --config /etc/maxwell/config.properties
volumes:
- ./conf:/etc/maxwell/
3. 创建conf文件夹,在conf文件夹下添加 config.properties文件
注意: 文件内IP替换成自己本机IP
daemon=true
# 第一次启动时建议改为debug,可以开到mysql数据与kafka请求,稳定后再改为info
log_level=info
producer=kafka
kafka.bootstrap.servers=IP:9092
# 会往 kafka下主题为'test'的分区下推送数据
kafka_topic=test
#当producer_partition_by设置为table时,Maxwell会将生成的消息根据表名称进行分区,不同的表将会被分配到不同的分区中,默认为database
producer_partition_by=table
client_id=maxwell_1
# mysql login info 需要先在mysql创建maxwell用户
host=IP
port=33106
user=maxwell
password=Abc123654
schema_database=maxwell
4. mysql中创建maxwell用户,并授权
按顺序执行下面sql
a.创建maxwell数据库(maxwell 启动后,会在该数据库下建表,运行时,会保存一些数据)
CREATE DATABASE `maxwell`;
b.创建 maxwell 用户、密码是 Abc123654(maxwell 配置文件中默认用户名、密码),并授权管理该数据库:
GRANT ALL ON maxwell.* TO 'maxwell'@'%' IDENTIFIED BY 'Abc123654';
c.分配 select ,replication slave , replication client 权限:
grant select ,replication slave,replication client on *.* to maxwell@'%';
d.刷新权限,立即生效
flush privileges;
5. mysql中准备测试数据库和表
# a. 创建toutiao数据库
CREATE DATABASE `toutiao`;
# b. 在创建新闻频道表
CREATE TABLE `news_channel` (
`channel_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '频道ID',
`channel_name` varchar(32) CHARACTER SET utf8mb3 NOT NULL COMMENT '频道名称',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`sequence` int unsigned DEFAULT '0' COMMENT '序号',
`is_visible` tinyint(1) DEFAULT '0' COMMENT '是否可见',
`is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否默认',
PRIMARY KEY (`channel_id`),
UNIQUE KEY `channel_name` (`channel_name`)
) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='新闻频道表';
6. 启动Maxwell服务
# 进入docker_maxwell目录下
cd /系统目录/maxwell
# 启动服务
docker compose up -d
7. Mysql binglog同步服务验证
a.往news_channel表里插入数据
INSERT INTO news_channel
(channel_id, channel_name, create_time, update_time, `sequence`, is_visible, is_default)
VALUES(30, 'android开发', '2023-03-14 08:23:27', '2023-03-14 08:23:27', 0, 0, 0);
b.在python中执行一下下列代码查看是否同步成功(IP需替换成自己的kafka所在IP,该代码在Docker-compose搭建Kafka(并开启kafka manage界面)中有)
import json
from kafka import KafkaConsumer, TopicPartition
k_topic = 'test'
consumer = KafkaConsumer(k_topic, bootstrap_servers=['IP:9092'],
enable_auto_commit=False,
auto_offset_reset="earliest",
group_id='test')
# auto_offset_reset
# 1. 从上一次未消费的位置开始读(则该参数设置为earliest);
# 2. 从当前时刻开始读之后产生的, 之前产生的数据不再消费(则该参数设置为latest)
for message in consumer:
print(message)
print(message.topic)
print(f"receive: \n key: {
json.loads(message.key.decode())},\n value: {
json.loads(message.value.decode())} \n ")
# 手动commit
# consumer.commit()
执行结果如下(该代码为kafka的消费者,脚本不主动关闭会一直执行):