netty实现mysql协议_基于Netty模拟解析Binlog

前言

最近一段时间一直再看mysql binlog相关的内容,也整理了几篇相关的文章,对mysql的事件以及通讯协议在理论上有了一个大概的了解,但是缺少实战;本文的目的就是从实战出发,了解binlog解析的整个过程。

解析思路

把binlog的解析过程大致分为以下几个步骤:

1.服务器启动首先获取上一次解析成功的位置(实例中存储在本地文件中);

2.和mysql服务器建立连接;

3.接受mysql发送来的binlog事件;

4.对不同的binlog事件进行解析;

5.将数据进行存储(实例中仅在日志中打印);

6.存储成功后,定时记录Binaly Log位置。

关于binlog相关的配置可以参考系列文章,里面有详解的介绍,下面对步骤进行详细的介绍;

1.服务器启动首先获取上一次解析成功的位置(实例中存储在本地文件中)

binlog的位置信息存储在文件namePosition,有更新也同样更新到namePosition中,部分代码如下:

public class NamePositionStore {

private static Logger log = LoggerFactory.getLogger(NamePositionStore.class);

public static final String BINLOG_NAME = "binlogName";

public static final String BINLOG_POSITIION = "binlogPosition";

private static Map binlogMap = new HashMap();

private static String lineSeparator = (String) System.getProperties().get("line.separator");

private static String localStoreUrl = "namePosition";

static {

loadNamePosition();

}

public static synchronized Map loadNamePosition() {

binlogMap = load();

return binlogMap;

}

public static synchronized Map getNamePosition() {

return binlogMap;

}

public static synchronized void putNamePosition(String binlogName, long binlogPosition) {

binlogMap.put(BINLOG_NAME, binlogName);

binlogMap.put(BINLOG_POSITIION, binlogPosition + "");

store(binlogMap);

}

public static synchronized void putNamePosition(long binlogPosition) {

binlogMap.put(BINLOG_POSITIION, binlogPosition + "");

store(binlogMap);

}

...以下代码省略,可参考码云完整代码...

}

namePosition中存储了两个字段分别是:binlogName和binlogPosition,这两个字段会在客户端请求mysql binlog的时候需要的参数;

2.和mysql服务器建立连接

在文章Mysql通讯协议分析中可以看到和mysql服务器建立连接的步骤:mysql发送握手包,客户端发送认证包,mysql发送认证的结果;

public class HandshakeHandler extends SimpleChannelInboundHandler {

private Logger logger = LoggerFactory.getLogger(HandshakeHandler.class)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值