简述: 对于离线数仓项目中将MySQL中的数据同步到大数据平台使用的工具是sqoop,而我们在大数据处理中并不是只有离线计算,随着技术的发展,目前实时分析处理在大数据中占据了非常大的部分,那么在实时大数据项目中我们可以使用什么工具为我们将MySQL中的数据同步到大数据平台中呢!本文中的Maxwell就是为了解决这个问题的,接下来,让我们一起细细了解。
一、Maxwell的定义
Maxwell 是一个读取 MySQL binlogs 并将修改行字段的更新写入 Kafka, Kinesis, RabbitMQ, Google Cloud Pub/Sub 或 Redis (Pub/Sub or LPUSH) 以作为 JSON 的应用程序。
Maxwell 拥有可对底层进行操作的操作栏 (operational bar),可生成一致、易于获取的更新流,你可以轻松 “固定” 流处理系统的一些优点,而无需通过整个代码库来添加(不可靠)检测点。
- 常见用例包括 ETL、缓存构建 / 到期、指标收集、搜索索引和服务间通信。
- 可在表的初始加载过程中执行 SELECT * from table (bootstrapping)
- 支持在 master promotion 上的自动位置恢复
- 为 Kakfa 提供灵活的分区方案 —— 按数据库、表、主键或字段进行
Maxwell 通过充当完整的 mysql 副本来完成所有这些操作,包括用于 create/alter/drop 语句的 SQL 解析器。
官网地址:https://maxwells-daemon.io/
二、Maxwell的工作原理
由于maxwell的工作是同步MySQL中的数据,那么我们先思考一下在MySQL集群中,MySQL集群节点间是如何实现数据同步的。
2.1 MySQL之间的数据同步原理—主从复制
-
MySQL集群的Master主库将改变记录,写入到二进制日志(binary log)中;
-
MySQL从节点从库中向Master发送dump协议,将master主库的binary log events 拷贝到它的中继日志(relay log)中;
-
MySQL从节点从库中读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。
MySQL主从复制原理图:
2.2 MySQL的binlog文件
- 1 什么是binlog
binlog是MySQL 的一个二进制日志文件,它以事件形式记录用户对数据库更新的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里(但是对库表等内容的查询不会记录),还包含语句所执行的消耗的时间,MySQL 的二进制日志是事务安全型的。
一般来说开启二进制日志大概会有 1%的性能损耗。二进制有两个最重要的使用场景:
➢ - 其一:MySQL Replication 在 Master 端开启 binlog,Master 把它的二进制日志传递给 slaves 来达到 master-slave 数据一致的目的。
➢ 其二:自然就是数据恢复了,通过使用 mysqlbinlog 工具来使恢复数据。
二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的 DDL 和 DML(除了数据查询语句)语句事件。
-
2 binlog的开启
开启MySQL的binlog功能的步骤:- 再安装MySQL的机器中找到MySQL配置文件的位置
通过命令 locate my.cnf 查找 - 修改配置文件,添加 log-bin=mysql-bin
mysql-bin这个是之后logbin文件命名的前缀,可自定义
生成的文件实例:mysql-bin.000001,文件后面的数字按顺序生成,每次 mysql 重启或者到达单个文件大小的阈值时,新生一个文件,按顺序编号。
- 再安装MySQL的机器中找到MySQL配置文件的位置
-
3 binlog 的分类设置
mysql binlog 的格式有三种,分别是 STATEMENT,MIXED,ROW。
在配置文件中可以选择配置 binlog_format= statement|mixed|row
三种格式的区别:
statement语句级,binlog 会记录每次一执行写操作的语句。
相对 row 模式节省空间,但是可能产生不一致性,比如
update test set create_date=now();
如果用 binlog 日志进行恢复,由于执行时间不同可能产生的数据就不同。
优点: 节省空间
缺点: 有可能造成数据不一致。row
行级, binlog 会记录每次操作后每行记录的变化。
优点:保持数据的绝对一致性。因为不管 sql 是什么,引用了什么函数,他只记录
执行后的效果。
缺点:占用较大空间。mixed
混合级别,statement 的升级版,一定程度上解决了 statement 模式因为一些情况
而造成的数据不一致问题。
默认还是 statement,在某些情况下,譬如:
(1)当函数中包含 UUID() 时;
(2)包含 AUTO_INCREMENT 字段的表被更新时;
(3)执行 INSERT DELAYED 语句时;
(4)用 UDF 时;
会按照 ROW 的方式进行处理
优点:节省空间,同时兼顾了一定的一致性。
缺点:还有些极个别情况依旧会造成不一致,另外 statement 和 mixed 对于需要对
binlog 监控的情况都不方便。综合比较,maxwell做监控分析使用row格式比较合适
-
2.4 为什么原则maxwell
常用的实时数据同步工具由Maxwell和Canal,那么我们对这两个组件进行一下比较:对比 Maxwell Canal 语言 java java 数据格式 json 格式自由 采集数据模式 全量/增量 增量 数据落地 支持kafka等多种平台 定制 HA 支持 支持
三、Maxwell的安装部署
-
3.1 安装包下载地址与版本选择
链接:https://pan.baidu.com/s/1QhDun9j8X8iZJVGdW-2Uqw?pwd=1111
提取码:1111
版本选择的是1.29.2,因为高于这个版本的进行了改版,只有基于Java11才能运行,但是1.29.2及前面版本支持java8,而企业中目前大多数都是基于Java8设计的系统。因此本文中选择的版本就是1.29.2 -
3.2 安装部署
1) 提前安装好zookeeper 和 kafka,以及MySQL
2)上传maxwell-1.29.2.tar.gz到/opt/soft/目录下
3)解压maxwell-1.29.2.tar.gz到/opt/module目录下tar -zvxf maxwell-1.29.2.tar.gz -C /opt/module/
-
3.3 MySQL环境准备
1)修改mysql的配置文件,开启binlog设置[root@bigdata01 /]# vim /usr/my.cnf 在[mysqld]模块下添加一下内容 [mysqld] server_id=1 log-bin=mysql-bin binlog_format=row #binlog-do-db=test_maxwell 重启MySQL服务 [root@bigdata01 /]# service mysql restart 登录mysql并查看是否修改完成 [root@bigdata01 /]# mysql -uroot -p123456 mysql> show variables like '%binlog%'; 当有下列属性时表示开启成功 | binlog_format | ROW |
2)进入/var/lib/mysql目录下,查看MySQL是否生成的binlog文件
当出现下面两个文件时就表示[root@bigdata01 /]# cd var/lib/mysql/ [root@bigdata01 mysql]# ll -rw-rw----. 1 mysql mysql 154 Oct 1 10:53 mysql-bin.000001 -rw-rw----. 1 mysql mysql 19 Oct 1 22:03 mysql-bin.index
注意:
MySQL 生成的 binlog 文件初始大小一定是 154 字节,然后前缀是 log-bin 参数配
置的,后缀是默认从.000001,然后依次递增。除了 binlog 文件文件以外,MySQL 还会额外
生产一个.index 索引文件用来记录当前使用的 binlog 文件。3) 初始化Maxwell元数据库
(1)再MySQL中创建一个数据库maxwell,用于存储Maxwell的元数据信息[root@bigdata01 mysql]# mysql -uroot -p123456 create database maxwell;
(2) MySQL5.7一下忽略此步骤,因为再mysql.5.7以及之后的版本中默认密码最少为八位,因此如果我们使用的话许需要修改用户密码的安全级别
set global validate_password_length=4; set global validate_password_policy=0;
(3)为Maxwell库创建一个用户,并将maxwell的所有权限都交给该用户
grant all on maxwell.* TO 'maxwell'@'%' identified by '123456';
(4) 为用户maxwell分配监控其他数据库的权限(只读权限)
grant select , replication slave , replication client on *.* to maxwell@'%';
(5)刷新mysql表权限
flush privileges
-
3.4 Maxwell的启动
Maxwell的启动方式通常有两种 -
1)使用命令行参数启动Maxwell
[atguigu@hadoop102 maxwell-1.29.2]$ bin/maxwell --user=‘maxwell’ --password=‘123456’ --host=‘hadoop102’ --producer=stdout
参数解释:
–use:连接数据库的用户名
–password:连接数据库的用户名对应密码
–host: 数据库所在的主机名或者IP地址
–producer 生产者模式(stdout表示输出到控制台,kafka表示输出到kafka集群)2)配置好config.properties定制化启动Maxwell
首先将/opt/module/maxwell…/目录下的config.properties.exmple文件改名mv config.properties.exmple config.properties
对config.properties进行配置
[root@bigdata01 maxwell-1.29.2]# vim config.properties producer=stdout kafka.bootstrap.servers=bigdata01:9092 host=bigdata01 user=maxwell password=123456
启动Maxwell
bin/maxwell