什么是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
|
第二步:运行Maxwell
bin/maxwell --user='maxwell' --password='XXXXXX' --host='127.0.0.1' --producer=stdout
后面的参数为指定输出数据库:默认输出到控制台,指定producer可以进行输出路径
|
此为配置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
这些属性将提供高吞吐量性能。
|
Keys:
Maxwell根据JSON格式的mysql行主键为其Kafka消息生成密钥:
|
此密钥旨在与Kafka的日志压缩协作,这将保存密钥的最后已知值,允许Maxwell的Kafka流保留一行的最后已知值并充当事实来源。
基于JSON-hash的密钥格式很难以稳定的方式重新生成。如果您有一个需要解析和重新生成密钥的应用程序,建议您启用 --kafka_key_format=array,这将生成可以解析并逐字节重新输出的kafka密钥。
第五步:过滤器
Maxwell可以配置为过滤掉特定表的更新。这由--filter
命令行标志控制。
例如:
|
此示例告诉Maxwell禁止发生的所有更新foodb
,但tbl
foodb中的更新以及与正则表达式匹配的任何表除外/table_\d+/
。
|
在此示例中,我们将禁止除db1
数据库中的更新之外的所有内容。
|
将拒绝db.tbl
该包含中的任何行col
以及“col”的字符串化值为“reject”的位置。
|
将排除对包含col_a
但包含所有其他表的任何表的更新。
|
黑名单告诉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 | 当前正在进行中的消息数(等待来自目的地的确认,或者在消息之前) |
| 将给定记录发送到Kafka所花费的时间,以毫秒为单位 |
| 将给定的binlog事件排队以进行处理所花费的时间(以毫秒为单位) |
七:maxwell发送数据到kafka发生数据倾斜
在Maxwell
官网查文档(Producers:kafka-partitioning Maxwell’s Daemon)得知,在Maxwell
没有配置的情况下,默认使用数据库名作为计算分区的key,并使用Java默认的hashcode算法进行计算:
A binlog event's partition is determined by the selected hash function and hash string as follows
| HASH_FUNCTION(HASH_STRING) % TOPIC.NUMBER_OF_PARTITIONS
The HASH_FUNCTION is either java's hashCode or murmurhash3. The default HASH_FUNCTION
is hashCode. Murmurhash3 may be set with the kafka_partition_hash option.
…………
The HASH_STRING may be (database, table, primary_key, column). The default HASH_STRING
is the database. The partitioning field can be configured using the
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 &