mysqlbinglog-解析组件maxwell

什么是Maxwell?

这是一个读取MySQL binlogs并将行更新写入Kafka,Kinesis,RabbitMQ,Google Cloud Pub / Sub或Redis(Pub / Sub或LPUSH)作为JSON的应用程序。

下载

下载二进制发行版:https//github.com/zendesk/maxwell/releases/download/v1.17.1/maxwell-1.17.1.tar.gz

源代码和错误跟踪可在github上找到:https//github.com/zendesk/maxwell

第一步:配置Mysql

$ vi my.cnf


[mysqld]
server_id=1
log-bin=master
binlog_format=row

 

第二步:运行Maxwell

bin/maxwell --user='maxwell' --password='XXXXXX' --host='127.0.0.1' --producer=stdout

后面的参数为指定输出数据库:默认输出到控制台,指定producer可以进行输出路径

bin/maxwell --user='maxwell' --password='XXXXXX' --host='127.0.0.1' \
   --producer=kafka --kafka.bootstrap.servers=localhost:9092 --kafka_topic=maxwell

此为配置Kafka配置启动命令。

第三步:配置文件

Maxwell的配置文件为config.properties

log_level = [debug | info | warn | error] 默认为info

producer 指定输出的对象,默认为控制台,可以修改为Kafka

文件的输出参数file 指定输出的路径

Kafka的配置参数:

kafka.bootstrap.servers >>kafka brokers配置参数

kafka_topic  >>我们这里指定为Maxwell

kafka_version  >> kafka的版本

kafka_partition_hash >> default

kafka_key_format >> hash

ddl_kafka_topic >> kafka_topic

第四步:Kafka

Maxwell默认写入名为“maxwell”的kafka主题。它可以是静态的,例如'maxwell',或动态的,例如namespace_%{database}_%{table}。在后一种情况下,'database'和'table'将替换为正在处理的行的值。可以使用该kafka_topic选项更改此设置。

默认情况下,maxwell使用kafka 1.0.0库。该--kafka_version标志允许您选择备用库版本:0.8.2.2,0.9.0.1,0.10.0.1,0.10.2.1或0.11.0.1,1.0.0。此标志仅在命令行中可用。

  • 0.8.2.2客户端仅与运行kafka 0.8的代理兼容。
  • 0.10.0.x客户端仅与代理0.10.0.x或更高版本兼容。
  • 将0.10客户端与其他版本混合可能会导致严重的性能影响。有关详细信息,请在此处阅读
  • 0.11.0客户端可以与版本0.10.0或更新的代理进行通信。
  • 0.9.0.1客户端与运行kafka 0.8的代理不兼容。在这种情况下,以下例外将显示在日志中:
  • ERROR Sender - Uncaught error in kafka producer I/O thread:
  • SchemaException: Error reading field 'throttle_time_ms': java.nio.BufferUnderflowException

Performant properties

这些属性将提供高吞吐量性能。

kafka.acks = 1
kafka.compression.type = snappy
kafka.retries=0

 

Keys:

Maxwell根据JSON格式的mysql行主键为其Kafka消息生成密钥:

{ "database":"test_tb","table":"test_tbl","pk.id":4,"pk.part2":"hello"}

 

此密钥旨在与Kafka的日志压缩协作,这将保存密钥的最后已知值,允许Maxwell的Kafka流保留一行的最后已知值并充当事实来源。

基于JSON-hash的密钥格式很难以稳定的方式重新生成。如果您有一个需要解析和重新生成密钥的应用程序,建议您启用 --kafka_key_format=array,这将生成可以解析并逐字节重新输出的kafka密钥。

第五步:过滤器

Maxwell可以配置为过滤掉特定表的更新。这由--filter命令行标志控制。

例如:

--filter = 'exclude: foodb.*, include: foodb.tbl, include: foodb./table_\d+/'
 

此示例告诉Maxwell禁止发生的所有更新foodb,但tblfoodb中的更新以及与正则表达式匹配的任何表除外/table_\d+/

--filter = 'exclude: *.*, include: db1.*'
 

在此示例中,我们将禁止除db1数据库中的更新之外的所有内容。

--filter = 'exclude: db.tbl.col = reject'
 

将拒绝db.tbl该包含中的任何行col以及“col”的字符串化值为“reject”的位置。

--filter = 'exclude: *.*.col_a = *'

 

将排除对包含col_a但包含所有其他表的任何表的更新。

--filter = 'blacklist: bad_db.*'
 

黑名单告诉Maxwell完全忽略数据库或表,包括架构更改。

 

第六步:Maxwell数据说明

Database >> 数据库

Table >> 表

Type >> sql的执行方式

Xid >> 这是InnoDB与此行关联的事务的“事务ID”

server_id >> 接受此事务的服务器的mysql server_id

thread_id >> thread_id或多或少是生成数据的客户端连接的唯一标识符。

第七步:监控

Maxwell通过其基本日志记录机制,JMX,HTTP或推送到Datadog来公开某些度量标准。这可以通过命令行选项或config.properties文件进行配置。这些可以提供对系统健康的洞察力。目前,某些指标是Kafka特定的 - 即,尚未支持其他生产者。

配置参数:metrics_prefix

messages.succeeded

已成功发送到Kafka的邮件数

messages.failed

无法发送给Kafka的邮件数

row.count

已从binlog处理的行数。请注意,并非每一行都会导致将消息发送到Kafka。

messages.succeeded.meter

消息成功发送到Kafka的速率的度量

messages.failed.meter

消息无法发送Kafka的速率的度量

row.meter

行从binlog连接器到达Maxwell的速率的度量

replication.lag

数据库事务提交与Maxwell处理的时间之间经过的时间,以毫秒为单位

inflightmessages.count

当前正在进行中的消息数(等待来自目的地的确认,或者在消息之前)

message.publish.time

将给定记录发送到Kafka所花费的时间,以毫秒为单位

replication.queue.time

将给定的binlog事件排队以进行处理所花费的时间(以毫秒为单位)

七:maxwell发送数据到kafka发生数据倾斜

Maxwell官网查文档(Producers:kafka-partitioning Maxwell’s Daemon)得知,在Maxwell没有配置的情况下,默认使用数据库名作为计算分区的key,并使用Java默认的hashcode算法进行计算:

  1. A binlog event's partition is determined by the selected hash function and hash string as follows
  2. | HASH_FUNCTION(HASH_STRING) % TOPIC.NUMBER_OF_PARTITIONS
  3. The HASH_FUNCTION is either java's hashCode or murmurhash3. The default HASH_FUNCTION
  4. is hashCode. Murmurhash3 may be set with the kafka_partition_hash option.
  5. …………
  6. The HASH_STRING may be (database, table, primary_key, column). The default HASH_STRING
  7. is the database. The partitioning field can be configured using the
  8. producer_partition_by option.

而在很多业务系统中,不同数据库的活跃度差异是很大的,主体业务的数据库操作频繁,产生的Binlog也就很多,而Maxwell默认使用数据库作为key进行hash,那么显而易见,Binglog的操作经常都被分到同一个分区里面了。

 

于是我们在Maxwell启动命令中加入对应参数即可,这里我选择了Rowkey作为分区key,同时选用murmurhash3
哈希算法,以获得更好的效率和分布:

 

nohup /opt/maxwell-1.11.0/bin/maxwell --user='maxwell' --password='***' --host='***'
--exclude_dbs='/^(mysql|maxwell|test)/' --producer=kafka --kafka.bootstrap.servers=***
--kafka_partition_hash=murmur3 --producer_partition_by=primary_key >> /root/maxwell.log &

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值