概述

Maxwell是一个能实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。它的常见应用场景有ETL、维护缓存、收集表级别的dml指标、增量到搜索引擎、数据分区迁移、切库binlog回滚方案等。

特征

  1.  支持 SELECT * FROM table 的方式进行全量数据初始化
  2.  支持在主库发生failover后,自动恢复binlog位置(GTID)
  3.  可以对数据进行分区,解决数据倾斜问题,发送到kafka的数据支持databasetablecolumn等级别的数据分区
  4.  工作方式是伪装为Slave,接收binlog events,然后根据schemas信息拼装,可以接受ddlxidrow等各种event

与canal 和mysql_streamer比较

除了Maxwell外,目前常用的MySQL Binlog解析工具主要有阿里的canal、mysql_streamer,三个工具对比如下:

canal 由Java开发,分为服务端和客户端,拥有众多的衍生应用,性能稳定,功能强大;canal 需要自己编写客户端来消费canal解析到的数据。

maxwell相对于canal的优势是使用简单,它直接将数据变更输出为json字符串,不需要再编写客户端。

安装地址

1.Maxwell官网地址   http://maxwells-daemon.io/

2.安装包下载地址    https://github.com/zendesk/maxwell

安装MaxWell

安装Maxwell

(1)上传maxwell-1.22.4.tar.gz 并进行解压

 tar -zxvf maxwell-1.22.4.tar.gz -C /opt/module/

修改config.properties.example为config.properties

MySql配置

需要mysql开启binlog,而binlog默认是关闭的,需要开启,并且为了保证同步数据的一致性,使用的日志格式为row-based replication(RBR),新建或修改my.conf开启binlog。

(1)修改my-default.cnf

[kris@hadoop101 maxwell-1.22.]$ cd /usr/share/mysql/
[kris@hadoop101 mysql]$ sudo cp my-default.cnf /etc/my.cnf
[kris@hadoop101 mysql]$ sudo vim /etc/my.cnf

提示:如果是rpm的方式安装MySql的那么则没有my.cnf文件,则需要修改mysql-default.cnf然后复制到/etc/路径下,如果/etc/路径下有my.cnf则直接修改my.cnf即可

(2)修改my.cnf,添加如下配置。

[kris@hadoop101 mysql]$ sudo vim /etc/my.cnf
[mysqld]
server_id=1 #随机指定一个不能和其他集群中机器重名的字符串,如果只有一台机器,那就可以随便指定了
log-bin=master
binlog_format=
row #选择row模式 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

启动MySql设置参数

mysql> set global binlog_format=ROW;
mysql> set global binlog_row_image=FULL;

创建maxwell库(maxwell启动时候会自动创建,不需手动创建;另外不能在maxwell库里边创建表,maxwell不会监听到)和用户

添加权限:

mysql> CREATE USER 'maxwell'@'%' IDENTIFIED BY '';
mysql> GRANT ALL ON maxwell.* TO 'maxwell'@'%';
mysql> GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'maxwell'@'%'; 重启MySql服务
[kris@hadoop101 ~]$ sudo service mysql restart

重启mysql, 查询是否已开启

show global variables like '%log_bin%'

 查看binlog:  show binlog events;

查看最新一个binlog日志文件名称 show master status;

查找binlog日志 find / -name mysql-bin -type f 

查看详细的日志配置信息SHOW  GLOBAL VARIABLES LIKE '%log%';

mysql数据存储目录 show variables like '%dir%';

Maxwell 使用

   需要首先启动 zookeeper和 kafka

max的启动方式有:

()基于命令行的启动方式
[kris@hadoop101 maxwell-1.22.]$ cd /opt/module/
[kris@hadoop101 maxwell-1.22.]$ bin/maxwell --user='maxwell' --password='' --host='hadoop101' --producer=stdout
()基于kafka的启动方式
[kris@hadoop101 maxwell-1.22.]$ bin/maxwell --user='maxwell' --password='' --host='hadoop101' --producer=kafka --kafka.bootstrap.servers=hadoop102: --kafka_topic=maxwell
()基于RabbitMQ的启动方式
[kris@hadoop101 maxwell-1.22.]$ bin/maxwell --user='maxwell' --password='' --host='hadoop101' --producer=rabbitmq --rabbitmq_host='rabbitmq.hostname'
()基于Redis的启动方式
[kris@hadoop101 maxwell-1.22.]$ bin/maxwell --user='maxwell' --password='' --host='hadoop101' --producer=redis --redis_host=redis.hostname
提示:maxwell 支持端点续传功能,如果maxwell不慎挂掉了,重启会从上次的消费位置继续读取。
另外,maxwell如果和Mysql不在同一台机器上只需要修改 --host=hostname即可。

1. 输出信息到命令行

(1)启动MaxWell

