Docker-compose搭建maxwell(实现同步数据库binlog至kafka)

本文详细介绍了如何使用Docker-compose搭建Maxwell,将MySQL的binlog同步到Kafka,然后通过Python消费者处理Kafka中的消息。步骤包括设置目录结构、编写docker-compose.yml文件、配置config.properties、创建MySQL用户并授权、准备测试数据库和表,以及启动Maxwell服务并验证数据同步效果。
摘要由CSDN通过智能技术生成

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的消费者,脚本不主动关闭会一直执行):
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yqyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值