Maxwell

一、Maxwell简介

1、概述

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

2、Maxwell输出数据格式

Maxwell输出数据格式为JSON

Maxwell输出的数据有databases变更数据所属的数据库table数据表type数据变更类型ts变更时间xid事务idcommit事务提交标志data为插入/修改/删除的数据old为修改前的数据。

3、Maxwell原理

        实时读取Mysql数据库的二进制日志(Binlog),从中获取变更数据,再将变更数据以JSON格式发送至Kafka等流处理平台。

        Maxwell将自己伪装成slave,并遵循MySQL主从复制的协议,从master同步数据。

3.1)MySQL二进制日志

        二进制日志(Binlog)是MySQL服务端非常重要的一种日志,它会保存MySQL数据库的所有数据变更记录。Binlog的主要作用包括主从复制和数据恢复。

二、Mxawell安装

1、下载安装包

下载地址:https://github.com/zendesk/maxwell/releases/download/v1.29.2/maxwell-1.29.2.tar.gz

Maxwell-1.30.0及以上版本不再支持JDK1.8。

2、将安装包上传到主节点的/opt/software目录(或者自己的软件安装包目录)

3、将安装包解压至/opt/module目录

先进入到安装包所在的目录:cd /opt/software

解压:tar -zxvf maxwell-1.29.2.tar.gz -C /opt/module/

4、修改名称

cd /opt/module

mv maxwell-1.29.2/ maxwell

三、配置MySQL

1、启用MySQL Binlog

MySQL服务器的Binlog默认是开启的,如需进行同步,需要先进行开启。

修改MySQL配置文件/etc/my.cnf

sudo vim /etc/my.cnf

增加以下内容:

#数据库id
server-id = 1
#启动binlog,该参数的值会作为binlog的文件名
log-bin=mysql-bin
#binlog类型,maxwell要求为row类型
binlog_format=row
#启用binlog的数据库,需根据实际情况作出修改
binlog-do-db=gmall

MySQL Binlog模式:

Row-based:基于行,Binlog会记录每次写操作后被操作行记录的变化。

优点:保持数据的绝对一致性

缺点:占用较大空间

//Maxwell要求Binlog采用Row-based模式

2、重启MySQL服务

systemctl restart mysqld

3、创建Maxwell所需数据库和用户

        Maxwell需要在MySQL中存储 其运行过程中的所需的一些数据,包括binlog同步的断电位置等,故需要再MySQL为Maxwell创建数据库及用户。

3.1)登录进入mysql

mysql -u 用户名 -p

3.2)创建数据库

CREATE DATABASE maxwell;

3.3)创建Maxwell用户并赋予其必要权限

CREATE USER 'maxwell'@'%' IDENTIFIED BY 'maxwell';

GRANT ALL ON maxwell.* TO 'maxwell'@'%';

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

3.3)刷新权限

flush   privileges;

4、配置Maxwell

4.1)修改Maxwell配置文件名称

cd /opt/module/maxwell

cp config.properties.example config.properties

4.2)修改Maxwell配置文件

vim config.properties

配置内容:

#Maxwell数据发送目的地,可选配置有stdout|file|kafka|kinesis|pubsub|sqs|rabbitmq|redis

producer=kafka

# 目标Kafka集群地址

kafka.bootstrap.servers=hadoop102:9092,hadoop103:9092,hadoop104:9092

#目标Kafka topic,可静态配置,例如:maxwell,也可动态配置,例如:%{database}_%{table}

kafka_topic=topic_db

# MySQL相关配置

host=hadoop102

user=maxwell

password=maxwell

jdbc_options=useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true

# 过滤gmall中的z_log表数据,该表是日志数据的备份,无须采集

filter=exclude:gmall.z_log

# 指定数据按照主键分组进入Kafka不同分区,避免数据倾斜

producer_partition_by=primary_key

四、Maxwell使用

1、启动Kafka集群

        Maxwell发送数据的目的地为Kafka集群时,需要先启动Kafka集群。

2、Maxwell启停

启动:/opt/module/maxwell/bin/maxwell --config /opt/module/maxwell/config.properties --daemon

停止:ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep | awk '{print $2}' | xargs kill -9

启停脚本:

进入用户目录下的bin目录创建并编辑脚本

vim mxw.sh

脚本内容:

#!/bin/bash

MAXWELL_HOME=/opt/module/maxwell

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

赋予脚本执行权限:

chmod +x mxw.sh

启动Maxwell:

mxw.sh start

停止Maxwell:

mxw.sh stop

五、测试

修改MySQL数据库中的数据,到kafkatools中查看是否有新的数据

六、增量数据同步

1、确保mysql url的数据库为需要同步的数据库

在application.yml文件中

2、生成模拟数据

3、观察Kafka消费者

七、历史数据全量同步

Maxwell提供了bootstrap功能来进行历史数据的全量同步

/opt/module/maxwell/bin/maxwell-bootstrap --database 数据库名 --table 表名 --config /opt/module/maxwell/config.properties

bootstrap数据格式:

第一条为bootstrap的开始标志,不包含数据。例:

{

    "database": "数据库名",

    "table": "表名",

    "type": "bootstrap-start",

    "ts":时间,

    "data": {}

}

第二条开始为更改的数据。例:

{

    "database": "数据库名",

    "table": "表名",

    "type": "bootstrap-insert",        #数据操作类型

    "ts": 时间,

    "data": {

        "txt": "bootstrap!"      

    }

}

最后一条为bootstrap的结束标志,不包含数据。例:

{

    "database": "数据库名",

    "table": "表名",

    "type": "bootstrap-complete",

    "ts": 1450557744,

    "data": {}

}

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值