Maxwell安装使用

news2024/11/26 22:26:00

​欢迎光临我的博客查看最新文章: https://river106.cn

1、Maxwell简介

Maxwell 是由美国Zendesk开源,用Java编写的MySQL实时抓取软件。读取 MySQL binlogs 并将修改行字段的更新写入 Kafka, Kinesis, RabbitMQ, Google Cloud Pub/Sub 或 Redis (Pub/Sub or LPUSH) 以作为 JSON 的应用程序。
官网:https://maxwells-daemon.io/
github:https://github.com/zendesk/maxwell

安装版本:maxwell-1.29.2
快速开始:https://maxwells-daemon.io/quickstart/

2、安装mysql开启binlog

创建数据库maxwell 用于存储 Maxwell 的元数据,
新增账号maxwell并授权:

GRANT ALL ON maxwell.* TO 'maxwell'@'%' IDENTIFIED BY '12345678';
GRANT  SELECT ,REPLICATION SLAVE , REPLICATION CLIENT  ON . TO maxwell@'%';
flush privileges;

创建测试数据库testdb,创建测试表testuser

CREATE TABLE `testuser` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `user_name` varchar(100) NOT NULL COMMENT '用户名',
  `pswd` varchar(100) NOT NULL COMMENT '密码',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modify_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

3、启动maxwell

方法1:

bin/maxwell --user='maxwell' --password='12345678' --host='127.0.0.1' --producer=stdout

方法2:

cp config.properties.example config.properties

修改config.properties:

producer=stdout
host=127.0.0.1
password=12345678

启动:

bin/maxwell --config config.properties

出现如下报错:

java.lang.RuntimeException: error: unhandled character set ‘utf8mb3’
at com.zendesk.maxwell.schema.columndef.StringColumnDef.charsetForCharset(StringColumnDef.java:61)
at com.zendesk.maxwell.schema.columndef.StringColumnDef.asJSON(StringColumnDef.java:75)
at com.zendesk.maxwell.replication.BinlogConnectorEvent.writeData(BinlogConnectorEvent.java:112)
at com.zendesk.maxwell.replication.BinlogConnectorEvent.buildRowMap(BinlogConnectorEvent.java:162)
at com.zendesk.maxwell.replication.BinlogConnectorEvent.jsonMaps(BinlogConnectorEvent.java:176)
at com.zendesk.maxwell.replication.BinlogConnectorReplicator.getTransactionRows(BinlogConnectorReplicator.java:486)
at com.zendesk.maxwell.replication.BinlogConnectorReplicator.getRow(BinlogConnectorReplicator.java:626)
at com.zendesk.maxwell.replication.BinlogConnectorReplicator.work(BinlogConnectorReplicator.java:178)
at com.zendesk.maxwell.util.RunLoopProcess.runLoop(RunLoopProcess.java:34)
at com.zendesk.maxwell.Maxwell.startInner(Maxwell.java:255)
at com.zendesk.maxwell.Maxwell.start(Maxwell.java:183)
at com.zendesk.maxwell.Maxwell.main(Maxwell.java:286)
00:29:21,008 INFO TaskManager - Stopped all tasks

这个问题是因为MySQL从 5.5.3 开始,用 utf8mb4 编码来实现完整的 UTF-8,其中 mb4 表示 most bytes 4,最多占用4个字节。而原来的utf8则被utf8mb3则代替。
一种解决方案是,将MySQL降级,重新安装5.5.3以下的版本。
另一种方法则是修改maxwell源码。
解压打开,找到有问题的类:com.zendesk.maxwell.schema.columndef.StringColumnDef,加上能识别utf8mb3的语句,重新打包。
打包好的maxwell-1.19.0.jar百度云盘链接: https://pan.baidu.com/s/1t0s_e6d2G1-Z4dM3pSwVXQ?pwd=cs8m 提取码: cs8m 。
替换maxwell/lib/maxwell-1.19.0.jar ,重启即可。

