type
status
date
slug
summary
tags
category
icon
password
MySqlSnapshotSplitReadTask
每个分片的处理逻辑
水位线
水位线就是binlog的偏移量,通过
SHOW MASTER STATUS
语句获取signalEventDispatcher
处理高低水位线的基本逻辑就是将其放入到一个队列中。数据
chunk的数据通过select查询获取。
数据写入到
Object[] row
中,通过dispatcher.dispatchSnapshotEvent
派发。构建查询语句的代码如下,主要是SQL拼接。
SnapshotSplitReader
读取分片数据,数据格式
[low watermark event][snapshot events][high watermark event][binlog events][binlog-end event]
经过规整处理后,得到数据格式
[low watermark event][normalized events][high watermark event]
在
upsertBinlog
方法里使用binlog读取的数据对snapshotRecords进行规范化处理。这里基于主键数据操作幂等的原理:
- 在读取完LowWaterMark到HighWaterMark之间的任意时间点都可能是select操作开始的时间;
- 但是读取的binlog日志内容都是完整一致的;
- 对各个可能进行select的时间点用完整的binlog进行修正,得到的结果都是相同的。因为具有某条主键的数据只能存在一条;
- 这样就得到高水位的一致性分片数据了。
可以自己手动模拟这几个time的场景验证一下