maxwell 实时同步数据实战

Maxwell是一个基于MySQLBinLog的实时数据同步工具,它监控数据库变更,以JSON格式发送到Kafka。文章介绍了如何配置MySQL开启BinLog,Maxwell的部署和使用,以及binlog_format的选择和常见问题解决方案。

简介

Maxwell 会实时监控MySQL数据库的数据变更操作(包括insert、update、delete),并将变更数据以 JSON
格式发送给 Kafka等流数据处理平台。

Maxwell 主要原理是模拟Mysql 数据库的热备,实时监控MySQL数据库BinLog的变化,然后将变化格式化成Json数据实时传递到数据处理平台。

maxwell

  • 主要进行实时的增量数据同步。
  • 也能够进行首次全量的数据同步。

部署使用

部署文件下载地址
Maxwell-1.30.0及以上版本不再支持JDK1.8。

MySQL 开启BinLog 日志

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

binlog_format的三个选项

  • STATEMENT(默认)
    每一条会修改数据的sql语句会记录到binlog中。
    优点: 节省空间。
    缺点: 不能记录所有的操作,会产生数据不一致。
  • ROW(Maxwell 支持)
    记录每一个row的变化情况,从而可以实现所有sql语句的日志记录。
    优点: 记录详细。
    缺点: 浪费空间。
  • MIXED
    在binlog中同时记录Statement和Row模式,通过判断每一条SQL语句是否会影响到row的变化情况,从而自动选择记录模式。这种模式相对灵活,既可以保证记录全面,也可以避免过多的空间消耗。

如果只是使用MySQL服务,建议使用MIXED参数,这样结合两种模式的优点,兼具了性能和数据备份的完整性。

binlog_format 相关的其他mysql 配置参数:

binlog_format = MIXED //binlog日志格式,mysql默认采用statement,建议使用mixed
log-bin = /data/mysql/mysql-bin.log //binlog日志文件
expire_logs_days = 7 //binlog过期清理时间
max_binlog_size = 100m //binlog每个日志文件大小
binlog_cache_size = 4m //binlog缓存大小
max_binlog_cache_size = 512m //最大binlog缓存大小

配置maxwell并启动使用

# 创建数据库
msyql> CREATE DATABASE maxwell;
# 创建Maxwell用户并赋予其必要权限
mysql> CREATE USER 'maxwell'@'%' IDENTIFIED BY 'maxwell';
mysql> GRANT ALL ON maxwell.* TO 'maxwell'@'%';
mysql> GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'maxwell'@'%';

配置文件方式进行配置使用

$ cp config.properties.example config.properties
$ 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

# 指定数据按照主键分组进入Kafka不同分区,避免数据倾斜
producer_partition_by=primary_key
# 启动maxwell
$ /opt/module/maxwell/bin/maxwell --config /opt/module/maxwell/config.properties --daemon
# 停止maxwelll
ps -ef | grep com.zendesk.maxwell.Maxwell | grep -v grep | awk '{print $2}' | xargs kill -9

启停maxwell脚本编写:

#!/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

增量同步命令行启动

# 增量同步
# 将 works.videos 表同步到 kafka 的 topic中: maxwell_videos 
bin/maxwell --user='maxwell' --password='123456' --host='127.0.0.1'    --producer=kafka --kafka.bootstrap.servers=knode1:9092,knode2:9092,knode3:9092 --kafka_topic=maxwell_videos --filter='exclude: *.*, include: works.videos' --daemon

maxwell-bootstrap 全量同步命令行启动

只同步一张表的方式

# step 1 
bin/maxwell-bootstrap --host='127.0.0.1' --user='maxwell' --password='123456' --database=works --table=videos--client_id=maxwell_videos
# step 2  client_id 需要和 step 1 同
bin/maxwell --host='127.0.0.1' --user='maxwell' --password='123456' --producer=kafka --kafka.bootstrap.servers=knode1:9092,knode2:9092,knode3:9092 --kafka_topic=maxwell_videos --client_id=maxwell_videos --filter='exclude: *.*, include: works.videos'

常见问题

  1. com.zendesk.maxwell.schema.ddl.MaxwellSQLSyntaxError: 0e0
    解决方式:
    分析可能是MysqlParserListener在修改表支持浮点型精度部分存在问题。
    修改部分字段,将该程序重新打包。

  2. windows打包放在linux中执行可能遇到的问题:

# /bin/bash^M: 坏的解释器: 没有那个文件或目录 的解决方法
# 解决方式 修改windows引入的\r的问题
sed 's/\r//' -i gen_cert.sh
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值