要介绍maxwell的工作原理,首先需要讲一下mysql主从复制的原理
mysql主从复制原理:
如上图,左边是master主节点,右边是slave从节点
工作流程:
1.往主节点mysql的数据库中写入数据,产生数据变化,主节点的binlog二进制日志文件监控到数据变化,就会记录下数据的变更记录(注意这个过程是数据先写到数据库成功之后,然后才能被binlog日志记录)
2.slave从节点中含有一个线程(上图中未显示)在时刻监控主节点binlog日志的变化。当该线程监控到主节点的binlog日志发生了变化,从节点会开启两个线程,一个是I/O线程,一个是SQL线程
3.其中I/O线程会前往主节点的binlog日志寻找变更的日志记录,找到之后,会将变更的日志返回到I/O线程。之后I/O线程会将数据写入到从节点自己的一个临时的中继日志Relaylog(relaylog不是binlog)。
4.此时SQL线程发现relaylog发生了变化,SQL线程开始工作,relaylog将会对SQL线程replay一下(此处假设binlog中记录的就是sql语句,当然binlog有很多模式,不是只能放sql语句),把sql语句重播之后,就可以把数据写入从节点的mysql数据中。
5.假设这次读写完毕且后续没有数据变更,I/O线程和SQL线程将会进入睡眠状态,当从节点监控主节点binlog日志的线程监控到主节点的binlog发生了变化,I/O线程和SQL线程就会又开始重新开始工作
如此循环往复。。。
slave从节点之所以没有显示它自己的binlog日志,是因为还没有节点监控它,如果此时新增一个节点监控slave的变化,便可以给slave节点开一个binlog。
maxwell是怎么工作的呢,很简单,它会把自己伪装成一个mysql的slave,maxwell的工作原理其实就等于mysql主从复制的原理
当然maxwell内部工作和mysql的slave工作有一些细微的差异,感兴趣的可以接着往下看
maxwell也会有I/O线程读取主节点的binlog,然后写入一个类似于(但不是)relaylog的东西,然后将读取的数据也进行重播,但重播之后,转化的格式并非Mysql所需要的格式,而是json格式,并且转化成json后也不会往mysql里写,而是发送给kafka等。这就是Maxwell的工作原理。