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 变为具体时间(数据同步结束时间)
相关推荐
seabirdssss1 天前
Flutter 开发环境配置
android·windows·flutter·adb
不会写DN1 天前
如何排查 MySQL 慢查询
数据库·mysql·adb
su_ym81101 天前
adb原理及常用命令介绍
adb
REDcker1 天前
Android ADB 命令教程与速查
android·adb
l1o3v1e4ding1 天前
排查linux CentOS7.6的mysql(5.7.27)内存泄漏因OOM被系统kill的问题
linux·mysql·adb
java资料站1 天前
Docker 快速部署 MySQL 主从复制(一主一从)
mysql·adb·docker
Trouvaille ~2 天前
【MySQL】视图:虚拟表的妙用
数据库·mysql·adb·面试·数据处理·后端开发·视图
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.2 天前
MySQL高可用集群实战:MHA搭建全攻略
android·mysql·adb
姓王名礼2 天前
如果CentOS系统时间正确但MySQL数据库时间不正确
adb