[root@river106 maxwell-1.29.2]# bin/maxwell --config config.properties
Using kafka version: 1.0.0
20:48:10,306 INFO Maxwell - Starting Maxwell. maxMemory: 837287936 bufferMemoryUsage: 0.25
20:48:10,472 INFO Maxwell - Maxwell v1.29.2 is booting (StdoutProducer), starting at Position[BinlogPosition[binlog.000001:1772098], lastHeartbeat=1681476466529]
20:48:10,802 INFO MysqlSavedSchema - Restoring schema id 2 (last modified at Position[BinlogPosition[binlog.000001:987693], lastHeartbeat=1681465703072])
20:48:10,987 INFO MysqlSavedSchema - Restoring schema id 1 (last modified at Position[BinlogPosition[binlog.000001:931603], lastHeartbeat=0])
20:48:11,026 INFO MysqlSavedSchema - beginning to play deltas…
20:48:11,027 INFO MysqlSavedSchema - played 1 deltas in 1ms
20:48:11,067 INFO BinlogConnectorReplicator - Setting initial binlog pos to: binlog.000001:1772098
20:48:11,099 INFO BinaryLogClient - Connected to localhost:3306 at binlog.000001/1772098 (sid:6379, cid:3825)
20:48:11,099 INFO BinlogConnectorReplicator - Binlog connected.

如上说明启动成功!

binlog变更抓取测试
分别新增数据、更新数据、删除数据,观察控制台输出变化

INSERT INTO testdb.testuser (user_name,pswd,create_time,modify_time) VALUES
	 ('testuser','33333',now(),now());
UPDATE testdb.testuser SET pswd='55555' WHERE user_name = 'testuser';
DELETE FROM testdb.testuser WHERE user_name = 'testuser'; 

{“database”:“testdb”,“table”:“testuser”,“type”:“insert”,“ts”:1683336811,“xid”:126263,“commit”:true,“data”:{“id”:12,“user_name”:“testuser”,“pswd”:“33333”,“create_time”:“2023-05-06 09:33:31”,“modify_time”:“2023-05-06 09:33:31”}}
{“database”:“testdb”,“table”:“testuser”,“type”:“update”,“ts”:1683336841,“xid”:126348,“commit”:true,“data”:{“id”:12,“user_name”:“testuser”,“pswd”:“55555”,“create_time”:“2023-05-06 09:33:31”,“modify_time”:“2023-05-06 09:34:01”},“old”:{“pswd”:“33333”,“modify_time”:“2023-05-06 09:33:31”}}
{“database”:“testdb”,“table”:“testuser”,“type”:“delete”,“ts”:1683336847,“xid”:126373,“commit”:true,“data”:{“id”:12,“user_name”:“testuser”,“pswd”:“55555”,“create_time”:“2023-05-06 09:33:31”,“modify_time”:“2023-05-06 09:34:01”}}

4、输出到redis

bin/maxwell --user='maxwell' --password='12345678' --host='127.0.0.1' \
    --producer=redis --redis_host='127.0.0.1' --redis_port=6380 --redis_auth='123456Ab'

或修改config.properties

redis_host=127.0.0.1
redis_port=6380
redis_auth=123456Ab
redis_database=0
redis_key=maxwell
redis_type=pubsub
bin/maxwell --config config.properties

相关配置文档:https://maxwells-daemon.io/producers/#redis

测试发布订阅模式

设置config.properties的redis_type=pubsub
mysql中新增一条数据,redis订阅频道maxwell

127.0.0.1:6380> SUBSCRIBE maxwell
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "maxwell"
3) (integer) 1

1) "message"
2) "maxwell"
3) "{\"database\":\"testdb\",\"table\":\"testuser\",\"type\":\"insert\",\"ts\":1681566124,\"xid\":86540,\"commit\":true,\"data\":{\"id\":8,\"user_name\":\"sssss\",\"pswd\":\"123456\",\"create_time\":\"2023-04-14 23:32:35\",\"modify_time\":\"2023-04-15 21:29:38\"}}"

测试list模式

设置config.properties的redis_type=lpush

127.0.0.1:6380> keys *
1) "foo"
2) "maxwell"
127.0.0.1:6380> LRANGE maxwell 0 10
1) "{\"database\":\"testdb\",\"table\":\"testuser\",\"type\":\"insert\",\"ts\":1681566484,\"xid\":87555,\"commit\":true,\"data\":{\"id\":9,\"user_name\":\"ggggg\",\"pswd\":\"55555\",\"create_time\":\"2023-04-15 21:48:04\",\"modify_time\":\"2023-04-15 21:48:04\"}}"
127.0.0.1:6380> LPOP maxwell
"{\"database\":\"testdb\",\"table\":\"testuser\",\"type\":\"insert\",\"ts\":1681566484,\"xid\":87555,\"commit\":true,\"data\":{\"id\":9,\"user_name\":\"ggggg\",\"pswd\":\"55555\",\"create_time\":\"2023-04-15 21:48:04\",\"modify_time\":\"2023-04-15 21:48:04\"}}"
127.0.0.1:6380> 