kris@hadoop101 maxwell-1.22.]$ bin/maxwell --user='maxwell' --password='' --host='hadoop101' --producer=stdout
Using kafka version: 1.0.
::, WARN MaxwellMetrics - Metrics will not be exposed: metricsReportingType not configured.
::, INFO SchemaStoreSchema - Creating maxwell database
::, INFO Maxwell - Maxwell v1.22.5 is booting (StdoutProducer), starting at Position[BinlogPosition[master.:], lastHeartbeat=]
::, INFO AbstractSchemaStore - Maxwell is capturing initial schema
::, INFO BinlogConnectorReplicator - Setting initial binlog pos to: master.:
::, INFO BinaryLogClient - Connected to hadoop101: at master./ (sid:, cid:)
::, INFO BinlogConnectorLifecycleListener - Binlog connected.

自动创建的maxwell库,往里边创建表它是不会监听到的;

该库记录了maxwell同步的状态,最后一次同步的id等等信息,在主库失败或同步异常后,只要maxwell库存在,下次同步会根据最后一次同步的id。如果没有生成maxwell库或报错,可能config.properties中配置的mysql用户权限不够。

maxwell会在对应的数据库上建立一个maxwell数据库用来记录binlog的position, 如果maxwell因为某个原因失败了,下次根据数据库里保存的position去重新获取binlog,第一次连接是从最新的log position获取数据,当然,你也可以手动去更新数据库position位置。

 

对mysql的test测试库进行增删改操作:

INSERT INTO stu1 VALUES(,'kris',); //增、删、改

查看MaxWell 阻塞窗口

{"database":"test","table":"stu1","type":"delete","ts":,"xid":,"commit":true,"data":{"id":,"name":"wangwu","age":}}
{"database":"test","table":"stu1","type":"insert","ts":,"xid":,"commit":true,"data":{"id":,"name":"kris","age":}}
{"database":"test","table":"stu1","type":"update","ts":,"xid":,"commit":true,"data":{"id":,"name":"lisi","age":},"old":{"age":}}

2. 输出信息到kafka

 启动kafka集群:

[kris@hadoop101 kafka]$ bin/kafka-server-start.sh config/server.properties &
[]
[kris@hadoop102 kafka]$ bin/kafka-server-start.sh config/server.properties &
[]
[kris@hadoop103 kafka]$ bin/kafka-server-start.sh config/server.properties &
[]

创建kafka的maxwell topic主题

[kris@hadoop101 kafka]$ bin/kafka-console-consumer.sh --bootstrap-server Hadoop101: --topic maxwell

启动kafka消费者命令行监听maxwell:

[kris@hadoop101 bin]$ ./kafka-console-consumer.sh --bootstrap-server hadoop101: --topic maxwell  --from-beginning
[-- ::,] INFO [Group Metadata Manager on Broker ]: Removed expired offsets in milliseconds. (kafka.coordinator.group.GroupMetadataManager)
[-- ::,] INFO Updated PartitionLeaderEpoch. New: {epoch:, offset:}, Current: {epoch:-, offset-} for Partition: maxwell-. Cache now contains entries. (kafka.server.epoch.LeaderEpochFileCache)

 启动maxwell

[kris@hadoop101 maxwell-1.22.]$ bin/maxwell --user='maxwell' --password='' --host='hadoop101' --producer=kafka --kafka.bootstrap.servers=hadoop101: --kafka_topic=maxwell

对test库中的stu1表进行增删改的操作,查看kafka命令行消费者的监听数据:

kafka DML、kafka DDL

再写一个中间件,用来转义这些JSON,就可以用于其它任何系统了。 实际上我这里有个很大的疑问,kafka partition只能保证单个partition有序,多个partition实际上是无序的,但是在应用binlog的时候,大家知道,这个SQL顺序极其重要,我先update再delete和先delete再update是决然不同的结果。

因此如果kafka是多个partition, 如何保证SQL的应用是有顺序的呢? 我实际上只能想到,只能用一个partition来操作。

过滤指定规则的库:http://maxwells-daemon.io/filtering/

全量同步--使用maxwell-bootstrap命令

./bin/maxwell-bootstrap --database test--table stu1 --host hadoop101 --user maxwell --password 123456  --client_id maxwell_dev

同步test.stu1表的所有数据,并指定client_id示maxwell_dev的maxwell执行同步

上一个命令先开着,然后再启动client_id=maxwell_dev的maxwell

./bin/maxwell --client_id maxwell_dev

等待执行完成即可

