<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>streaming | wufc</title><link>https://wufc.info/tag/streaming/</link><atom:link href="https://wufc.info/tag/streaming/index.xml" rel="self" type="application/rss+xml"/><description>streaming</description><generator>Wowchemy (https://wowchemy.com)</generator><language>zh-Hans</language><lastBuildDate>Wed, 30 Jun 2021 00:00:00 +0000</lastBuildDate><image><url>https://wufc.info/media/icon_hua186646d372e9745c8124a5e103bfe86_23265_512x512_fill_lanczos_center_2.png</url><title>streaming</title><link>https://wufc.info/tag/streaming/</link></image><item><title>使用Debezium采集Postgresql数据</title><link>https://wufc.info/post/streaming/debezium/</link><pubDate>Wed, 30 Jun 2021 00:00:00 +0000</pubDate><guid>https://wufc.info/post/streaming/debezium/</guid><description>&lt;h3 id="1-背景">1. 背景&lt;/h3>
&lt;p>为了应对搜索的场景，需要将postgresql中的数据同步到es中，涉及到全量数据与增量数据同步。数据采集工具有很多，经讨论，初步确定为Debezium。&lt;/p>
&lt;h3 id="2debezium">2.Debezium&lt;/h3>
&lt;p>Kafka Connect 是一个可靠的，可拓展的数据流转工具，可作用于kafka与各种外部系统的数据流转，比如Mysql，Postgresql，ElasticSearch等。&lt;/p>
&lt;p>Kafka Connect 提供了通用的概念和API，遵循其规范开发的插件可直接运行在Kafka Connect之上，或作为Source Connector采集数据，或作为Sink Connector存储数据。&lt;/p>
&lt;p>Debezium 针对不同的数据库提供了对应的Kafka Connect插件，用于Capture Data Changes，包括Mysql，Postgresql，Mongo等。&lt;/p>
&lt;p>&lt;img src="images/image-20210629114934960.png" alt="image-20210629114934960">&lt;/p>
&lt;p>Debezium-Connector-Postgresql插件是基于Postgresql的逻辑复制特性实现CDC的。&lt;/p>
&lt;p>这个机制允许从WAL日志中提取数据变化并通过Publication发布，使用解码器(pg10默认pgoutput)解码成可读的事件，订阅者可订阅该Publication，通过复制槽(Replication slot)获取事件。Debezium-Connector-Postgresql插件就是订阅Postgresql的Publication，获取数据变化，发送到对应的kafka中。&lt;/p>
&lt;h3 id="3-环境搭建">3. 环境搭建&lt;/h3>
&lt;blockquote>
&lt;p>kafka 2.1，Postgresql 10已经事先安装好。&lt;/p>
&lt;/blockquote>
&lt;h4 id="31-postgresql中创建逻辑复制发布">3.1 Postgresql中创建逻辑复制发布&lt;/h4>
&lt;ul>
&lt;li>
&lt;p>开启逻辑复制&lt;/p>
&lt;p>postgresql.conf调整wal_level属性为logical，该属性需要重启才能生效&lt;/p>
&lt;pre>&lt;code class="language-xml">wal_level = logical
&lt;/code>&lt;/pre>
&lt;p>查看wal_level&lt;/p>
&lt;pre>&lt;code class="language-sql">show wal_level;
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>创建具有复制权限的用户，并赋予相关schema和table的的权限&lt;/p>
&lt;pre>&lt;code class="language-sql">-- 创建debezium_user
CREATE ROLE debezium_user
REPLICATION
LOGIN
ENCRYPTED PASSWORD '123456';
-- 把schema debezium的使用权限赋给debezium_user
GRANT USAGE ON SCHEMA debezium TO debezium_user;
-- 把cities和tourists表的SELECT权限赋给debezium_user
GRANT SELECT ON debezium.cities, debezium.tourists TO debezium_user;
&lt;/code>&lt;/pre>
&lt;blockquote>
&lt;p>初始阶段的快照同步时需要访问这些相关schema和table的数据，所以需要schema和table的权限。&lt;/p>
&lt;/blockquote>
&lt;/li>
&lt;li>
&lt;p>创建Publication&lt;/p>
&lt;pre>&lt;code class="language-sql">-- 创建Publication
CREATE PUBLICATION dbz_demo FOR TABLE debezium.cities, debezium.tourists;
-- 查看Publication
SELECT A.*, B.schemaname, B.tablename FROM pg_publication A
INNER JOIN pg_publication_tables B ON A.pubname = B.pubname;
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="images/image-20210629211747223.png" alt="image-20210629211747223">&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="32-安装debezium插件启动kafka-connect">3.2 安装debezium插件，启动kafka connect&lt;/h4>
&lt;ul>
&lt;li>
&lt;p>下载debezium-connector-postgresql插件，解压到指定路径&lt;/p>
&lt;pre>&lt;code class="language-shell">&amp;gt; wget https://repo1.maven.org/maven2/io/debezium/debezium-connector-postgres/1.5.3.Final/debezium-connector-postgres-1.5.3.Final-plugin.tar.gz
&amp;gt; tar -zxvf debezium-connector-postgres-1.5.3.Final-plugin.tar.gz /data/kafka_connect/plugins
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>修改kafka connect的配置文件connect-distributed.properties&lt;/p>
&lt;pre>&lt;code class="language-properties"># kafka connect可横向拓展，同一个集群使用一个group id，不能与consumer的group ids重复
group.id=connect-cluster
# kafka server
bootstrap.servers=127.0.0.1:9092
# 定义插件路径
plugin.path=/data/kafka_connect/plugins
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>启动kafka connect&lt;/p>
&lt;pre>&lt;code class="language-shell">&amp;gt; cd /data/kafka_dev/bin
&amp;gt; bin/connect-distributed.sh config/connect-distributed.properties
&lt;/code>&lt;/pre>
&lt;blockquote>
&lt;p>可在/data/kafka_dev/logs/connect.log 查看相关日志&lt;/p>
&lt;/blockquote>
&lt;/li>
&lt;/ul>
&lt;h4 id="33-创建connector">3.3 创建connector&lt;/h4>
&lt;pre>&lt;code>curl -XPOST &amp;quot;http://127.0.0.1:8083/connectors/&amp;quot; -H 'Content-Type: application/json' -d '
{
&amp;quot;name&amp;quot;: &amp;quot;pg_232_demo_connector&amp;quot;,
&amp;quot;config&amp;quot;: {
&amp;quot;connector.class&amp;quot;: &amp;quot;io.debezium.connector.postgresql.PostgresConnector&amp;quot;,
&amp;quot;database.hostname&amp;quot;: &amp;quot;127.0.0.1&amp;quot;,
&amp;quot;database.port&amp;quot;: &amp;quot;5432&amp;quot;,
&amp;quot;database.user&amp;quot;: &amp;quot;debezium_user&amp;quot;,
&amp;quot;database.password&amp;quot;: &amp;quot;123456&amp;quot;,
&amp;quot;database.dbname&amp;quot; : &amp;quot;dev&amp;quot;,
&amp;quot;database.server.name&amp;quot;: &amp;quot;pg_232_demo&amp;quot;,
&amp;quot;slot.name&amp;quot;: &amp;quot;dbz_demo_slot&amp;quot;,
&amp;quot;table.include.list&amp;quot;: &amp;quot;debezium.cities, debezium.tourists&amp;quot;,
&amp;quot;publication.name&amp;quot;: &amp;quot;dbz_demo&amp;quot;,
&amp;quot;publication.autocreate.mode&amp;quot;: &amp;quot;disabled&amp;quot;,
&amp;quot;plugin.name&amp;quot;: &amp;quot;pgoutput&amp;quot;,
&amp;quot;snapshot.mode&amp;quot;: &amp;quot;exported&amp;quot;
}
}
'
&lt;/code>&lt;/pre>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>属性&lt;/th>
&lt;th>含义&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>name&lt;/td>
&lt;td>connector 名称&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>connector.class&lt;/td>
&lt;td>connector 实现类&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>database.dbname&lt;/td>
&lt;td>需要捕获数据变更的数据库&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>database.server.name&lt;/td>
&lt;td>pg数据库服务的名称，这个名称下可以包含1个或者多个postgresql 实例，由于一个connector下的&lt;strong>数据变更是发送到以server.name为前缀的topic中&lt;/strong>，所以对于集群下不同实例的同一张表的数据变化，可以发送到同一个topic&lt;br />&lt;br />因此&lt;strong>不同的connector应当对应不同的server.name&lt;/strong>。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>slot.name&lt;/td>
&lt;td>复制槽的名称&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>table.include.list&lt;/td>
&lt;td>需要捕获数据变更的表&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>publication.name&lt;/td>
&lt;td>订阅的Publication名称&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>publication.autocreate.mode&lt;/td>
&lt;td>Publication创建模式，由于我们是自行创建，所以这里是&lt;strong>disabled&lt;/strong>&lt;br />其他包含&lt;br />&lt;strong>all_tables&lt;/strong> - 如果pg中不存在该Publication，则自动创建一个包含所有表的Publicatin&lt;br />&lt;strong>filtered&lt;/strong> - 与all_talbes不同的是自动创建只包含table.include.list的Publication&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>plugin.name&lt;/td>
&lt;td>使用了Postgresql 10默认解码插件 pgoutput&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>snapshot.mode&lt;/td>
&lt;td>由于WAL日志不会保留全部历史，所以创建snapshot先同步数据库中已经存在的数据。&lt;br />&lt;strong>exported&lt;/strong> - 在复制槽创建时使用无锁的方式创建snapshot，也就是一个slot对应一份snapshot。debezium 1.5强烈建议使用，其他模式可能造成事件丢失。&lt;br />&lt;br /> &lt;strong>initial&lt;/strong> - 当逻辑数据库(对应db.server.name) 没有对应的offset记录时开始创建snapshot&lt;br />其他参见&lt;a href="https://debezium.io/documentation/reference/1.5/connectors/postgresql.html#postgresql-connector-properties" target="_blank" rel="noopener">文档&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>snapshot.mode=exported模式下：&lt;/p>
&lt;p>当删除connector后，postgresql的复制槽依然存在。&lt;/p>
&lt;p>如果要复用复制槽并从上次的offse开始读取，connector.name和database.server.name 必须和之前一样。&lt;/p>
&lt;p>如果要重新读取数据，建议新建connector，且connector.name和database.server.name使用不同的名称。如果要复用复制槽的话，可以修改connector.name和database.server.name的任意一个，都会重新从snapshot开始读取，不过没改database.server.name的话，会继续发到原来的topic中。&lt;/p>
&lt;/blockquote>
&lt;p>connector创建完成后，就会订阅dbz_232_dev，我们可以在postgresql查看到对应的复制槽的信息&lt;/p>
&lt;pre>&lt;code class="language-sql">-- 查看slot信息
select * from pg_replication_slots;
&lt;/code>&lt;/pre>
&lt;p>&lt;img src="images/image-20210629211828767.png" alt="image-20210629211828767">&lt;/p>
&lt;h3 id="4-测试">4. 测试&lt;/h3>
&lt;h4 id="51-快照数据">5.1 快照数据&lt;/h4>
&lt;p>创建connector之后，如果订阅的表中已经存在数据，将会对已存在的数据做快照，发送到对应的kafka topic(默认是由database.server.name，schema和table组成)。比如debezium.cities的数据就会发送到pg_232_demo.debezium.cities topic中。&lt;/p>
&lt;p>运行kafka-console-consumer.sh 监听该topic，分析其数据。&lt;/p>
&lt;pre>&lt;code class="language-shell">kafka-console-consumer.sh --bootstrap-server 127.0.0.1:8092 --topic pg_232_demo.debezium.cities --from-beginning
&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-json">{
&amp;quot;schema&amp;quot;: {
......
},
&amp;quot;payload&amp;quot;: {
&amp;quot;before&amp;quot;: null,
&amp;quot;after&amp;quot;: {
&amp;quot;id&amp;quot;: 1,
&amp;quot;name&amp;quot;: &amp;quot;b&amp;quot;,
&amp;quot;character&amp;quot;: &amp;quot;{\&amp;quot;view\&amp;quot;: \&amp;quot;沙尘暴\&amp;quot;, \&amp;quot;alias\&amp;quot;: \&amp;quot;首都\&amp;quot;}&amp;quot;
},
&amp;quot;source&amp;quot;: {
&amp;quot;version&amp;quot;: &amp;quot;1.5.2.Final&amp;quot;,
&amp;quot;connector&amp;quot;: &amp;quot;postgresql&amp;quot;,
&amp;quot;name&amp;quot;: &amp;quot;pg_232_demo&amp;quot;,
&amp;quot;ts_ms&amp;quot;: 1624952136318,
&amp;quot;snapshot&amp;quot;: &amp;quot;true&amp;quot;,
&amp;quot;db&amp;quot;: &amp;quot;dev&amp;quot;,
&amp;quot;sequence&amp;quot;: &amp;quot;[null,\&amp;quot;5673398848\&amp;quot;]&amp;quot;,
&amp;quot;schema&amp;quot;: &amp;quot;debezium&amp;quot;,
&amp;quot;table&amp;quot;: &amp;quot;cities&amp;quot;,
&amp;quot;txId&amp;quot;: 3409971,
&amp;quot;lsn&amp;quot;: 5673398848,
&amp;quot;xmin&amp;quot;: null
},
&amp;quot;op&amp;quot;: &amp;quot;r&amp;quot;,
&amp;quot;ts_ms&amp;quot;: 1624952136318,
&amp;quot;transaction&amp;quot;: null
}
}
&lt;/code>&lt;/pre>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>字段&lt;/th>
&lt;th>描述&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>schema&lt;/td>
&lt;td>描述了payload中的组织和结构&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload&lt;/td>
&lt;td>json格式的事件内容&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.before&lt;/td>
&lt;td>事件发生前的行记录&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.after&lt;/td>
&lt;td>事件发生后的行记录&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source&lt;/td>
&lt;td>记录事件来源的相关信息&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source.version&lt;/td>
&lt;td>debezium版本&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source.connector&lt;/td>
&lt;td>connector类型&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source.name&lt;/td>
&lt;td>connector的逻辑名称，同配置中的db.server.name&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source.ts_ms&lt;/td>
&lt;td>数据库中该事件发生的时刻&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source.snapshot&lt;/td>
&lt;td>是否是snapshot的一部分&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source.db&lt;/td>
&lt;td>数据库名称&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source.sequence&lt;/td>
&lt;td>第一个值是最后提交的lsn，第二个是当前的lsn&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source.schema&lt;/td>
&lt;td>schema名称&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source.table&lt;/td>
&lt;td>table名称&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source.txId&lt;/td>
&lt;td>事务id&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source.lsn&lt;/td>
&lt;td>Log Sequence Numbers 代表wal的位置&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.source.xmin&lt;/td>
&lt;td>仍然活动的最早的事务 ID&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.op&lt;/td>
&lt;td>操作类型 c=create, u=update, d=delete, r=read&lt;br />read 特指snapshot同步阶段的操作&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.ts_ms&lt;/td>
&lt;td>connector处理该事件的时刻，结合payload.source.ts_ms&lt;br />可以知道延迟大小&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>payload.transaction&lt;/td>
&lt;td>事务元数据信息，需要额外开启&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="42-变更数据">4.2 变更数据&lt;/h4>
&lt;ul>
&lt;li>
&lt;p>create事件&lt;/p>
&lt;p>插入新记录后推送的数据如下，与快照的数据基本相同，这里的snapshot为false，op为c(create)。&lt;/p>
&lt;pre>&lt;code class="language-json">{
&amp;quot;schema&amp;quot;: {
......
},
&amp;quot;payload&amp;quot;: {
&amp;quot;before&amp;quot;: null,
&amp;quot;after&amp;quot;: {
&amp;quot;id&amp;quot;: 10,
&amp;quot;name&amp;quot;: &amp;quot;guangzhou&amp;quot;,
&amp;quot;character&amp;quot;: &amp;quot;{\&amp;quot;alias\&amp;quot;: \&amp;quot;the City of Rams\&amp;quot;}&amp;quot;
},
&amp;quot;source&amp;quot;: {
&amp;quot;version&amp;quot;: &amp;quot;1.5.2.Final&amp;quot;,
&amp;quot;connector&amp;quot;: &amp;quot;postgresql&amp;quot;,
&amp;quot;name&amp;quot;: &amp;quot;pg_232_demo&amp;quot;,
&amp;quot;ts_ms&amp;quot;: 1624958765094,
&amp;quot;snapshot&amp;quot;: &amp;quot;false&amp;quot;,
&amp;quot;db&amp;quot;: &amp;quot;dev&amp;quot;,
&amp;quot;sequence&amp;quot;: &amp;quot;[\&amp;quot;5673645496\&amp;quot;,\&amp;quot;5673645496\&amp;quot;]&amp;quot;,
&amp;quot;schema&amp;quot;: &amp;quot;debezium&amp;quot;,
&amp;quot;table&amp;quot;: &amp;quot;cities&amp;quot;,
&amp;quot;txId&amp;quot;: 3411599,
&amp;quot;lsn&amp;quot;: 5674933152,
&amp;quot;xmin&amp;quot;: null
},
&amp;quot;op&amp;quot;: &amp;quot;c&amp;quot;,
&amp;quot;ts_ms&amp;quot;: 1624958765228,
&amp;quot;transaction&amp;quot;: null
}
}
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>update事件&lt;/p>
&lt;p>更新已有记录推送的数据如下，before中记录了之前的内容，after记录了之后的内容，op为u(update)。&lt;/p>
&lt;pre>&lt;code>{
&amp;quot;schema&amp;quot;: {
......
},
&amp;quot;payload&amp;quot;: {
&amp;quot;before&amp;quot;: {
&amp;quot;id&amp;quot;: 10,
&amp;quot;name&amp;quot;: &amp;quot;guangzhou&amp;quot;,
&amp;quot;character&amp;quot;: &amp;quot;{\&amp;quot;alias\&amp;quot;: \&amp;quot;the City of Rams\&amp;quot;}&amp;quot;
},
&amp;quot;after&amp;quot;: {
&amp;quot;id&amp;quot;: 10,
&amp;quot;name&amp;quot;: &amp;quot;guangzhou&amp;quot;,
&amp;quot;character&amp;quot;: &amp;quot;{\&amp;quot;alias\&amp;quot;: \&amp;quot;the City of Flowers\&amp;quot;}&amp;quot;
},
&amp;quot;source&amp;quot;: {
&amp;quot;version&amp;quot;: &amp;quot;1.5.2.Final&amp;quot;,
&amp;quot;connector&amp;quot;: &amp;quot;postgresql&amp;quot;,
&amp;quot;name&amp;quot;: &amp;quot;pg_232_demo&amp;quot;,
&amp;quot;ts_ms&amp;quot;: 1624959006739,
&amp;quot;snapshot&amp;quot;: &amp;quot;false&amp;quot;,
&amp;quot;db&amp;quot;: &amp;quot;dev&amp;quot;,
&amp;quot;sequence&amp;quot;: &amp;quot;[\&amp;quot;5674934168\&amp;quot;,\&amp;quot;5674934168\&amp;quot;]&amp;quot;,
&amp;quot;schema&amp;quot;: &amp;quot;debezium&amp;quot;,
&amp;quot;table&amp;quot;: &amp;quot;cities&amp;quot;,
&amp;quot;txId&amp;quot;: 3411658,
&amp;quot;lsn&amp;quot;: 5674995568,
&amp;quot;xmin&amp;quot;: null
},
&amp;quot;op&amp;quot;: &amp;quot;u&amp;quot;,
&amp;quot;ts_ms&amp;quot;: 1624959006982,
&amp;quot;transaction&amp;quot;: null
}
}
&lt;/code>&lt;/pre>
&lt;blockquote>
&lt;p>默认情况下，表的复制标识(Replica identity)为default，即订阅者根据行记录的主键来定位到对应行的记录，这种情况下，before字段中不会有行记录的全部内容。&lt;/p>
&lt;p>如果需要返回行记录的全部内容，可修改表的复制标识为full&lt;/p>
&lt;/blockquote>
&lt;pre>&lt;code class="language-sql">-- 修改Replica identity
ALTER TABLE debetium.cities REPLICA IDENTITY FULL;
-- 查看表的replica_identity
SELECT CASE relreplident
WHEN 'd' THEN 'default'
WHEN 'n' THEN 'nothing'
WHEN 'f' THEN 'full'
WHEN 'i' THEN 'index'
END AS replica_identity
FROM pg_class
WHERE oid = 'debezium.tourists'::regclass;
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>delete事件&lt;/p>
&lt;p>删除记录推送的数据如下，before是删除前的数据，after为null，op为d(delete);&lt;/p>
&lt;pre>&lt;code>{
&amp;quot;schema&amp;quot;: {
......
},
&amp;quot;payload&amp;quot;: {
&amp;quot;before&amp;quot;: {
&amp;quot;id&amp;quot;: 10,
&amp;quot;name&amp;quot;: &amp;quot;guangzhou&amp;quot;,
&amp;quot;character&amp;quot;: &amp;quot;{\&amp;quot;alias\&amp;quot;: \&amp;quot;the City of Flowers\&amp;quot;}&amp;quot;
},
&amp;quot;after&amp;quot;: null,
&amp;quot;source&amp;quot;: {
&amp;quot;version&amp;quot;: &amp;quot;1.5.2.Final&amp;quot;,
&amp;quot;connector&amp;quot;: &amp;quot;postgresql&amp;quot;,
&amp;quot;name&amp;quot;: &amp;quot;pg_232_demo&amp;quot;,
&amp;quot;ts_ms&amp;quot;: 1624959858803,
&amp;quot;snapshot&amp;quot;: &amp;quot;false&amp;quot;,
&amp;quot;db&amp;quot;: &amp;quot;dev&amp;quot;,
&amp;quot;sequence&amp;quot;: &amp;quot;[\&amp;quot;5674995800\&amp;quot;,\&amp;quot;5674995800\&amp;quot;]&amp;quot;,
&amp;quot;schema&amp;quot;: &amp;quot;debezium&amp;quot;,
&amp;quot;table&amp;quot;: &amp;quot;cities&amp;quot;,
&amp;quot;txId&amp;quot;: 3411864,
&amp;quot;lsn&amp;quot;: 5675157120,
&amp;quot;xmin&amp;quot;: null
},
&amp;quot;op&amp;quot;: &amp;quot;d&amp;quot;,
&amp;quot;ts_ms&amp;quot;: 1624959859169,
&amp;quot;transaction&amp;quot;: null
}
}
&lt;/code>&lt;/pre>
&lt;/li>
&lt;/ul>
&lt;h3 id="5-可视化管理">5. 可视化管理&lt;/h3>
&lt;h4 id="51-debezium-ui">5.1 debezium-ui&lt;/h4>
&lt;ul>
&lt;li>
&lt;p>docker方式安装debezium-ui&lt;/p>
&lt;pre>&lt;code class="language-shell">docker run -it --rm --name debetium-ui -e KAFKA_CONNECT_URI=http://127.0.0.1:8083 -e UI_BASE_URI=http://127.0.0.1:8080/api -e JAVA_OPTIONS=&amp;quot;-Xmx256m&amp;quot; -p 8080:8080 debezium/debezium-ui:1.5
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>使用debezium-ui http://localhost:8080&lt;/p>
&lt;ul>
&lt;li>查看connector&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="images/image-20210630095906946.png" alt="image-20210630095906946">&lt;/p>
&lt;ul>
&lt;li>创建connector&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="images/image-20210630095757040.png" alt="image-20210630095757040">&lt;/p>
&lt;/li>
&lt;/ul></description></item></channel></rss>