【总结】Maxwell学习笔记
1.Maxwell简介
Maxwell 是一款用Java编写的MySQL变更数据抓取软件,它会实时监控Mysql数据库的数据变更操作(包括insert、update、delete),并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流数据处理平台
官网地址:Maxwell's Daemon
Maxwell输出数据格式:

字段说明:
| 字段 | 解释 |
| database | 变更数据所属的数据库 |
| table | 表更数据所属的表 |
| type | 数据变更类型 |
| ts | 数据变更发生的时间 |
| xid | 事务id |
| commit | 事务提交标志,可用于重新组装事务 |
| data | 对于insert类型,表示插入的数据;对于update类型,标识修改之后的数据;对于delete类型,表示删除的数据 |
| old | 对于update类型,表示修改之前的数据,只包含变更字段 |
2.Maxwell原理
Maxwell的工作原理是实时读取MySQL数据库的二进制日志(Binlog),从中获取变更数据,再将变更数据以JSON格式发送至Kafka等流处理平台
2.1 MySQL二进制日志
二进制日志(Binlog)是MySQL服务端非常重要的一种日志,它会保存MySQL数据库的所有数据变更记录。Binlog的主要作用包括主从复制和数据恢复
2.2 MySQL主从复制
MySQL的主从复制,就是用来建立一个和主数据库完全一样的数据库环境,这个数据库称为从数据库
2.2.1 应用场景
- 做数据库的热备:主数据库服务器故障后,可切换到从数据库继续工作。
- 读写分离:主数据库只负责业务数据的写入操作,而多个从数据库只负责业务数据的查询工作,在读多写少场景下,可以提高数据库工作效率
2.2.2 工作原理
- Master主库将数据变更记录,写到二进制日志(binary log)中
- Slave从库向mysql master发送dump协议,将master主库的binary log events拷贝到它的中继日志(relay log
- Slave从库读取并回放中继日志中的事件,将改变的数据同步到自己的数据库
MySQL的dump协议是一种用于在客户端和服务器之间传输数据的文件格式。它主要用于备份和恢复数据库,以及在不同版本的MySQL服务器之间迁移数据。dump协议的文件通常以.sql为扩展名,包含了创建表、插入数据等SQL语句

由此可见,maxwell的工作原理就是就是将自己伪装成slave,并遵循MySQL主从复制的协议,从master同步数据
3.Maxwell部署
3.1 安装Maxwell
安装包下载地址:https://github.com/zendesk/maxwell/releases/download/v1.29.2/maxwell-1.29.2.tar.gz
注:Maxwell-1.30.0及以上版本不再支持JDK1.8
下载完成后解压即可,目录结构如下:

3.2 配置MySQL
1.首先需要开启MySQL的binlog服务,sudo vim /etc/my.cnf:
增加以下配置:
[mysqld]#数据库id
server-id = 1
#启动binlog,该参数的值会作为binlog的文件名
log-bin=mysql-bin
#binlog类型,maxwell要求为row类型
binlog_format=row
#启用binlog的数据库,需根据实际情况作出修改
binlog-do-db=gmall
1.有关binlog-do-db,如果需要有多个数据库来启用binlog,则要增加多条语句配置
也可以使用binlog-ignore-db来设置不需监控的数据库
2.有关server-id:server-id是MySQL服务器的一个唯一标识符,它通常在配置文件中设置。这个标识符在复制过程中非常重要,因为它帮助确保数据的一致性和正确性
3.有关binlog模式:MySQL的binlog模式有:
Statement-based:基于语句,Binlog会记录所有写操作的SQL语句,包括insert、update、delete等
- 优点: 节省空间
- 缺点: 有可能造成数据不一致,例如insert语句中包含now()函数
Row-based:基于行,Binlog会记录每次写操作后被操作行记录的变化
- 优点:保持数据的绝对一致性缺点:占用较大空间
- mixed:混合模式,默认是Statement-based,如果SQL语句可能导致数据不一致,就自动切换到Row-based
Maxwell要求Binlog采用Row-based模式
2.重启MySQL服务:sudo systemctl restart mysqld
3.3 创建Maxwell所需数据库和用户
1.创建数据库:CREATE DATABASE maxwell
2.调整MySQL数据库密码级别:
set global validate_password_policy=0
set global validate_password_length=4
global validate_password_policy用于指定密码的强度验证等级:
- LOW(0):只验证密码长度。
- MEDIUM(1):验证长度、数字、大小写字母、特殊字符。
- STRONG(2):验证长度、数字、大小写字母、特殊字符以及字典文件。
global validate_password_length用于设置密码的最小长度
3.创建Maxwell用户并赋予其必要权限:
①CREATE USER 'maxwell'@'%' IDENTIFIED BY 'maxwell'(创建用户)、
'maxwell'@'%':用户名是maxwell;主机名是'%','%'表示这个用户可以从任何主机连接到数据库服务器
IDENTIFIED BY 'maxwell':密码是maxwell
②GRANT ALL ON maxwell.* TO 'maxwell'@'%';:Maxwell用户可以操作maxwell数据库下的所有表
③GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'maxwell'@'%';:
赋予maxwell用户对于所有数据库下所有表的主从复制权限
权限:SELECT(查询)、REPLICATION CLIENT(复制客户端)和REPLICATION SLAVE(复制从服务器)
ON *.*:指定这些权限适用的数据库和表。星号(*)表示所有数据库和表
TO 'maxwell'@'%':指定要授予权限的用户
3.4 配置Maxwell
首先修改配置文件名称:cp config.properties.example config.properties
然后对该文件进行修改:
#Maxwell数据发送目的地,可选配置有stdout|file|kafka|kinesis|pubsub|sqs|rabbitmq|redis
producer=kafka
#目标Kafka集群地址
kafka.bootstrap.servers=hadoop102:9092,hadoop103:9092
#目标Kafka topic,可静态配置,例如:maxwell,也可动态配置,例如:%{database}_%{table}
kafka_topic=topic_db#MySQL相关配置
host=hadoop102
user=maxwell
password=maxwell
jdbc_options=useSSL=false&serverTimezone=Asia/Shanghai
4.Maxwell使用
以将MySQL数据同步到Kafka为例,首先启动Kafka集群
4.1 maxwell启停
启动:/opt/module/maxwell/bin/maxwell --config /opt/module/maxwell/config.properties --daemon
停止:ps -ef | grep maxwell | grep -v grep | grep maxwell | awk '{print $2}' | xargs kill -9
解析:
- ps -ef: 这是列出所有正在运行的进程的命令。
- grep maxwell: 这是搜索包含"maxwell"字符串的进程。
- grep -v grep: 这是排除包含"grep"字符串的进程,以避免误杀grep命令本身。
- awk '{print $2}': 这是使用awk命令提取每行输出的第二个字段,即进程ID(PID)。
- xargs kill -9: 这是将提取到的进程ID作为参数传递给kill命令,并使用-9选项强制终止进程。
启停脚本:
MAXWELL_HOME=/opt/module/maxwellstatus_maxwell(){result=`ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep | wc -l`return $result
}start_maxwell(){status_maxwellif [[ $? -lt 1 ]]; thenecho "启动Maxwell"$MAXWELL_HOME/bin/maxwell --config $MAXWELL_HOME/config.properties --daemonelseecho "Maxwell正在运行"fi
}stop_maxwell(){status_maxwellif [[ $? -gt 0 ]]; thenecho "停止Maxwell"ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep | awk '{print $2}' | xargs kill -9elseecho "Maxwell未在运行"fi
}case $1 instart )start_maxwell;;stop )stop_maxwell;;restart )stop_maxwellstart_maxwell;;
esac
4.2 增量数据同步
启动kafka消费者:bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --topic topic_db
然后在mysql中gmall数据库的activity_info表中插入一条数据:

