首页 > 其他分享 >26-Maxwell

26-Maxwell

时间:2023-08-07 23:44:58浏览次数:43  
标签:binlog 26 -- Maxwell bootstrap maxwell MySQL

官网地址:http://maxwells-daemon.io/

Maxwell 是由美国 Zendesk 公司开源,使用 Java 编写的 MySQL 变更数据抓取软件。它会实时监控 Mysql 数据库的数据变更操作(包括 insert、update、delete),并将变更数据以 JSON 的格式发送给 Kafka、Kinesi 等流数据处理平台。

1. Maxwell 工作原理

1.1 MySQL 主从复制

  • Master 主库将改变记录写到二进制日志(binary log)中
  • Slave 从库向 Master 发送 dump 协议,将 Master 主库的 binary log events 拷贝到它的中继日志(relay log);
  • Slave 从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。

1.2 MySQL 的 binlog

MySQL 的二进制日志可以说 MySQL 最重要的日志了,它记录了所有的 DDL 和 DML 语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL 的二进制日志是事务安全型的。一般来说开启二进制日志大概会有 1%的性能损耗。

(1)binlog 有两个最重要的使用场景

  1. MySQL Replication 在 Master 端开启 binlog,Master 把它的二进制日志传递给 Slaves 来达到主从数据一致的目的。
  2. 用于数据恢复,通过使用 mysqlbinlog 工具来使恢复数据。

(2)binlog 包括两类文件

  • 二进制日志索引文件(文件名后缀为 .index)用于记录所有的二进制文件
  • 二进制日志文件(文件名后缀为 .00000*)记录数据库所有的 DDL 和 DML 语句事件

(3)binlog 模式介绍

模式 说明 补充 优点 缺点
statement 基于语句 binlog 会记录所有写操作的 SQL 语句,包括 insert、update、delete 等。 节省空间 有可能造成数据不一致,如 insert 中包含 now() 函数。
row 基于行 binlog 会记录每次写操作的被操作行记录的变化 保持数据的绝对一致性 占用较大空间
mixed 混合模式 默认是 statement-based,如果 SQL 可能导致数据不一致,就自动切换到 row-based。 节省空间,同时兼顾了一定的一致性。 还有些极个别情况依旧会造成不一致,另外 statement 和 mixed 对于需要对 binlog 监控的情况都不方便。

(4)修改 MySQL 的配置文件 /etc/my.cnf 以开启 binlog

[mysqld]
# 数据库id
server-id=1
# 启动binlog,该参数的值会作为binlog的文件名前缀
log-bin=mysql-bin
# binlog类型,Maxwell要求binlog采用Row-based模式
binlog_format=row
# 启动binlog的数据库,多个数据库需要配置多次该属性
binlog-do-db=gmall
binlog-do-db=test

1.2 Maxwell 工作原理

Maxwell 的工作原理很简单,就是把自己伪装成 MySQL 的一个 Slave,然后以 Slave 的身份假装从 MySQL Master 复制数据。

Maxwell 和 Canal 简单对比:

  • Maxwell 没有 Canal server+client 模式,只有一个 server 把数据发送到 MQ 或 Redis。但 Maxwell 有一个亮点功能,就是 Canal 只能抓取最新数据,对已存在的历史数据没有办法处理,而 Maxwell 有一个 bootstrap 功能可以直接引导出完整的历史数据用于初始化,非常好用。
  • Canal 支持 HA,Maxwell 不能直接支持 HA,但是它支持断点还原,即错误解决后重启继续上次点儿读取数据(其实就是会 Maxwell 元数据库生成对应的 position 信息,通过记录 binlog 的 position 位点来实现断点还原)。而 Canal 则是单纯的依靠 binlog 的 position 位点记录,解析 binlog 发送到 Kafka 或其他组件。
  • Maxwell 只支持 json 格式,而 Canal 如果用 server+client 模式的话,可以自定义格式。
  • Maxwell 比 Canal 更加轻量级。使用场景上也相对单一,定位就是 Mysql=>Kafka,部署很方便,适合短时间内项目快速迭代的场景。

2. Maxwell 安装部署

2.1 基础环境

(1)上传 maxwell-1.29.2.tar.gz 到 /opt/software 下并解压到 /opt/module(1.30开始之后的版本要求 JDK11)

(2)开启 MySQL binlog 设置

(3)初始化 Maxwell 元数据库

# 创建一个数据库用于存储Maxwell的元数据
mysql> CREATE DATABASE maxwell;
Query OK, 1 row affected (0.00 sec)

# 创建maxwell用户来操作该数据库
mysql> create user 'maxwell'@'%' identified by 'maxwell';
Query OK, 0 rows affected (0.01 sec)

# 分配maxwell库的所有权限给maxwell用户
mysql> grant all on maxwell.* to 'maxwell'@'%';
Query OK, 0 rows affected (0.00 sec)

# 分配这个账号可以监控其他数据库的权限
mysql> grant select, replication client, replication slave on *.* to 'maxwell'@'%';
Query OK, 0 rows affected (0.00 sec)

# 刷新权限
mysql> flush privileges;

2.2 启动方式

