大数据技术之MaxWell

Maxwell是一个开源工具,用于实时捕获MySQL的数据变更,以JSON格式发送到流处理平台如Kafka。它依赖于MySQL的二进制日志,遵循主从复制协议。文章详细介绍了Maxwell的原理、部署步骤以及如何进行历史数据全量同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

第1章 Maxwell介绍

1.1 Maxwell概述

1.2 Maxwell输出数据格式

第2章 Maxwell架构原理

2.1 MySql二级制日志

2.2 Mysql主从复制

2.3 Maxwell原理

第3章 Maxwell部署

3.1 上传解压

3.2 配置MySQL

3.2.1 启动MySQL Binlog

3.2.2 创建Maxwell所需数据库和用户

3.3 配置Maxwell

第4章 Maxwell使用

4.1 Maxwell启动和停止

4.2 历史数据全量同步

4.2.1 背景


第1章 Maxwell介绍

1.1 Maxwell概述

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

Maxwell官网地址:Maxwell's Daemon

Maxwellgithub地址:https://github.com/zendesk/maxwel

1.2 Maxwell输出数据格式

 

第2章 Maxwell架构原理

        Maxwell的工作原理是实时读取Mysql数据库的二进制日志--Binlog,从中获取变更数据,再将变更数据以Json的格式发送至Kafka等流处理平台。

2.1 MySql二级制日志

1. 二进制日志(Binglog):就是Msyql服务端非常重要的一种日志,他会保存Msyql数据库的所有数据变更记录。

2. Binglog的主要作用包括主从复制数据恢复。Maxwell的工作原理和主从复制密切相关。

2.2 Mysql主从复制

1. Mysql主从复制:就是用来建立一个和主数据库完全一样的数据库环境,这个数据库称为从数据库。

2. 主从复制的应用场景:

热备:主数据库服务器故障后,可切换到从数据库继续工作。

读写分离:主数据库只负责业务数据的写入操作,而多个从数据库只负责业务数据的查询工作,在读多写少场景下,可以提高数据库的工作效率。

3. MySQL主从复制原理示意图

 4. Mysql主从复制工作原理

① Master主库接收到数据变更请求,完成数据变更,并将其写到二级制日志(binary log)中。

② Slave从库向Mysql master发送dump协议,将Master主库的binary log events拷贝到从库的中继日志(relay log)中。

③ Slave从库读取并回放中继日志中的事件,将更新的数据同步到自己的数据库中。

2.3 Maxwell原理

        Maxwell的实现原理很简单,就是将自己伪装成Slave,并遵循Mysql主从复制的协议,从master中同步数据。


第3章 Maxwell部署

3.1 上传解压

安装地址:下载

3.2 配置MySQL

3.2.1 启动MySQL Binlog

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

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

[hadoop102 software]$ sudo vim /etc/my.cnf

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

2. Mysql Binlog模式介绍

① Statement-based: 基于语句,Binlog会记录所有写操作的SQL语句,包括:insert、update、delete等。

                    优点:节省空间;

                    缺点:有可能造成数据不一致,如:insert语句中包含now()函数。

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

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

                    缺点:占用较大空间

③ mixed  混合模式,默认是Statement-based,如果SQL语句可能导致数据不一致,就自动切换到Row-based

Maxwell要求Binlog采用Row-based模式

3. 重启Mysql服务

sudo systemctl restart mysqld

3.2.2 创建Maxwell所需数据库和用户

        Maxwell需要在MySQL中存储其运行过程中的所需数据,如:binlog同步的断点位置等,所以我们需要在MySQL中为其创建数据库和用户。

1. 创建数据库
mysql> create database maxwell;
2. 创建Maxwell用户,
mysql> create user 'maxwell'@'%' identified by 'maxwell';
Query OK, 0 rows affected (0.00 sec)
3. 如果这里报错,说明密码的等级配置过高,调整Mysql数据库的密码级别
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=4;
4. 并赋予其必要权限
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)

3.3 配置Maxwell

修改Maxwell的配置文件config.properties,主要是配置数据发送的目的地。

1. 配置文件在maxwell根目录下,复制一份模板,并重命名为config.properties
[hadoop102 maxwell-1.29.2]$ mv config.properties.example config.properties

2. 编辑配置文件
[hadoop102 maxwell-1.29.2]$ 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=maxwell

#MySQL相关配置
host=hadoop102
user=maxwell
password=maxwell
jdbc_options=useSSL=false&serverTimezone=Asia/Shanghai

若Maxwell发送数据的目的地是kafka集群,需要首先将kafka集群启动。

1. 启动Maxwell
[hadoop102 maxwell]$ bin/maxwell --config config.properties --daemon

2. 停止Maxwell
[hadoop102 maxwell]$ ps -ef | grep maxwell | grep -v grep | grep maxwell | awk '{print $2}' | xargs kill -9

第4章 Maxwell使用

4.1 Maxwell启动和停止

1. Maxwell启动停止脚本maxwell.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

4.2 历史数据全量同步

4.2.1 背景

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

1. Maxwell提供了bootstrap功能来进行历史数据的全量同步(前提要部署一个maxwell),命令如下:

[hadoop102 maxwell]$ bin/maxwell-bootstrap --database gmall --table user_info --config config.properties

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值