maxwell实时同步mysql中binlog的更多相关文章

  1. 使用maxwell实时同步mysql数据到kafka

    一.软件环境: 操作系统:CentOS release 6.5 (Final) java版本: jdk1.8 zookeeper版本: zookeeper-3.4.11 kafka 版本: kafka ...

  2. 使用Logstash来实时同步MySQL数据到ES

    上篇讲到了ES和Head插件的环境搭建和配置,也简单模拟了数据作测试 本篇我们来实战从MYSQL里直接同步数据 一.首先下载和你的ES对应的logstash版本,本篇我们使用的都是6.1.1 下载后使 ...

  3. MySQL中binlog参数:binlog_rows_query_log_events-记录具体的SQL【转】

    在使用RBR也就是行格式的时候,去解析binlog,需要逆向才能分析出对应的原始SQL是什么,而且,里面对应的是每一条具体行变更的内容.当然,你可以开启general log,但如果我们需要的只是记录 ...

  4. canal-1.1.5实时同步MySQL数据到Elasticsearch

    一.环境准备 1.jkd 8+ 2.mysql 5.7+ 3.Elasticsearch 7+ 4.kibana 7+ 5.canal.adapter 1.1.5 二.部署 一.创建数据库CanalD ...

  5. mysql中binlog与存储引擎的2PC

    mysql内部的2PC mysql开启binlog后实际上可以认为其数据有两份,binlog中一份,引擎中一份(这里先把存储引擎中数据看成整体的单独一份,另外也可以把binlog看成是一个引擎).既然 ...

  6. orcale增量全量实时同步mysql可支持多库使用Kettle实现数据实时增量同步

    1. 时间戳增量回滚同步 假定在源数据表中有一个字段会记录数据的新增或修改时间,可以通过它对数据在时间维度上进行排序.通过中间表记录每次更新的时间戳,在下一个同步周期时,通过这个时间戳同步该时间戳以后 ...

  7. MySQL中bin-log使用

    操作命令:show binlog events ; reset master 删除所有的二进制日志 flush logs 产生一个新的binlog日志文件 show master logs; 或者 s ...

  8. MySQL中binlog参数:binlog_rows_query_log_events

    在使用RBR也就是行格式的时候,去解析binlog,需要逆向才能分析出对应的原始SQL是什么,而且,里面对应的是每一条具体行变更的内容.当然,你可以开启general log,但如果我们需要的只是记录 ...

  9. MYSQL 中binlog 参数的记录

    http://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html binlog_cache_size Command ...

随机推荐

  1. 多个datasource的配置与实现原理

          一般情况下,一个项目中只会有一个datasource,但是在某些情况.或者业务需求的情况下会出现一个项目有多个datasource的情况,当满足一定条件的时候,对数据库的操作就会从一个一个 ...

  2. JAVA使用SnakeYAML解析与序列化YAML

    1.概述 本文,我们将学习如何使用SnakeYAML库将 YAML文档转换为Java对象,以及JAVA对象如何序列化为YAML文档. 2.项目设置 要在项目中使用SnakeYAML,需要添加Maven ...

  3. quick start guide for XMEGA ADC

    This is the quick start guide for the Analog to Digital Converter (ADC), with step-by-step instructi ...

  4. springboot整合axis1.4搭建服务端

    前言 最近公司要开发个接口,要用webservices接口实现,而且使用的是axis1.4框架,webservices和axis这两个东西我之前都没接触过,而且axis1.4这个框架06年就不再维护了 ...

  5. java程序员面试经历(不忘初心,永不放弃,方得始终)。

    其实一直想静下心好好写一点博客,记录下青春,但一直忙于学习,写bug.....转眼间2017只剩下最后几天,岁月无情划过,不留痕迹,唯有稀疏地中海.哈哈,本篇文章主要是想分享下刚毕业入门找工作的一点小 ...

  6. python基础知识第四篇(元组)

    元组 list列表 li[11,22,33,44]列表和元组的区别:元素不可被修改,不可被增加或者删除(一级元素),列表则相反 tuple元组 tu=(111,222,333,444) 支持索引取值 ...

  7. 3. abp依赖注入的分析.md

    abp依赖注入的原理剖析 请先移步参考 [Abp vNext 源码分析] - 3. 依赖注入与拦截器 本文此篇文章的补充和完善. abp的依赖注入最后是通过IConventionalRegister接 ...

  8. 在CentOS 7 上使用Docker 运行.NetCore项目

    安装Docker CentOS 7 安装 Docker 编写Dockerfile 右键项目->添加->Docker 支持 选择Linux 修改为如下: FROM mcr.microsoft ...

  9. DOM事件流的三个阶段

    事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流. DOM事件流分为三个阶段,分别为: 捕获阶段:事件从Document节点自上而下向目标节点传播的阶段: 目标阶段:真正的目标 ...

  10. Hadoop_简介_01

    1. Apache Hadoop 1.1 Hadoop介绍 Hadoop是Apache旗下的一个用java语言实现的开源软件框架, 是一个开发和运行处理大规模数据的软件平台. 允许使用简单的编程模型在 ...