1 概述
-
Maxwell 是由美国 Zendesk 开源,用 Java 编写的 MySQL 实时抓取软件。 实时读取MySQL 二进制日志 Binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。
官网地址:http://maxwells-daemon.io/
文档查看地址:http://maxwells-daemon.io/quickstart/ -
Maxwell的原理:了解Maxwell的原理,需要了解Mysql的主从复制过程。
-
mysql的主从复制过程:Master 主库将改变记录,写到二进制日志(binary log)中,Slave 从库向 mysql master 发送 dump 协议,将 master 主库的 binary log events (binlog)拷贝到它的中继日志(relay log);Slave 从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。
-
MySQL 的二进制日志(binlog)可以说 MySQL 最重要的日志了,它记录了所有的 DDL 和 DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL 的二进制日志是事务安全型的。
一般来说开启二进制日志大概会有 1%的性能损耗。二进制有两个最重要的使用场景: 其一:MySQL Replication 在 Master 端开启 binlog,Master 把它的二进制日志传递给 slaves 来达到 master-slave 数据一致的目的。其二:自然就是数据恢复了,通过使用 mysqlbinlog 工具来使恢复数据。二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的 DDL 和 DML(除了数据查询语句)语句事件。
-
mysql binlog 的格式有三种,分别是 statement,row,mixed。要使用maxwell做监控分析,使用row模式最合适,因为statement模式记录的是sql语句,可能导致数据的不一致;而mixed模式又记录sql语句又记录实际数据,在进行重播的时候需要进行判断,会导致性能下降。
-
maxwell的原理:把自己伪装成 MySQL 的一个 slave,然后以 slave的身份假装从 MySQL(master)复制数据。
-
-
maxwell的输出数据格式:其中xid是事务id,ts是时间戳。
2 Maxwell使用
2.1 Maxwell安装
-
安装kafka、mysql
-
解压maxwell压缩包
-
修改 mysql 的配置文件,开启 MySQL Binlog 设置
atguigu@hadoop102 software]$ sudo vim /etc/my.cnf1. 在[mysqld]模块下添加一下内容 [mysqld] server_id=1 log-bin=mysql-bin binlog_format=row #binlog-do-db=test_maxwell # 可以用于指定启用binlog的数据库2. 并重启 Mysql 服务 [atguigu@hadoop102 software]$ sudo systemctl restart mysqld3. 登录 mysql 并查看是否修改完成 [atguigu@hadoop102 ~]$ mysql -uroot -p123456 mysql> show variables like '%binlog%';4. 查看下列属性 binlog_format | ROW5. 进入/var/lib/mysql 目录,查看 MySQL 生成的 binlog 文件。注:MySQL 生成的 binlog 文件初始大小一定是 154 字节,然后前缀是 log-bin 参数配置的,后缀是默认从.000001,然后依次递增。除了 binlog 文件文件以外,MySQL 还会额外生产一个.index 索引文件用来记录当前使用的 binlog 文件。 [atguigu@hadoop102 ~]$ cd /var/lib/mysql [atguigu@hadoop102 mysql]$ sudo ls -l 总用量 188500 -rw-r-----. 1 mysql mysql 154 11 月 17 16:30 mysql-bin.000001 -rw-r-----. 1 mysql mysql 19 11 月 17 16:30 mysql-bin.index
-
在 MySQL 中建立一个 maxwell 库用于存储 Maxwell 的元数据
# 创建数据库maxwell mysql> CREATE DATABASE maxwell; # 设置 mysql 用户密码安全级别,这一步可以省略,但是在设置账号密码的时候密码就不能太简单 mysql> set global validate_password_length=4; mysql> set global validate_password_policy=0; # 分配一个账号maxwell可以操作该数据库,%表示maxwell用户可以在任何节点上访问maxwell数据库 mysql> GRANT ALL ON maxwell.* TO 'maxwell'@'%' IDENTIFIED BY'123456'; # 分配maxwell账号对所有数据库的数据表具有主从复制的权限 mysql> GRANT SELECT ,REPLICATION SLAVE , REPLICATION CLIENT ON *.* TO maxwell@'%'; # 刷新 mysql 表权限 mysql> flush privileges;
-
修改maxwell配置文件名称
cp config.properties.example config.properties
-
修改maxwell配置文件中的配置(这里以配置数据发送到kafka为例)
# 配置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 kafka_topic=maxwell# Mysql相关配置 host=hadoop102 user=maxwell password=maxwell jdbc_options=useSSL=false&serverTimezone=Asia/Shanghai
2.2 Maxwell使用
-
由于前面配置maxwell的数据发送到kafka,因此要先确保kafka集群为启动状态
-
启动maxwell的命令,当mysql数据发生变化之后,kafka中就会有相应的数据
bin/maxwell --config config.properties --daemon
-
停止maxwell的命令
ps -ef | grep maxwell | grep -v grep maxwell | awk '{print $2}' | xargs kill -9
-
maxwell启停脚本
#!/bin/bashMAXWELL_HOME=/opt/module/maxwellstatus_maxwell(){result=`ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep | wc -l` }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 maxwell | grep -v grep maxwell | awk '{print $2}' | xargs kill -9elseecho "Maxwell未在运行"fi }case $1 instart )start_maxwell;;stop )stop_maxwell;;restart ) stop_maxwellstart_maxwell;; esac
-
maxwell的数据全量同步操作:可以把指定数据库的指定数据表的数据全部取出并输出到指定位置,注意输出的首条数据和最后一条数据是空数据,仅作为开始和结束的标志;每条数据的时间戳是启动maxwell-bootstrap的时间。
bin/maxwell-bootstrap --database gmall --table user_info config.properties