欢迎广大码农爱好者向我推荐框架,我会择其精要、有趣者分享给大家。
今天下午,有同学献出了一款软件,说是海外澳洲番邦向朕进贡的,于是品尝了一番。
软件名称:mysql-binlog-connector
软件作者:Stanley Shyiko,个人开发性质,疑似澳大利亚番邦人士
中文名称:mysql-binlog日志解析框架
开发时间:2013~2015年
功能简介:将mysql的日志格式设置为row模式,使用mysql-binlog-connector对日志进行读取,将读取到的mysql操作事件进行解析封装,最终封装为事件对象,进而对mysql的日志进行处理。
类似框架:canal,但区别在于canal是模拟mysqlslave端,主动从master端拉取日志数据。而mysql-binlog-connector只是一个解析库,它有两种模式:BinaryLogFileReader日志读取模式,和BinaryLogClient客户端访问模式。但似乎,BinaryLogFileReader日志读取模式更适合于可中断可指定position读取的的模式。
使用示例:
maven引入后
import com.github.shyiko.mysql.binlog.BinaryLogFileReader;
import com.github.shyiko.mysql.binlog.event.Event;
import com.github.shyiko.mysql.binlog.event.deserialization.ChecksumType;
import com.github.shyiko.mysql.binlog.event.deserialization.EventDeserializer;
import java.io.File;
import java.io.IOException;
public class TTTT {
public static void main(String[] args) throws IOException {
String filePath="D:\\DATA\\mysql-bin.000987";
File binlogFile = new File(filePath);
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setChecksumType(ChecksumType.CRC32);
BinaryLogFileReader reader = new BinaryLogFileReader(binlogFile, eventDeserializer);
for (Event event; (event = reader.readEvent()) != null; ) {
System.out.println(event.toString());
}
reader.close();
}
}
上述代码,实现了针对某个sql日志文件进行读取,解析mysql事件,并封装为Event的功能。
BinaryLogClient client = new BinaryLogClient("hostname", 3306, "username", "password");
client.registerEventListener(new BinaryLogClient.EventListener() {
@Override
public void onEvent(Event event) {
}
});
client.connect();
上述代码,实现了通过账号密码连接到数据库上,并实时监听事件,并触发回调的功能
内部原理:内部原理,核心在于EventDeserializer这个对象
内部具有三个对象
头部解析:eventHeaderDeserializer
默认数据解析:defaultEventDataDeserializer
事件类型对应解析器Map:eventDataDeserializers
其中头部解析为EventHeaderV4Deserializer
而eventDataDeserializers根据不同的MysqlEventType有不同的实现:
以最常见的insert,对应的是EventType.Write_ROWS ,顺序为23
使用的是new WriteRowsEventDataDeserializer(tableMapEventByTableId)
解析时调用了deserialize方法
在
eventData.setIncludedColumns(inputStream.readBitSet(numberOfColumns, true));
eventData.setRows(deserializeRows(eventData.getTableId(),eventData.getIncludedColumns(), inputStream));
这两句中对日志格式进行解析,封装为Rows对象,然后返回
之后就成功实现了ROW日志的解析。
框架缺陷:
任何一个框架都有缺陷,或者说不能用“缺陷”这种词,而应该用“待改进内容”来描述,对于mysql-binlog-connector来说,待改进内容如下:
1)没有将mysql的日志监控部分考虑进去。在示例中是直接FIle读取日志文件,但实际工作中,应该还有:文件夹监控,新日志文件出现时替换为新日志文件,日志文件是追加的,而此框架没有针对追加模式处理的内容。
因此建议:需要开发一套新的框架,功能如下:
对某个日志文件夹进行监控
出现新的日志文件时,自动追加到流中
具有唯一指针,用于记录日志文件读取与处理位置
日志文件可以远程传输到新的服务器,在新的服务器上执行后续操作
在新服务器上的服务端,可以提供更多开放性功能
2)Event的后续处理,需要加强这套框架的应用场景,如:非侵入式数据库监控、核心数据表数据同步,跨机房跨洲际数据库同步等
3)鉴于“数据同步、跨机房跨洲际数据库同步、单向回环冲突解决方案”在otter中已经做的挺不错的了,目测mysql-binlog-connector的使用场景将集中在非侵入式数据库监控和核心数据同步了
PS:番邦进贡的代码解析完毕,还请欢迎广大码农爱好者向我推荐框架,我会择其精要、有趣者分享给大家。