可以看到Kafka消费者成功捕获到Maxwell发送来的数据:

4.3 历史数据全量同步
Maxwell提供了bootstrap功能来进行历史数据的全量同步
命令格式:/opt/module/maxwell/bin/maxwell-bootstrap --database gmall --table activity_info --config /opt/module/maxwell/config.properties
执行指令后可以看到所有数据均已同步到Kafka消费者:

注意:
1)第一条type为bootstrap-start和最后一条type为bootstrap-complete的数据,是bootstrap开始和结束的标志,不包含数据,中间的type为bootstrap-insert的数据才包含数据
2)一次bootstrap输出的所有记录的ts都相同,为bootstrap开始的时间
相关文章:
【总结】Maxwell学习笔记
1.Maxwell简介 Maxwell 是一款用Java编写的MySQL变更数据抓取软件,它会实时监控Mysql数据库的数据变更操作(包括insert、update、delete),并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流数据处理平台 官网地址:M…...
AFL fork server和fuzzer的交互
看了一些博客,都是在说fuzzer和fork server进行交互,由fork server fork出子进程来执行程序,但是不太明白这两者到底是如何在代码层面进行交互的。 run_target中有这么一段代码,大概意思是fuzzer给fork server传递prev_timed_out…...
Java SE:多线程(Thread)
1. 线程两个基本概念 并发:即线程交替运行多个指令并行:即多个线程同时运行指令 并发并行不矛盾,两者可同时发生,即多个线程交替运行指令 2. 多线程3种实现方式 2.1 直接创建线程对象 /*** 方式1:* 1. 创建thread类的…...
你敢信?软件测试万能面试脚本他来了?
写在前面: 过春节了,四舍五入接下来马上要年底了,新一波的跳槽旺季马上来临,不知道你是不是已经安于现状,还是蓄势待发呢?最近我和我的哈皮群友们一顿讨论,拟写了大家可能会遇到的面试情况&…...
C++/Python简单练手题
前言 最近需要开始使用python,但是对python了解的并不多,于是先从很早之前刚学C时写过的一些练手题开始,使用python来实现相同的功能,在温习python基础语法的同时,也一起来感受感受python的魅力 99乘法表 c…...
视频在线压缩
video2edit 一款免费的在线视频编辑软件,可以进行视频合并、视频剪辑、视频压缩以及转换视频格式等。 链接地址:在线视频编辑器和转换器 - 编辑,转换和压缩视频文件 打开视频压缩页面,上传想要压缩视频,支持MP4&…...
Python列表的合并、重复、判断与切片操作你学会了吗
1.合并列表 通过 实现 list1 ["佛跳墙", "肠粉", "刀削面", "烤鸭"]list2 [32, 4, 5, 7.43, True]list3 list1 list2print(list3) # [佛跳墙, 肠粉, 刀削面, 烤鸭, 32, 4, 5, 7.43, True] 2.重复输出列表中的元素 通过 * 实…...
Vue(3.3.4)+three.js(0.161.0)实现3D可视化地图
一.前言 由于最近在学习three.js,所以观摩了一下掘金,csdn等网站上的有关这部分的内容,刚好看到一个带你入门three.js——从0到1实现一个3d可视化地图 - 掘金 (juejin.cn),再加上我的专业属性是地理相关,可以说是专业对口…...
瑞吉苍穹外卖如何拓展?已经经过不同公司多轮面试。项目中会问到哪些问题?以及问题如何解决?
别催了,别催了,先收藏吧。 作者大大正在加班加点完成。 文章会尽快发布,关注收藏,尽请期待。 想要加入并查阅作者的知识库可以联系作者 不要白嫖,通过后,附上关注和收藏截图。 已有众多小伙伴加入 目前…...
动态内存分配
目录 存在动态内存分配的原因动态内存函数mallocfreecallocrealloc 常见的动态内存错误C/C程序的内存开辟柔性数组柔性数组的特点柔性数组的使用柔性数组的优势 存在动态内存分配的原因 内存开辟方式,例如: int val 20;在栈空间上开辟四个字节 char arr[10] { 0 …...
【C语言】常见的动态内存管理错误
前言 上一篇介绍了C语言中 动态内存管理函数,本片讲解的是 在我们使用动态内存管理时 常见的错误,一起来看看吧~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 1.对NULL指针的解引⽤操作 错…...
数据结构之二叉树的精讲
𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…...
ETL是什么
一、ETL概念 ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库ÿ…...
华为配置WLAN高密业务示例
配置WLAN高密业务示例 组网图形 图1 配置高密WLAN环境网络部署组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 体育场由于需要接入用户数量很大,AP间部署距离较小,因此AP间的干扰较大,可能导致用户上网网…...
C++——类和对象(1)
1. 类 我们之前提及过C语言是面向过程的语言,其解决问题的方式是关注问题过程,然后逐步解决。而C是面向对象编程,聚焦于对象,依靠多个对象之间的交互关系解决问题。而类这个概念的引入则是面向对象的最深刻体现。 1.1 C中的结构体…...
vue+element ui上传图片到七牛云服务器
本来打算做一个全部都是前端完成的资源上传到七牛云的demo,但是需要获取token,经历了九九八十一难,最终还是选择放弃,token从后端获取(springboot)。如果你们有前端直接能解决的麻烦记得私我哦!…...
学不动系列-git-hooks和husky+lintstage
git-hooks 为了保证提交的代码符合规范,可以在上传代码时进行校验。常用husky来协助进行代码提交时的eslint校验。husky是基于git-hooks来实现,在使用husky之前,我们先来研究一下git-hooks。 构建git-hooks测试项目 需要使用git-hooks就需…...
K8S相关小技巧《四》
需求: 我作为Kubernetes的集群管理员,前一段时间有收到一个需求,需要我创建一个受限访问的用户kubeconfig,提供给跳板机的某用户。 该kubeconfig需要在非Kubernetes节点的某跳板机上由指定的非root用户使用,该用户仅能…...
Delphi 报错 Type androidx.collection.ArraySet is defined multiple times
Delphi 11 建立一个新的 Multi-Device Application 编译成app的时候报错 报错信息 [PAClient Error] Error: E7688 Unable to execute "E:\Program\Java\jdk1.8.0_301\bin\java.exe" -cp "e:\program\embarcadero\studio\22.0\bin\Android\r8-3.3.28.jar"…...
Post请求中文乱码问题
url*************************************这里填写自己请求的网址 response requests.post(url, datajson.dumps(body),headersheader) r response.text print 打印乱码长这样: data:{“code”:0,“data”:{“end”:false,“message”:“{\n “ˆ—¡A”: [“…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...
