目录
第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