2026/1/14 13:51:00
网站建设
项目流程
政务公开网站建设要求,关键词优化公司哪家好,深圳设计深圳设计公司,十大待遇最好央企目录
引入Maxwell
相关概念
Maxwell概念
MySQL主从复制
binlog模式
Maxwell工作原理
Maxwell操作
增量数据同步
历史数据全量同步
Maxwell安装配置
MySQL环境配置
Maxwell安装与配置
Maxwell流程示例 引入Maxwell
在数据驱动的业务场景中#xff0c;经常需要实时…目录引入Maxwell相关概念Maxwell概念MySQL主从复制binlog模式Maxwell工作原理Maxwell操作增量数据同步历史数据全量同步Maxwell安装配置MySQL环境配置Maxwell安装与配置Maxwell流程示例引入Maxwell在数据驱动的业务场景中经常需要实时捕获MySQL数据库的变更数据如插入、更新、删除操作并将这些数据同步到数据仓库、缓存系统、消息队列等下游组件以支撑数据同步、实时分析、业务监控等需求。Maxwell是一款开源的MySQL数据变更捕获工具它能够轻量级地抓取MySQL的binlog日志解析出数据变更详情并以结构化的格式输出。相关概念Maxwell概念Maxwell是一个基于MySQL binlog的实时数据同步工具其功能是解析MySQL的binlog日志提取其中的数据变更记录包括INSERT、UPDATE、DELETE操作并将这些记录以指定的格式JSON输出到下游目标如Kafka、文件等。特点轻量级无复杂依赖、低侵入不影响MySQL主库性能、支持全量同步与增量同步、输出格式灵活、易于集成。MySQL主从复制MySQL主从复制是MySQL提供的一种数据备份与负载均衡方案原理是主库Master将数据变更记录写入binlog日志从库Slave通过IO线程读取主库的binlog日志并写入本地的relay log中继日志再通过SQL线程解析relay log中的日志将数据变更同步到从库从而实现主从库数据一致。组件binlog日志主库产生的记录数据变更的日志IO线程从库负责连接主库读取主库的binlog日志并写入本地relay logSQL线程从库负责解析relay log执行日志中的SQL语句同步数据变更relay log从库本地存储主库binlog日志的中继文件避免直接依赖主库binlog。binlog模式MySQL的binlog日志有三种记录模式不同模式的日志内容、用途及性能存在差异Statement-basedSBR基于语句模式记录触发数据变更的SQL语句如INSERT INTO ...、UPDATE ...。优点是日志体积小、性能损耗低缺点是部分SQL语句如使用NOW()、RAND()等函数的语句无法保证主从复制一致性且Maxwell无法精准解析出变更前后的数据。Row-basedRBR基于行模式记录每一行数据变更的具体内容如某行数据更新前的值、更新后的值。优点是能精准记录数据变更细节保证主从复制一致性缺点是日志体积较大性能损耗相对较高。Mixed混合模式默认使用Statement模式当检测到可能导致主从不一致的SQL语句时自动切换到Row模式。虽然兼顾了性能和一致性但对于Maxwell而言无法保证解析的稳定性因此不推荐使用。TipMaxwell要求MySQL的binlog必须采用Row-based模式否则无法正常抓取并解析数据变更详情。Maxwell工作原理“模拟MySQL从库”完全遵循MySQL主从复制协议与主库进行交互从而抓取binlog日志并解析数据变更具体流程如下Maxwell启动后向MySQL主库发送“从库注册”请求将自己伪装成一个MySQL从库主库接受注册后会给Maxwell分配一个唯一的server-id从库标识需确保与主库及其他从库不重复Maxwell通过主从复制协议向主库请求binlog日志可指定起始日志文件和起始位置支持增量同步也可请求全量日志支持全量同步主库将binlog日志通过网络发送给MaxwellMaxwell解析接收到的binlog日志由于binlog是二进制格式需通过解析转换为可读的结构化数据Maxwell将解析后的结构化数据变更记录按照配置的格式输出到下游目标。Tip由于Maxwell完全遵循主从复制协议无需在MySQL主库中创建触发器、存储过程等对主库性能几乎无侵入且能精准捕获所有数据变更。Maxwell操作Maxwell的操作分为两类增量数据同步实时抓取新增变更数据和历史数据全量同步抓取已有历史数据两类操作的适用场景、操作方式及数据格式存在差异具体如下增量数据同步①适用场景适用于实时抓取MySQL的新增数据变更如生产环境中实时同步数据到下游系统如实时数据仓库、缓存更新。②操作方式1. 确保MySQL已开启binlog且为Row模式配置方法见“Maxwell安装配置”2. 配置Maxwell连接MySQL主库的信息如主库地址、端口、用户名、密码3. 配置Maxwell的输出目标如Kafka地址、文件路径等4. 启动Maxwell指定起始binlog位置若不指定默认从最新的binlog位置开始抓取也可指定历史binlog文件和位置从指定点开始增量抓取。示例启动命令输出到控制台maxwell --usermysql用户名 --passwordmysql密码 --hostmysql主库地址 --portmysql端口 --producerstdout③数据格式增量数据同步的输出格式默认为JSON包含字段如下不同操作类型的字段略有差异database数据变更所属的数据库名table数据变更所属的表名type操作类型INSERT/UPDATE/DELETEts数据变更的时间戳毫秒级data变更后的数据INSERT/UPDATE操作时存在JSON对象old变更前的数据UPDATE/DELETE操作时存在JSON对象server_idMySQL主库的server-idbinlog_file对应的binlog日志文件名binlog_pos对应的binlog日志位置。示例INSERT操作{ database: test_db, table: user, type: INSERT, ts: 1735689600000, data: { id: 1, name: 张三, age: 25, email: zhangsanexample.com }, server_id: 1, binlog_file: mysql-bin.000001, binlog_pos: 156 }示例UPDATE操作{ database: test_db, table: user, type: UPDATE, ts: 1735689720000, data: { id: 1, name: 张三, age: 26, email: zhangsan_newexample.com }, old: { age: 25, email: zhangsanexample.com }, server_id: 1, binlog_file: mysql-bin.000001, binlog_pos: 320 }历史数据同步①适用场景适用于首次部署Maxwell时同步MySQL中已存在的历史数据如初始化数据仓库、补全历史数据全量同步完成后可自动切换到增量同步模式。②操作方式Maxwell通过bootstrap命令实现全量同步执行SELECT语句全量读取目标表的数据再封装为结构化格式输出具体操作1. 确保Maxwell已配置好MySQL连接信息2. 执行bootstrap命令指定需要全量同步的数据库和表3. 全量同步完成后Maxwell会记录当前的binlog位置后续自动从该位置开始增量同步。示例启动命令全量同步test_db库的user表输出到控制台maxwell --usermysql用户名 --passwordmysql密码 --hostmysql主库地址 --portmysql端口 --producerstdout --bootstrap --databasetest_db --tableuserTipbootstrap全量同步本质是执行SELECT * FROM 表名若表数据量较大可能会对MySQL主库造成一定压力建议在业务低峰期执行。③数据格式全量同步的输出格式与增量同步类似差异是type字段为“BOOTSTRAP”且无old字段全量同步是读取当前数据无变更前状态具体字段database所属数据库名table所属表名type固定为“BOOTSTRAP”ts同步时间戳毫秒级data表中的一行数据JSON对象bootstrap_server_idMaxwell的bootstrap标识默认与Maxwell进程ID相关binlog_file/binlog_pos全量同步完成时对应的binlog日志文件和位置用于后续增量同步。示例全量同步user表数据{ database: test_db, table: user, type: BOOTSTRAP, ts: 1735690000000, data: { id: 1, name: 张三, age: 25, email: zhangsanexample.com }, bootstrap_server_id: 1001, binlog_file: mysql-bin.000001, binlog_pos: 500 }Maxwell安装配置Maxwell的安装配置分为两部分MySQL环境配置和Maxwell自身配置具体步骤如下MySQL环境配置Maxwell依赖MySQL的binlog日志因此必须先配置MySQL开启binlog并设置为Row模式步骤如下①编辑MySQL配置文件MySQL的配置文件路径Linux/etc/my.cnf 或 /etc/mysql/my.cnfWindowsMySQL安装目录下的 my.ini。在配置文件的[mysqld]节点下添加以下配置# 开启binlog日志 log_bin mysql-bin # 指定binlog日志存储路径可选默认在MySQL数据目录下 # log_bin_index /var/lib/mysql/mysql-bin.index # 主库的server-id必须唯一取值范围1-2^32-1 server-id 1 # 设置binlog模式为Row-basedMaxwell必须要求 binlog_format ROW # 可选仅记录指定数据库的binlog减少日志体积若不指定则记录所有数据库 # binlog_do_db test_db # 可选忽略指定数据库的binlog # binlog_ignore_db mysql # 可选binlog日志过期时间单位天避免日志文件过大 expire_logs_days 7②重启MySQL服务配置修改后需重启MySQL服务使配置生效Linux重启命令# CentOS/RHEL systemctl restart mysqld # Ubuntu/Debian systemctl restart mysqlWindows重启命令在服务面板中找到“MySQL”服务右键选择“重启”。③验证配置是否生效登录MySQL客户端执行以下命令验证binlog是否开启及模式是否正确-- 查看binlog相关配置 show variables like %binlog%; -- 查看server-id配置 show variables like server_id;验证结果log_bin的值为“ON”表示binlog已开启binlog_format的值为“ROW”表示模式正确server_id的值为配置的1或其他自定义值表示主库标识已设置。④创建Maxwell专用MySQL用户并授权为了安全建议创建专门的MySQL用户供Maxwell使用并授予必要的权限复制权限、查询权限等-- 创建用户用户名maxwell密码maxwell123可自定义 CREATE USER maxwell% IDENTIFIED BY maxwell123; -- 授予复制权限读取binlog日志所需 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO maxwell%; -- 授予查询权限全量同步bootstrap所需 GRANT SELECT ON *.* TO maxwell%; -- 刷新权限 FLUSH PRIVILEGES;Tip若仅需同步指定数据库可将“*.*”改为“test_db.*”test_db为目标数据库名遵循最小权限原则。Maxwell安装与配置①下载Maxwell下载后解压到指定目录如/usr/local/maxwelltar -zxvf maxwell-1.39.0.tar.gz -C /usr/local/ cd /usr/local/ mv maxwell-1.39.0 maxwell②配置MaxwellMaxwell支持通过命令行参数配置也可通过配置文件配置更方便管理。在Maxwell安装目录下创建config.properties配置文件# MySQL连接配置 maxwell.usermaxwell maxwell.passwordmaxwell123 maxwell.host192.168.1.100MySQL主库地址 maxwell.port3306 # 输出目标配置以输出到Kafka为例若输出到控制台可注释 maxwell.producerkafka kafka.bootstrap.servers192.168.1.101:9092,192.168.1.102:9092Kafka集群地址 kafka.topicmaxwell-data输出到Kafka的主题 # 其他可选配置 maxwell.server_id100Maxwell的标识需与MySQL主从的server-id不重复 maxwell.log_levelINFO日志级别DEBUG/INFO/WARN/ERROR maxwell.output.formatjson输出格式默认JSON常见输出目标配置输出到控制台maxwell.producerstdout输出到文件maxwell.producerfilefile.output.path/data/maxwell/output.log输出到RabbitMQmaxwell.producerrabbitmqrabbitmq.hostxxxrabbitmq.port5672等。③启动Maxwell1. 通过配置文件启动推荐cd /usr/local/maxwell nohup bin/maxwell --config config.properties说明使用nohup命令可让Maxwell在后台运行日志默认输出到nohup.out文件。2. 通过命令行参数启动适合快速测试nohup bin/maxwell --usermaxwell --passwordmaxwell123 --host192.168.1.100 --producerstdout④验证Maxwell是否启动成功查看日志tail -f nohup.out若出现“Maxwell started.”则表示启动成功测试数据变更在MySQL中对目标表执行INSERT/UPDATE/DELETE操作查看Maxwell的输出目标控制台/Kafka/文件等是否有对应的变更数据。Maxwell流程示例本示例以“Maxwell抓取MySQL数据变更并输出到Kafka”为例完整演示从环境准备到数据同步的全流程①环境准备MySQL主库192.168.1.100:3306已开启binlogRow模式创建maxwell用户并授权Kafka集群192.168.1.101:9092、192.168.1.102:9092已创建主题maxwell-dataMaxwell服务器192.168.1.103已安装JDK 1.8下载并解压Maxwell。②配置步骤配置MySQL binlog在Maxwell服务器创建config.properties配置文件maxwell.usermaxwell maxwell.passwordmaxwell123 maxwell.host192.168.1.100 maxwell.port3306 maxwell.producerkafka kafka.bootstrap.servers192.168.1.101:9092,192.168.1.102:9092 kafka.topicmaxwell-data maxwell.server_id100 maxwell.log_levelINFO③启动与测试启动Maxwellcd /usr/local/maxwell nohup bin/maxwell --config config.properties查看Maxwell日志确认启动成功tail -f nohup.out出现“Maxwell started.”即可在MySQL中创建测试数据库和表并插入数据CREATE DATABASE test_db; USE test_db; CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT, email VARCHAR(100) ); -- 插入数据 INSERT INTO user (name, age, email) VALUES (张三, 25, zhangsanexample.com); -- 更新数据 UPDATE user SET age26 WHERE id1; -- 删除数据 DELETE FROM user WHERE id1;查看Kafka主题中的数据验证同步结果kafka-console-consumer.sh --bootstrap-server 192.168.1.101:9092 --topic maxwell-data --from-beginning预期结果Kafka消费者能接收到3条数据分别对应INSERT、UPDATE、DELETE操作格式为JSON包含数据库名、表名、操作类型、变更数据等信息。④全量同步测试若需要同步test_db.user表的历史数据执行以下命令nohup bin/maxwell --config config.properties --bootstrap --databasetest_db --tableuser查看Kafka主题会接收到type为“BOOTSTRAP”的全量数据全量同步完成后Maxwell自动切换到增量同步模式后续新增的变更数据会实时同步到Kafka。