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

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

猜你喜欢

转载自blog.csdn.net/yqyn6/article/details/129861257