mysql数据实时同步到Elasticsearch

业务需要把mysql的数据实时同步到ES,实现低延迟的检索到ES中的数据或者进行其它数据分析处理。本文给出以同步mysql binlog的方式实时同步数据到ES的思路, 实践并验证该方式的可行性,以供参考。

mysql binlog日志

mysql的binlog日志主要用于数据库的主从复制与数据恢复。binlog中记录了数据的增删改查操作,主从复制过程中,主库向从库同步binlog日志,从库对binlog日志中的事件进行重放,从而实现主从同步。
mysql binlog日志有三种模式,分别为:

ROW: 记录每一行数据被修改的情况,但是日志量太大 STATEMENT: 记录每一条修改数据的SQL语句,减少了日志量,但是SQL语句使用函数或触发器时容易出现主从不一致 MIXED: 结合了ROW和STATEMENT的优点,根据具体执行数据操作的SQL语句选择使用ROW或者STATEMENT记录日志

要通过mysql binlog将数据同步到ES集群,只能使用ROW模式,因为只有ROW模式才能知道mysql中的数据的修改内容。

以UPDATE操作为例,ROW模式的binlog日志内容示例如下:

SET TIMESTAMP=1527917394/*!*/; BEGIN /*!*/; # at 3751 #180602 13:29:54 server id 1 end_log_pos 3819 CRC32 0x8dabdf01 Table_map: `webservice`.`building` mapped to number 74 # at 3819 #180602 13:29:54 server id 1 end_log_pos 3949 CRC32 0x59a8ed85 Update_rows: table id 74 flags: STMT_END_F BINLOG <span>\' UisSWxMBAAAARAAAAOsOAAAAAEoAAAAAAAEACndlYnNlcnZpY2UACGJ1aWxkaW5nAAYIDwEPEREG wACAAQAAAAHfq40= UisSWx8BAAAAggAAAG0PAAAAAEoAAAAAAAEAAgAG///A1gcAAAAAAAALYnVpbGRpbmctMTAADwB3 UkRNbjNLYlV5d1k3ajVbD64WWw+uFsDWBwAAAAAAAAtidWlsZGluZy0xMAEPAHdSRE1uM0tiVXl3 WTdqNVsPrhZbD64Whe2oWQ== \'</span><span>/*!*/</span>; <span>### UPDATE `webservice`.`building`</span> <span>### WHERE</span> <span>### @1=2006 /* LONGINT meta=0 nullable=0 is_null=0 */</span> <span>### @2=\'building-10\' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */</span> <span>### @3=0 /* TINYINT meta=0 nullable=0 is_null=0 */</span> <span>### @4=\'wRDMn3KbUywY7j5\' /* VARSTRING(384) meta=384 nullable=0 is_null=0 */</span> <span>### @5=1527754262 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */</span> <span>### @6=1527754262 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */</span> <span>### SET</span> <span>### @1=2006 /* LONGINT meta=0 nullable=0 is_null=0 */</span> <span>### @2=\'building-10\' /* VARSTRING(192) meta=192 nullable=0 is_null=0 */</span> <span>### @3=1 /* TINYINT meta=0 nullable=0 is_null=0 */</span> <span>### @4=\'wRDMn3KbUywY7j5\' /* VARSTRING(384) meta=384 nullable=0 is_null=0 */</span> <span>### @5=1527754262 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */</span> <span>### @6=1527754262 /* TIMESTAMP(0) meta=0 nullable=0 is_null=0 */</span> <span># at 3949</span> <span>#180602 13:29:54 server id 1 end_log_pos 3980 CRC32 0x58226b8f Xid = 182</span> COMMIT<span>/*!*/</span>;

STATEMENT模式下binlog日志内容示例为:

SET TIMESTAMP=1527919329/*!*/; update building set Status=1 where Id=2000 /*!*/; # at 688 #180602 14:02:09 server id 1 end_log_pos 719 CRC32 0x4c550a7d Xid = 200 COMMIT/*!*/;

从ROW模式和STATEMENT模式下UPDATE操作的日志内容可以看出,ROW模式完整地记录了要修改的某行数据更新前的所有字段的值以及更改后所有字段的值,而STATEMENT模式只单单记录了UPDATE操作的SQL语句。我们要将mysql的数据实时同步到ES, 只能选择ROW模式的binlog, 获取并解析binlog日志的数据内容,执行ES document api,将数据同步到ES集群中。

mysqldump工具

mysqldump是一个对mysql数据库中的数据进行全量导出的一个工具.
mysqldump的使用方式如下:

mysqldump -uelastic -p\'Elastic_123\' --host=172.16.32.5 -F webservice > dump.sql

上述命令表示从远程数据库172.16.32.5:3306中导出database:webservice的所有数据,写入到dump.sql文件中,指定-F参数表示在导出数据后重新生成一个新的binlog日志文件以记录后续的所有数据操作。
dump.sql中的文件内容如下:

-- MySQL dump 10.13 Distrib 5.6.40, for Linux (x86_64) -- -- Host: 172.16.32.5 Database: webservice -- ------------------------------------------------------ -- Server version 5.5.5-10.1.9-MariaDBV1.0R012D002-20171127-1822

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfzyd.html