利用MySQL的Binlog实现数据同步与订阅(下)blog.yuanpei.me
终于到这个系列的最后一篇,在前两篇博客中,我们分别了介绍了Binlog的概念和事件总线(EventBus)的实现,在完成前面这将近好几千字的铺垫以后,我们终于可以进入正题,即通过EventBus发布Binlog,再通过编写对应的EventHandler来订阅这些Binlog,这样就实现了我们“最初的梦想”。坦白说,这个过程实在有一点漫长,庆幸的是,它终于还是来了。
Binlog读取与解析
首先,我们通过 Python-Mysql-Replication 这个项目来读取Binlog,直接通过pip install mysql-replication
安装即可。接下来,我们编写一个简单的脚本文件:
def readBinLog():
stream = BinLogStreamReader(
# 填写IP、账号、密码即可
connection_settings = {
'host': '',
'port': 3306,
'user': '',
'passwd': ''
},
# 每台服务器唯一
server_id = 3,
# 主库Binlog读写完毕时是否阻塞连接
blocking = True,
# 筛选指定的表
only_tables = ['order_info', 'log_info'],
# 筛选指定的事件
only_events = [DeleteRowsEvent, WriteRowsEvent, UpdateRowsEvent])
for binlogevent in stream:
for row in binlogevent.rows:
event = {
"schema": binlogevent.schema,
"table": binlogevent.table,
"log_pos": binlogevent.packet.log_pos
}
if isinstance(binlogevent, DeleteRowsEvent):
event["action"] = "delete"
event["origin"] = dict(row["values"].items())
event["current"] = None
event = dict(event.items())
e