a. 命令行参数

$ bin/maxwell --user='maxwell' --password='maxwell' --host='localhost' --producer=stdout

启动示例:

这个报错的字符集就是我创建 gmall 时候选中的字符集。

错误原因是 Maxwell 不支持 utf8mb3,下载源码打开 StringColumnDef 类:

然后重新打包上传即可。还有点需要注意,这个打包时候环境得是 JDK11。

在这里我只是想简单测试下 Maxwell 使用而已,所以我把 gmall 库删掉重建,字符集选 utf8mb4。但这时候直接重新启动 Maxwell 还是会报错,因为 binlog 中还存有之前那些操作的日志。所以还需要如下两步操作:

  1. MySQL 命令行执行 RESET MASTER;(或者把 binlog 日志都删了)
  2. 清空 Maxwell 元数据库中的数据

再启动就没问题了。

b. 配置文件

[root@centos7 maxwell-1.29.2]$ mv config.properties.example config.properties
[root@centos7 maxwell-1.29.2]$ vim config.properties
-----------------------------
log_level=info

producer=kafka
kafka.bootstrap.servers=hadoop102:9092,hadoop103:9092,hadoop104:9092
kafka_topic=maxwell

host=hadoop103
user=maxwell
password=maxwell
-----------------------------
# 前台启动
[root@centos7 maxwell-1.29.2]$ bin/maxwell --config ./config.properties
# 以守护进程方式启动maxwell
[root@centos7 maxwell-1.29.2]$ bin/maxwell --config ./config.properties --daemon

启动后可通过启动 Kafka 消费者观察同步情况:

停止 Maxwell:

[root@centos7 maxwell-1.29.2]$ ps -ef | grep maxwell | grep -v grep | grep maxwell | awk '{print $2}' | xargs kill -9

2.3 启停脚本

maxwell.sh

#!/bin/bash

MAXWELL_HOME=/opt/module/maxwell-1.29.2

status_maxwell(){
    result=`ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep | wc -l`
    return $result
}

start_maxwell(){
    status_maxwell
    if [[ $? -lt 1 ]]; then
        echo "启动Maxwell"
        $MAXWELL_HOME/bin/maxwell --config $MAXWELL_HOME/config.properties --daemon
    else
        echo "Maxwell正在运行"
    fi
}

stop_maxwell(){
    status_maxwell
    if [[ $? -gt 0 ]]; then
        echo "停止Maxwell"
        ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep | awk '{print $2}' | xargs kill -9
    else
        echo "Maxwell未在运行"
    fi
}

case $1 in
    start )
        start_maxwell
    ;;
    stop )
        stop_maxwell
    ;;
    restart )
       stop_maxwell
       start_maxwell
    ;;
esac

3. Maxwell 入门案例

3.1 监控 MySQL

a. 输出到 stdout

b. 输出到 kafka

Kafka 主题数据的分区控制

在公司生产环境中,我们一般都会用 Maxwell 监控多个 mysql 库的数据,然后将这些数据发往 Kafka 的一个主题 Topic,并且这个主题也肯定是多分区的,为了提高并发度。那么如何控制这些数据的分区问题,就变得至关重要。

3.2 监控 MySQL 指定表

3.3 历史数据全量同步

我们已经实现了使用 Maxwell 实时增量同步 MySQL 变更数据的功能。但是,有时候只有增量数据是不够的,我们可能需要使用到Mysql数据库中从历史至今的一个完整的数据集。这就需要问哦们在进行增量同步之前,选进行一次历史数据全量同步。这样就能保证得到一个完整的数据库。

【需求】将 test_maxwell 库下的 test2 表的四条数据,全量导入到 Maxwell 控制台进行打印。

a. bootstrap 表记录

Maxwell 进程默认只能监控 mysql 的 binlog 日志的新增及变化的数据,但是 Maxwell 是支持数据初始化的,可以通过修改 Maxwell 的元数据,来对 MySQL 的某张表进行数据初始化,也就是我们常说的全量同步。

(1)修改 Maxwell 的元数据,触发数据初始化机制,在 mysql 的 maxwell 库中 bootstrap 表中插入一条数据,写明需要全量数据的库名和表名。

mysql> insert into maxwell.bootstrap(database_name,table_name) values('test','test_maxwell');

(2)启动 maxwell 进程

[liujiaqi@hadoop102 maxwell-1.29.2]$ bin/maxwell --config config.properties --daemon

logs/MaxwellDaemon.out 查看日志输出:

consumer 消费 maxwell 情况:

(3)当数据全部初始化完成以后,刚刚插入的记录的某些字段会发生变化。

  • is_complete 字段从 0 变为 1
  • start_at 字段从 null 变为具体时间(数据同步开始时间)
  • complete_at 字段从 null 变为具体时间(数据同步结束时间)

b. bootstrap 命令

(1)Maxwell 提供了 bootstrap 功能来进行历史数据的全量同步(前提要有一个已经在运行的 maxwell 程序!)

