MaxWell 高级教程

一、概述

1、定义

Maxwell 是由美国 Zendesk 开源,用 Java 编写的 MySQL 实时抓取软件。 实时读取 MySQL 二进制日志Binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、 RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。

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

2、工作原理

(1) MySQL 主从复制过程

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

(2)Maxwell的工作原理

Maxwell 的工作原理就是把自己伪装成MySQL的一个slave,然后以slave 的身份假装从MySQL(master)复制数据。

(3)MySQL 的binlog

1) 什么是binlog

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

二进制有两个最重要的使用场景:

  • 其一:MySQL Replication在Master端开启binlog,Master 把它的二进制日志传递给slaves 来达到master-slave 数据一致的目的。

  • 其二:数据恢复,通过使用mysqlbinlog工具来使恢复数据。
    二进制日志包括两类文件:

  • 二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,

  • 二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。

2) binlog的开启

MySQL配置文件的位置

  • Linux: /etc/my.cnf 如果/etc目录下没有,可以通过locate my.cnf查找位置
  • Windows: \my.ini

在mysql的配置文件下,修改配置 在**mysqld** 区块,添加 log-bin=mysql-bin 这个表示binlog日志的前缀是mysql-bin,以后生成的日志文件就是 mysql-bin.000001 的文件后面的数字按顺序生成,每次mysql重启或者到达单个文件大小的阈值时,新生一个 文件,按顺序编号。

3) binlog的分类设置

mysql的binlog格式有三种,分别是STATEMENT,MIXED,ROW。 在配置文件中可以选择配置 binlog_format= statement|mixed|row

三种格式的区别:

a、statement 语句级

binlog会记录每次一执行写操作的语句。 相对row模式节省空间,但是可能产生不一致性,比如 update test set create_date=now(); 如果用binlog日志进行恢复,由于执行时间不同可能产生的数据就不同。

优点: 节省空间 缺点: 有可能造成数据不一致。

b、row 行级

binlog会记录每次操作后每行记录的变化。

优点:保持数据的绝对一致性。因为不管sql是什么,引用了什么函数,他只记录执行后的效果。 缺点:占用较大空间。

c、mixed 混合级别

statement的升级版,一定程度上解决了statement模式因为一些情况而造成的数据不一致问题。

默认还是statement,在某些情况下,譬如:

  • 当函数中包含 UUID() 时;
  • 包含 AUTO_INCREMENT 字段的表被更新时;
  • 执行 INSERT DELAYED 语句时;
  • 用 UDF 时;

会按照 ROW的方式进行处理

优点:节省空间,同时兼顾了一定的一致性。 缺点:还有些极个别情况依旧会造成不一致,另外statement和mixed对于需要对 binlog监控的情况都不方便。

二、Maxwell使用

1、安装

下载地址https://github.com/zendesk/maxwell/tags注意:在1.30.0版本及以后,对jdk的要求要高于jdk8

(1)上传并解压

tar -zxvf maxwell-1.29.2.tar.gz -C /opt/module/

(2)MySQL环境准备

1)Binlog设置

修改mysql的配置文件,开启MySQL Binlog设置

sudo vim /etc/my.cnf

mysqld模块下添加一下内容

mysqld

server_id=1

log-bin=mysql-bin

binlog_format=row

需要监控的库

binlog-do-db=test_maxwell

并重启Mysql服务

sudo systemctl restart mysqld

登录mysql并查看是否修改完成

mysql -uroot -p123456

mysql> show variables like '%binlog%';

查看下列属性

binlog_format | ROW

win:

2)查看binlog文件

进入/var/lib/mysql目录,查看MySQL生成的binlog文件

注:MySQL生成的binlog文件初始大小一定是154字节,前缀是log-bin参数配置的,后缀是默认从.000001,然后依次递增。除了binlog文件文件以外,MySQL还会额外生产一个.index索引文件用来记录当前使用的binlog文件。

(3)初始化Maxwell元数据库

1)在MySQL中建立Maxwell的元数据

CREATE DATABASE maxwell;

2)创建账号

分配一个账号可以操作该数据库

GRANT ALL ON maxwell.* TO 'maxwell'@'%' IDENTIFIED BY '123456';

GRANT SELECT ,REPLICATION SLAVE , REPLICATION CLIENT ON *.* TO maxwell@'%';

刷新mysql表权限

flush privileges;

(4)启动Maxwell

1)方式一:前台启动

bin/maxwell --user='maxwell' --password='123456' --host='192.168.10.139' --producer=stdout

参数说明:

--user 连接mysql 的用户

--password 连接mysql 的用户的密码

--host mysql 安装的主机名

--producer 生产者模式(stdout:控制台 kafka:kafka集群)
启动:

bin/maxwell --user='root' --password='root' --host='192.168.10.139' --producer=stdout --jdbc_options='serverTimezone=Asia/Shanghai&useSSL=false'

2)后台启动

修改配置文件,复制config.properties.example 为config.properties

producer=stdout

host=192.168.10.139

user=root

password=root

jdbc_options=serverTimezone=Asia/Shanghai&useSSL=false
启动

bin/maxwell --config ./config.properties

2、入门案例

监控Mysql数据并在控制台打印

(1)插入数据

向mysql的test_maxwell 库的 test 表插入一条数据,查看maxwell的控制台输出

{

"database": "test_maxwell", --库名

"table": "test", --表名

"type": "insert", --数据更新类型

"ts": 1776495784, --操作时间

"xid": 1843, --操作id

"commit": true, --提交成功

"data": { --数据

"id": 1,

"name": "lisi"

}

}