通过发布订阅模式,实现数据同步功能,通过list方式可以获取最新的数据的变化和数据变化数量等需求。

5、输出到RabbitMQ

RabbitMQ安装及使用请参考: RabbitMQ安装及简单使用
RabbitMQ中新建exchange:maxwell,类型为:fanout。
修改Maxwell配置config.properties

producer=rabbitmq
rabbitmq_host=127.0.0.1
rabbitmq_port=5672
rabbitmq_user=guest
rabbitmq_pass=guest
rabbitmq_virtual_host=/
rabbitmq_exchange=maxwell
rabbitmq_exchange_type=fanout
rabbitmq_exchange_durable=true

Maxwell相关配置文档:https://maxwells-daemon.io/producers/#rabbitmq
启动服务:

bin/maxwell --config config.properties

6、监控

通过 http 方式获取监控指标,修改config.properties配置如下:

metrics_type=http
metrics_jvm=true
http_port=8080

启动服务:

bin/maxwell --config config.properties

打开浏览器,访问:http://ip:8080/metrics,即可获取到监控指标.

5、Maxwell与Canal 工具对比

1、Maxwell没有Canal那种server+client模式,只有一个server把数据发送到消息队列或redis。
2、Maxwell有一个亮点功能,就是Canal只能抓取最新数据,对已存在的历史数据没有办法处理。而Maxwell有一个bootstrap功能,可以直接引导出完整的历史数据用于初始化,非常好用。
3、Maxwell不能直接支持HA,但是它支持断点还原,即错误解决后重启继续读取数据。
4、Maxwell只支持json格式,而Canal如果用Server+client模式的话,可以自定义格式。
5、Maxwell比Canal更加轻量级。

扩展:
https://toutiao.io/posts/0xfdws/preview

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Aidlux的停车标志检测(可修改为coco 80类目标检测)

●项目名称 基于Aidlux的停车标志检测(可修改为coco 80类目标检测) ●项目简介 本项目在Aidlux上部署检测停车标志检测,并可在源码上修改coco 80类目标检测索引直接检测其他79类目标,可以直接修改、快速移植到自己的项目中。 ●…

【学习笔记】Java——消息队列kafka

kafka 1、Kafka combines three key capabilities:2、kafka是如何工作的:3、Kafka APIS:4、kafka集群 1、Kafka combines three key capabilities: To publish (write) and subscribe to (read) streams of events, including co…

中国游戏等“春”来

对于游戏行业来说,2023年将是压力依旧的一年,但或许也是转型调优的希望之年。 压力在于,互联网流量见顶,用户付费意愿降低,行业整体进入下行周期,彻底进入存量竞争时代。《2022年中国游戏产业报告》显示&a…

相机标定实战之双目标定

相机标定原理 文章目录 相机标定原理前言一、采集图像二、基于Matlab单双目标定流程采集棋盘图 三、基于OpenCV-Python双目标定流程检测棋盘格角点对角点进行亚像素精细化单目标定双目标定双目校正保存标定参数读取标定参数代码示例 参考 前言 相机标定可以说是计算机视觉/机器…

哪个公司的 CEO 不想拥有一个自己的数字克隆?

⚠️ FBI Warning:本文纯属作者自娱自乐,数字人的观点不代表 CEO 本人的观点,请大家不要上当受骗!! 哪个公司的 CEO 不想拥有一个自己的数字克隆? 想象🤔一下,如果 CEO 数字克隆上线…

python基础语法总结

