最近公司计划用databus升级一下数据处理逻辑,就抽时间看了一下代码,databus使用了open-replicator作为获取数据库变更事件的组件,这里就简单介绍一下这个组件的基本实现原理。
代码分析
open-replicator:
功能:
实时获取mysql的binlog日志,并封装成Event对象,然后调用已注册的listener进行处理。
实现原理:
1.首先数据库需要开始binlog,设置好serverid,binlog名字。具体设置细节可以google。
2.mysql数据库本身就支持client端使用命令mysqlbinlog来读取binlog中的内容,open-replicator也是通过这种方式实现。
先来看下主类 OpenReplicator中的部分属性:
protected int port = 3306;
protected String host;
protected String user;
protected String password;
protected int serverId = 6789;
protected String binlogFileName;
protected long binlogPosition = 4;
在启动该工程的时候需要设置这些属性,相信大家看了都很熟悉,就是关于所要连接数据库的一些信息。
接下来看一下设置好这些属性以后连接数据库的代码,该逻辑在TransportImpl类中:
this.socket = this.socketFactory.create(host, port);
this.os = new TransportOutputStreamImpl(this.socket.getOutputStream());
if(this.level2BufferSize <= 0) {
this.is = new TransportInputStreamImpl(this.socket.getInputStream(), this.level1BufferSize);
} else {
this.is = new TransportInputStreamImpl(new ActiveBufferedInputStream(this.socket.getInputStream(), this.level2BufferSize), this.level1BufferSize);
}
逻辑很清晰,也比较简单,是通过soket方式进行连接,当成功连接以后server端返回一个数据包,client
端会根据这个数据包的内容进行下一步处理:
final Packet packet = this.is.readPacket();
如果连接成功,则会进行身份的验证:
this.authenticator.login(this);
当成功连接数据库以后,会向mysql发送请求binlog的数据包,看一下代码:
protected void dumpBinlog() throws Exception {
//
final ComBinlogDumpPacket command = new ComBinlogDumpPacket();
command.setBinlogFlag(0);
command.setServerId(this.serverId);
command.setBinlogPosition(this.binlogPosition);
command.setBinlogFileName(StringColumn.valueOf(this.binlogFileName

本文介绍了开源框架open-replicator如何实时获取MySQL binlog并转化为Event对象,详细分析了其连接数据库、身份验证、binlog事件解析及二级缓存的处理逻辑,旨在理解其工作原理。
最低0.47元/天 解锁文章
2703

被折叠的 条评论
为什么被折叠?