(2)修改数据

{

"database": "test_maxwell",

"table": "test",

"type": "update", -- 操作类型

"ts": 1776496041,

"xid": 2408,

"commit": true,

"data": { -- 新的数据

"id": 1,

"name": "wangwu"

},

"old": { -- 旧的数据

"name": "lisi"

}

}

(3)删除数据

{

"database": "test_maxwell",

"table": "test",

"type": "delete", -- 操作类型 删除

"ts": 1776496107,

"xid": 2559,

"commit": true,

"data": { -- 删除的数据

"id": 1,

"name": "wangwu"

}

}

三、数据输出

1、数据输出到Kafka

(1)启动zookeeper和Kafka

(2)启动Maxwell监控

bin/maxwell --user='root' --password='root' --host='192.168.10.139' --jdbc_options='serverTimezone=Asia/Shanghai&useSSL=false' --producer=kafka --kafka.bootstrap.servers=hd01:9092 --kafka_topic=maxwell

--kafka.bootstrap.servers:kafka服务地址

--kafka_topic:主题

(3)向test_maxwell库的test表再次插入一条数据

insert into test values (2,'李四');

(4)通过kafka消费者来查看到了数据,说明数据成功传入kafka

(5)kafka主题数据的分区控制

在生产环境中,一般会用maxwell监控多个mysql库的数据,将这些数据发往kafka的一个主题Topic,为了提高并发度这个主题也是多分区的。

实现步骤如下:

1)修改maxwell的配置文件,定制化启动maxwell进程

producer=kafka

kafka.bootstrap.servers=hd01:9092

mysql login info

host=192.168.10.139
user=root
password=root

kafka_topic=maxwell

控制数据分区模式,可选模式有 库名,表名,主键,列名

What part of the data do we partition by?

#producer_partition_by=database # database, table, primary_key, transaction_id, thread_id, column
producer_partition_by=database

2)手动创建一个3个分区的topic,名字就叫做maxwell

kafka-topics.sh --zookeeper hd01:2181,hd02:2181,hd03:2181/kafka --create --replication-factor 2 --partitions 3 --topic maxwell

3)利用配置文件启动Maxwell进程

bin/maxwell - config ./config.properties

4)向test_maxwell库的test表再次插入一条数据

insert into test_maxwell.test values (3,'hello');

5)通过kafka tool工具查看,此条数据进入了maxwell主题的几号分区

2、指定表数据输出控制台

(1)运行maxwell来监控mysql指定表数据更新

bin/maxwell --user='root' --password='root' --host='192.168.10.139' \

--jdbc_options='serverTimezone=Asia/Shanghai&useSSL=false' \

--filter='exclude:*.*,include:test_maxwell.test' \

--producer=stdout

(2)向test_maxwell.test 表插入一条数据,查看maxwell的监控

insert into test_maxwell.test values(3,'李四');

{

"database": "test_maxwell",

"table": "test",

"type": "insert",

"ts": 1776498984,

"xid": 8829,

"commit": true,

"data": {

"id": 1,

"name": "lisi"

}

}

(3)向test_maxwell.test2 表插入一条数据,查看maxwell的监控

insert into test2 values(1,'李四');

没有收到任何信息 说明include参数生效,只能监控指定的mysql表的信息

注:还可以设置include:test_maxwell.*,通过此种方式来监控mysql某个库的所有表。

3、数据初始化

**指定表全量数据输出控制台;**Maxwell 进程默认只能监控 mysql 的 binlog 日志的新增及变化的数据,但是 Maxwell 是支持数据初始化的,可以通过修改Maxwell的元数据,来对MySQL的某张表进行数据初始化,

具体操作步骤如下: 需求:将test_maxwell 库下的test2表的四条数据,全量导入到maxwell控制台进行打印。

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

insert into maxwell.bootstrap(database_name,table_name) values('test_maxwell','test2');

(2)启动maxwell进程,初始化程序会直接打印test2表的所有数据

bin/maxwell --user='root' --password='root' --host='192.168.10.139' \

--jdbc_options='serverTimezone=Asia/Shanghai&useSSL=false' \

--producer=stdout

(3)当数据全部初始化完成以后,Maxwell的元数据会变化

  • is_complete 字段从 0 变为1
  • start_at 字段从 null 变为具体时间(数据同步开始时间)
  • complete_at 字段从 null 变为具体时间(数据同步结束时间)
相关推荐
流星白龙4 小时前
【MySQL高阶】7.MySQL日志
数据库·mysql·adb
流星白龙4 小时前
【MySQL高阶】0.MySQL的安装
数据库·mysql·adb
流星白龙6 小时前
【MySQL高阶】6.MySQL数据目录,日志
android·mysql·adb
流星白龙7 小时前
【MySQL高阶】2.MySQL命令行客户端(2)
android·mysql·adb
流星白龙7 小时前
【MySQL高阶】5.MySQL服务器简介
服务器·mysql·adb
流星白龙7 小时前
【MySQL高阶】9.在一台机器上运行多个MySQL实例
数据库·mysql·adb
流星白龙9 小时前
【MySQL高阶】8.MySQL系统库
android·mysql·adb
亚空间仓鼠3 天前
Docker容器化高可用架构部署方案(十七)
adb
AI人工智能+电脑小能手3 天前
【大白话说Java面试题 第80题】【Mysql篇】第10题:MySQL 在什么条件下索引失效?
java·开发语言·mysql·adb·面试
会Tk矩阵群控的小木3 天前
深入解析tk矩阵系统ADB实时投屏与多设备控制实现
运维·线性代数·adb·矩阵·个人开发