1.打印输出 print(“Hello World”) 在许多大众的编程语言中,需要在每个语句的末尾添加分号,但Python并非如此。Python是一种简洁的编程语言,你不需要添加不必要的字符和语法。在Python中,一条语句结束于一行的结尾(方括号&…

找不到msvcp120dll,无法继续执行代码的修复方法

本教程操作系统:Windows系统、 msvcp120.dll是电脑文件中的dll文件(动态链接库文件)。如果计算机中丢失了某个dll文件,可能会导致某些软件和游戏等程序无法正常启动运行,并且导致电脑系统弹窗报错。 msvcp120.dll文件…

IDEA整合GO并创建module工程

IDEA整合Go 安装包环境配置idea配置并创建test mode 安装包 1.去官网下载对应还的安装包 官网下载地址 我选择下载的window 版本: 直接按照对应的目录,然后点击下一步 环境配置 1.配置go环境变量 在高级环境变量PAHT中添加安装包的**/bin 目录&…

mysql数据库的基础

mysql数据库 一、数据库的基本概念二、关系数据库三、SQL语句增改查删 四、natvicat for mysql软件 一、数据库的基本概念 数据(data) 描述事物的符号记录包括数字、文字、图形、图像、声音、档案记录等以“记录”形式按统一的格式进行存储 表&#x…

基于Java少儿编程网上报名系统设计与实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

sizeof 和 strlen !!!

定义 sizeof()是单目操作符,是可以求变量(类型)所占空间的大小,不在乎内存中存放的是什么,只在乎内存大小 strlen()是函数,是计算字符串的长度的 它从内存的某个位置(可以是字符串开头&#x…

进程管道:pipe调用

在看过高级的popen函数之后&#xff0c;我们再来看看底层的pipe函数。通过这个函数在两个程序之间传递数据不需要启动一个shell来解释请求的命令。它同时还提供了对读写数据的更多控制。pipe函数的原型如下所示&#xff1a; #include <unistd.h> int pipe(int pipefd[2])…

OS的事件机制-Event

Event在OSEK OS中&#xff0c;其实就是一个flag的作用&#xff0c;如果某个TASK执行了&#xff0c;就调用<SetEvent()>把flag就置起来&#xff0c;和这个task关联的另一个TASK也执行了&#xff0c;就可以把flag清掉<ClearEvent>&#xff0c;如果第一个TASK没有执行…

这才是你想了解的Redis

文章简介 redis作为一个基于内存的数据结构存储系统&#xff0c;由于它的灵活性和可拓展性强&#xff0c;在我们日常开发中经常被用作数据库、缓存或者消息代理。本文就从Redis的基本部署使用说到Redis的集群、锁和消息对列 Redis基本使用 一、安装 下载地址&#xff1a;htt…

mySql 储存过程 多个结果返回解析

当需要查询复杂的数据模型并返回多个结果集时&#xff0c;使用 MySQL 存储过程可以有效地优化性能。同时&#xff0c;在开发中使用 Mybatis 可以方便地调用 MySQL 存储过程并获取多个结果集。本文将介绍如何在 Mybatis 中调用 MySQL 存储过程&#xff0c;并获取多个结果集。 1、…

Java并发之原子类

一、原子类简介 1 什么是原子类 Java中提供了一些原子类&#xff0c;原子类包装了一个变量&#xff0c;并且提供了一系列对变量进行原子性操作的方法。原子性的意思是对于一组操作&#xff0c;要么全部执行成功&#xff0c;要么全部执行失败&#xff0c;不能只有其中某几个执…

基础知识学习---牛客网C++面试宝典(三)C/C++基础之面向对象

1、本栏用来记录社招找工作过程中的内容&#xff0c;包括基础知识学习以及面试问题的记录等&#xff0c;以便于后续个人回顾学习&#xff1b; 暂时只有2023年3月份&#xff0c;第一次社招找工作的过程&#xff1b; 2、个人经历&#xff1a; 研究生期间课题是SLAM在无人机上的应…

测试新手百科:Postman简介、安装、入门使用方法详细攻略!

本文关键词&#xff1a;Postman基础 目录 一、Postman背景介绍 二、Postman的操作环境 三、Postman下载安装 四、Postman的基础功能 五、接口请求流程 六、管理用例—Collections 七、身份验证Authentication 一、Postman背景介绍 用户在开发或者调试网络程序或者是网…

【答题】在线答卷-答题系统的微信小程序开发流程详解

用死记硬背的方法学习的学生&#xff0c;面对桌上堆积成厚厚的书本&#xff0c;是否感觉鸭梨山大呢&#xff0c;想着教育却面临着学习成本不小问题&#xff0c;是否感觉各种不便呢&#xff0c;如果对编程代码有感兴趣&#xff0c;不妨试试做一个自己的在线答题系统&#xff0c;…

有效性常见标志词

有效性常见标志词 混淆概念常见标志词 &#xff08; 1 &#xff09; 既然…那么… &#xff08; 2 &#xff09; 也就是说… &#xff08; 3 &#xff09; 很显然… &#xff08; 4 &#xff09; 因为A 就是B…所以… &#xff08; 5 &#xff09; 某主体A 是 &#xff0c;…