开源框架open-replicator原理分析

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

最近公司计划用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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值