参考MySQL到Redis同步方案之基于Python的CDC变更数据捕获
参考配置MySQL CDC(Binlog)
1 数据库CDC
1.1 CDC简介
CDC是change data capture,即变化数据捕捉。
CDC是数据库进行备份的一种方式,常用于大量数据的备份工作。
CDC分为入侵式的和非入侵式的备份方法:
(1)入侵式的备份方法:基于触发器备份、基于时间戳备份、基于快照备份;
侵入式指CDC操作会给源系统带来性能影响,只要CDC操作以任何一种方式对源数据库执行了SQL操作,就认为是侵入式的。
(2)非入侵式的备份方法:基于日志的备份。
mysql基于日志的CDC就是要开启mysql binary log。
参考CDC系列(一)、Canal 集群部署及使用(带WebUI)
参考CDC系列(二)、Maxwell_v1.27.1 监控MySQL操作日志实时同步到Kafka
参考CDC系列(三)、Debezium 监控MySQL操作日志实时同步到Kafka(对比canal,maxwell)
1.2 mysql开启CDC
windows10中安装mysql8
参考windows10系统-3-离线安装mysql8
(1)查看mysql是否开启Binlog
mysql>show variables like 'log_bin';
若变量log_bin的值为“OFF”,则说明Binlog未开启,继续执行下一步。
若变量log_bin的值为“ON”,则说明Binlog已开启,继续执行以下SQL命令,
检查相关参数的配置是否符合要求。
mysql>show variables like '%binlog_format%';
mysql>show variables like '%binlog_row_image%';
变量binlog_format的值应该为“ROW”;
变量binlog_row_image的值应该为“FULL”。
2 应用
2.1 场景
作为一个WEB开发者,MySQL和Redis是日常应用开发中经常用到的。
MySQL作为开源的关系型数据库,以其免费、快速、体积小等特性受到众多开发者的青睐。但是在应对高并发、大数据量查询等场景就非常吃力,当然这也不是MySQL的强项。
为了解决这些问题我我们通常需要将要计算的结果缓存起来或者将高频访问的数据提前缓存,等有请求到来时直接从缓存中读取。Redis的出现完美的解决了上面的问题,其单线程安全、高速非阻塞式I/O以及精准的时间控制就是为高并发场景下缓存完美方案。
在具体的实现细节上其中一点要考虑,就是如何将请求的目的数据提前缓存到Redis中呢?
2.2 方案
大型数据库系统都提供了一种称为CDC的技术。
CDC(Change Data Capture),中文直译“数据变更捕获”,简单来说CDC能够帮助我们识别从上次提取之后发生变化的数据。利用CDC,在对源表进行INSERT、UPDATE或 DELETE等操作的同时就可以提取数据。
在获取到相关事件之后可以通过该特性直接将数据变更同步到Redis缓存中,可以构建低耦合的模块来实现Mysql到Redis的缓存方式。
SqlServer和Oracle都提供了原生支持,但是Mysql并没有提供原生支持,只能寻求第三方方案,常见的两种方式:
(1)通过Mysql主从复制,将一份数据复制到伪造的Mysql slave中,然后在“伪造slave”中完成同步等业务。
Canal由阿里开源,它将自己伪装成一个MySQL的Slave节点,
通过拉取MySQL的binlog来达到实时采集数据库的操作日志的目的,
在后面我们就可以将采集到的数据变更操作通过SparkStreaming、FlinkSQL、
KafkaConnector等工具进行数据处理和导出到其他异构数据源。
(2)另外一种是读取分析mysql二进制日志方式来实现,比如:Maxwell、Debezium、python的mysql-replication等。
Maxwell也是将自己伪装成MySQL的slave节点,
通过监控MySQL的binlog来将数据操作日志同步到kafka等消息队列中供异构数据源使用。
debezium不仅仅支持mysql的监控,目前最新版已支持mysql,postgre,mongodb,
oracle,sqlserver,db2,cassandra等,它依赖于kafka connect 服务,
通过kafka connect,我们可以很方便的将debezium采集到的数据库日志输出到各类目标端。
3 python的mysql-replication
python的mysql-replication是纯Python实现构建在PyMYSQL之上MySQL复制协议。
允许监听诸如插入,更新,删除其数据和原始SQL查询之类的事件。
常见使用场景:
(1)MySQL到NoSQL数据库复制
(2)mysql到搜索引擎复制(全文索引)
(3)在数据库中发生更改时无效缓存
(4)审计
(5)实时分析
CMD>pip install mysql-replication
3.1 数据库操作
(1)创建数据库
create database test;
use test;
create table test4 (id int NOT NULL AUTO_INCREMENT, data VARCHAR(255), data2 VARCHAR(255), PRIMARY KEY(id));
insert into test4 (data,data2) VALUES (