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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用以下的docker-compose.yaml文件来部署Kafka: ```yaml version: '3' services: zookeeper: image: 'bitnami/zookeeper:latest' ports: - '2181:2181' environment: - ALLOW_ANONYMOUS_LOGIN=yes kafka: image: 'bitnami/kafka:latest' ports: - '9092:9092' environment: - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 - ALLOW_PLAINTEXT_LISTENER=yes - KAFKA_CREATE_TOPICS=my_topic:1:1 ``` 这个docker-compose.yaml文件定义了两个服务:zookeeper和kafka。zookeeper用于管理kafka集群的状态,而kafka是消息队列和流处理平台。 在这个文件中,我们使用了bitnami提供的官方镜像,可以根据需要调整镜像的版本。 在zookeeper服务中,我们将容器的2181端口映射到主机的2181端口,以便能够通过主机访问zookeeper。同时,我们设置了一个环境变量ALLOW_ANONYMOUS_LOGIN为yes,允许匿名登录。 在kafka服务中,我们将容器的9092端口映射到主机的9092端口,以便能够通过主机访问kafka。我们设置了几个环境变量来配置kafka的连接和监听器。KAFKA_ZOOKEEPER_CONNECT指定了zookeeper的地址和端口,KAFKA_ADVERTISED_LISTENERS指定了kafka的监听地址和端口,ALLOW_PLAINTEXT_LISTENER设置为yes允许使用明文传输。最后,我们使用KAFKA_CREATE_TOPICS创建了一个名为my_topic的topic,分区数为1,副本数为1。 你可以将这个docker-compose.yaml文件保存为一个文件,然后在该文件所在的目录中运行`docker-compose up -d`命令来启动Kafka集群。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yqyn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值