[liujiaqi@hadoop102 maxwell-1.29.2]$ bin/maxwell-bootstrap --database test --table test_maxwell_bootstrap --config config.properties
connecting to jdbc:mysql://hadoop103:3306/maxwell?allowPublicKeyRetrieval=true&connectTimeout=5000&zeroDateTimeBehavior=convertToNull
[liujiaqi@hadoop102 maxwell-1.29.2]$ 

(2)查看 consumer 消费 maxwell 情况

  • 第一条 type 为 bootstrap-start 和最后一条 type 为 bootstrap-complete 的数据,是 bootstrap 开始和结束的标志,不包含数据,中间的 type 为 bootstrap-insert 的才包含数据。
  • 一次 bootstrap 输出的所有记录的 ts 都是相同的,为 bootstrap 开始的时间。

(3)查看 bootstrap 表,已新增一条记录。

标签:binlog,26,--,Maxwell,bootstrap,maxwell,MySQL
From: https://www.cnblogs.com/liujiaqi1101/p/17613049.html

相关文章

  • day26
    一、[GDOUCTF2023]pixelart1.得到一张png,放大后隐约可以看到有flag的形状,同时010查看,在文件源码的末尾发现了一个类似于宽乘高的两个数字,再查看原图片的宽高,发现就是宽高缩小到原来的十二分之一2.写个脚本提取像素,十二为一组点击查看代码fromPILimportImageimg=Imag......
  • AP5126 DC-DC降压恒流 LED摩托电动汽车灯IC 同款LN2576/LN2556
    产品描述 AP5126是一款PWM工作模式,高效率、外围简单、内置功率管,适用于12-80V输入的高精度降压LED恒流驱动芯片。输出最大功率可达15W,最大电流1.2A。AP5126可实现全亮/半亮功能切换,通过MODE切换:全亮/半亮/循环模式。AP5126工作频率固定在140KHZ,同时内置抖频电......
  • /lib64/libstdc++.so.6: version `GLIBCXX_3.4.26' not found
    原因使用的gcc没有找到对应的glib库。每个版本的glib都会有改变,所以使用的时候必须匹配。大部分是因为自己编译升级了gcc,再用新的gcc编译程序时没有找到当时匹配的类库。查找原因报错提示很明确了,/lib64/libstdc++.so.6中没有找到GLIBCXX_3.4.26版本内容。正常情况/lib64/lib......
  • 前端 Vue 应该知道的一些东西,个人笔记 2021-11-26
    前端代码编写规范及es6常用语法命名规范文件夹名称,文件名称,组件名称,统一使用大驼峰或者小横线方式命名;组件文件名:list-item.vue.或者ListItem.vue;基础的无状态的通用组件加VBaseApp前缀BaseButtonAppButton在html中<base-button>或者<BaseButton>url路径名:小......
  • sg90舵机+esp8266+点灯科技 小爱语音控制开关灯
    这是网上做烂了好几年的项目好久前就看到了今天实现下关于智能开关什么通断器+凌动开关什么绿米开关不买单火控制这些都不实际原有家庭电路如果真加上这些是一笔不小的开销真要实现建议从装修房子布线家庭电路前就考虑好避免二次加工这里适合自己房间或学校寝室使用......
  • 如何在轻量级RTSP服务支持H.264扩展SEI发送接收自定义数据?
    为什么开发轻量级RTSP服务?开发轻量级RTSP服务的目的是为了解决在某些场景下用户或开发者需要单独部署RTSP或RTMP服务的问题。这种服务的优势主要有以下几点:便利性:通过轻量级RTSP服务,用户无需配置单独的服务器,降低了部署和配置的复杂性(无论是走RTMP还是GB28181,均需要平台服务支撑)。......
  • 最完美WIN11_Pro_22H2.22631.2129软件选装纯净版VIP51.3
    【系统简介】=============================================================1.本次更新母盘来自UUP_WIN11_Pro_22H2.22631.2129。进一步精简优化调整。2.只为呈现最好的作品,手工精简优化部分较多。3.OS版本号为22631.2129。个别要求高的就下MSDN吧,里面啥功能都有。4.集成《DrvCeo......
  • P4426 [HNOI/AHOI2018] 毒瘤 题解
    P4426[HNOI/AHOI2018]毒瘤题解非常好虚树题目,融合了容斥的内容。简化题意给定一张\(n\)个点、\(m\)条边的图,求图的独立集个数。其中\(n\leq10^5\),\(n-1\leqm\leqn+10\)。独立集:对于图\(G(U,E)\)的一个点集\(S\),\(\forall(u,v)\inE\),不存在\(u\inS\)且......
  • 【华秋推荐】物联网入门学习模块 ESP8266
    随着全球信息技术的不断进步和普及,物联网成为当今备受关注的技术热点之一。通过物理和数字设备之间的连接来实现自动化和互联互通的网络。无线传感器、云计算和大数据分析等技术,物联网使设备能够相互交流和共享信息,实现智能化的自动化操作。它连接着各种物体,实现物与物的互联互通......
  • 26. 删除有序数组中的重复项
    26.删除有序数组中的重复项![image-20230803210215410](D:\BaiduSyncdisk\C++\笔记图片\26.删除有序数组中的重复项1.png)题目:给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回......