当前位置: 首页 > news >正文

【总结】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 应用场景

  1. 做数据库的热备:主数据库服务器故障后,可切换到从数据库继续工作。
  2. 读写分离:主数据库只负责业务数据的写入操作,而多个从数据库只负责业务数据的查询工作,在读多写少场景下,可以提高数据库工作效率

2.2.2 工作原理

  1. Master主库将数据变更记录,写到二进制日志(binary log)中
  2. Slave从库向mysql master发送dump协议,将master主库的binary log events拷贝到它的中继日志(relay log
  3. 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&#xf…...

视频在线压缩

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),再加上我的专业属性是地理相关,可以说是专业对口&#xf…...

瑞吉苍穹外卖如何拓展?已经经过不同公司多轮面试。项目中会问到哪些问题?以及问题如何解决?

别催了,别催了,先收藏吧。 作者大大正在加班加点完成。 文章会尽快发布,关注收藏,尽请期待。 想要加入并查阅作者的知识库可以联系作者 不要白嫖,通过后,附上关注和收藏截图。 已有众多小伙伴加入 目前…...

动态内存分配

目录 存在动态内存分配的原因动态内存函数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一词较常用在数据仓库&#xff…...

华为配置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”: [“…...

vscode里如何用git

打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

XCTF-web-easyupload

试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

浅谈不同二分算法的查找情况

二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况&#xf…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...