SQL Server 数据实时到 Kafka
Posted
技术标签:
【中文标题】SQL Server 数据实时到 Kafka【英文标题】:SQL Server Data to Kafka in real time 【发布时间】:2022-01-02 22:29:15 【问题描述】:我想直接将实时数据从 SQL server 添加到 Kafka,我发现https://debezium.io/docs/connectors/sqlserver/提供了一个 SQL server 连接器
在文档中,它说它将为每个表创建一个主题。我试图了解架构,因为我有 500 个客户端,这意味着我有 500 个数据库,每个数据库都有 500 个表。这是否意味着它将创建 250000 个主题,或者我是否需要为每个客户端单独的 Kafka 集群,并且每个集群/节点将根据数据库中的表数有 500 个主题?
这是将 SQL 数据发送到 Kafka 的最佳方式,还是应该在表上有插入/更新/删除时通过代码向 Kafka 队列发送事件?
【问题讨论】:
我非常怀疑所有表实际上都需要放入 Kafka 中吗?如果您维护 100 台数据库服务器,您是否准备好维护 100 个 Kafka 集群(至少多 300 台服务器)?而且我从未使用过 Debezium 连接器,但我相当确定它可以从一个连接器读取数据库中的多个表(是的,架构更改通常是 CDC 日志的一部分) @OneCricketeer 你是说我们需要 100 个 Kafka 集群,每个数据库一个?或者我们可以在集群中有多个节点。我们可以有 2 个集群,每个集群里面有 10 个节点你有什么将实时 sql 数据移动到 kafka 的建议吗?怎么做? Debezium 是常见的推荐。我个人并不需要它,因为我们将数据写入 Kafka,然后写入 SQL,而不是相反......我对您的架构没有建议,但您显然需要隔离您的“客户” " 以某种方式使一个 Kafka 集群中断不会影响另一个客户端 @OneCricketeer 我曾考虑将数据写入 Kafka,但这提出了一个问题,如果向 Kafka 发送事件的人将不正确的数据或数据添加到 sql 并且现在无法发送事件,该怎么办。你必须围绕它构建整个过程。你知道一个sql连接器能不能连接多个数据库吗? 好吧,如果事件是强类型的(例如 Avro 或 Protobuf),那么虽然不太可能,但可能会有格式错误的数据。关于这个问题,你有没有看到名为database.names
- debezium.io/documentation/reference/1.7/connectors/…的属性
【参考方案1】:
使用 debezium,您会被困在一张表到一个主题的映射中。但是,有一些创造性的方法可以绕过它。
根据描述,您似乎有某种具有 SQL Server 后端的产品,并且有 500 个表。该产品被 500 或更多的客户使用,每个人都有自己的数据库实例。
您可以为一个客户端创建一个连接器并读取所有 500 个表并将其发布到 Kafka。此时您将拥有 500 个 Kafka 主题。您可以通过为每个客户端/数据库实例创建单独的连接器,将来自所有其他数据库实例的数据路由到相同的 500 个主题。我假设由于这是产品的后端数据库,表名、模式名等都是相同的,并且 debezium 连接器将为表生成相同的主题名称。如果不是这样,您可以使用topic routing SMT。
您可以通过在主题中添加一些元数据列来区分 Kafka 中的数据。这可以通过添加 SMT 在连接器中轻松完成。元数据列可以是 client_id、client_name 或其他。
至于你的其他问题,
这是向 Kafka 发送 SQL 数据的最佳方式,还是应该在表上有插入/更新/删除时通过代码向 Kafka 队列发送事件?
答案是“视情况而定!”。 如果它是一个简单的事务性应用程序,我会简单地将数据写入数据库,而不用担心其他任何事情。
答案还取决于您为什么要将数据传送到 Kafka。如果您希望将数据/业务事件传递给 Kafka 以执行一些需要事务完整性和严格 SLA 的下游业务处理,那么从应用程序写入数据可能是有意义的。但是,如果您将数据发布到 Kafka 以供其他人用于分析或任何其他原因,则使用 K-Connect 方法是有意义的。
有一个获得许可的替代品 Qlik Replicate,它具有非常相似的功能。
【讨论】:
这是一个很好的答案。我的后续行动是不会为每个客户端创建和维护单独的连接器成为一场噩梦,因为 500 只是一个示例,有 10,000 个客户端,并且使用微服务架构,您可以拥有 500,000 个数据库,这意味着现在每个数据库都有连接器。另外,我不希望主题是表名。它必须是基于域的,因为其他人可以使用相同的主题,但事件会有所不同。 如果您有 10,000 个数据库,您将需要单独的进程来从中读取数据。这肯定是一笔开销。如果需要将数据发布到 Kafka,我会将该逻辑融入应用程序代码中。根据下游的 SLA 和一致性要求,我会相应地设计实现。例如,将接收器设置为 Kakfa 可选和异步进程。以上是关于SQL Server 数据实时到 Kafka的主要内容,如果未能解决你的问题,请参考以下文章
Flink 实战系列Flink SQL 实时同步 Kafka 数据到 Hudi(parquet + snappy)并且自动同步数据到 Hive
Flink 实战系列Flink SQL 实时同步 Kafka 数据到 Hudi(parquet + snappy)
kafka + spark Streaming + Tranquility Server发送数据到druid