一步一个脚印,一天一道面试题。
Flink CDC 的诞生背景
Flink CDC 的全称是 Change Data Capture(变更数据捕获)
每一项技术的诞生都是为了解决某个问题,某个痛点。而 Flink CDC
的诞生就是为了解决在读取,监控 MySQL
这样的数据库时,不会因为读取数据库,对数据库本身造成压力,影响性能。同时,保证了数据源的准确,正确。
Flink CDC 原理
- 方式一 :通过查询来获取更新的数据。
如查询数据库:
sql
select * from table1 where create_time >{传入上次查询时间}
这原理非常简单,就是查询上次查询期间创建或更新的数据。但缺点也非常明显:1.查询慢 ,数据一多你这么查就快不了。 2.额外的查询会给组件带来性能压力。
- 方式二:
通过监控日志获取变化的数据。
Flink CDC
的原理是监控数据库比如 MySQL
的 Binlog
;
Binlog
是 MySQL
这样的带事务的数据库为了一致性写的日志。每次有数据的更新,操作都会有对应的 log
产生。我们可以先全量读取一份数据,再通过监控 Binlog
来同步更新数据。
而 Binlog
是原本就有的,没有 Flink CDC
也不会减少日志量,所以不会影响数据库本身性能。
Flink CDC 样例代码
java
import com.ververica.cdc.connectors.mysql.source.MySqlSource;
import com.ververica.cdc.connectors.mysql.table.StartupOptions;
// 配置获取 MySQLSource
MySqlSource<String> mysqlSource = MySqlSource.<String>builder()
.hostname("hostname")
.port(3306)
.username("root")
.password("123456")
.databaseList("database_name")
.tableList("table_name")
.jdbcProperties(prop)
.serverTimeZone("Asia/Shanghai")
// 反序列化(这里指定为 Json)
.deserializer(new JsonDebeziumDeserializationSchema())
// 是否需要先读一份完整的数据
.startupOptions(StartupOptions.initial())
.build();
// 获取对应流 Stream
DataStreamSource<String> mySqlSourceStream = env.fromSource(mysqlSource, WatermarkStrategy.noWatermarks(), "mysql_source");
mySqlSourceStream .print();
env.execute();
我是 Jiweilai,祝你变得更强!