您好,我尝试在PostgreSQL和SQL Server之间建立Kafka连接管道。我使用了3个Kafka代理,需要使用252个主题(一个主题与一个PostgreSQL表相同)。运行一个多小时后,它只能从252张桌子中拉出218张。我发现的错误是SQL Server中存在死锁机制,该机制可以将事务保留到SQL Server并尝试重试它,而且Debezium复制插槽已经存在。
我在接收器上使用了3个max worker的分布式连接器,但似乎还不够。还可以尝试将offset.time_out.ms设置为60000,将偏移分区设置为较高(100)。恐怕这不是我想要的生产水平。任何人都可以对此案提出建议吗?是否有任何计算方法可以确定我所需的最佳工人数量?
问题可能是同时访问具有多个任务的同一SQL表并引起了同步问题,如您提到的死锁。由于您已经有很多主题,并且连接器可以并行访问它们,因此建议您将每个主题的分区数减少到仅1(Kafka不支持将分区数减少。应该删除并使用新的分区数重新创建每个主题)。这样,每个主题只有一个分区。每个分区只能在一个线程(/ task / consumer)中访问,因此没有机会将并行SQL事务传输到同一表。
或者,更好的方法是创建具有3个分区的单个主题(与您拥有的任务/消费者的数量相同),并使生产者将SQL表名用作消息键。Kafka保证具有相同密钥的消息始终进入同一分区,因此具有相同表的所有消息都将驻留在单个分区上(消耗单个线程)。
如果您觉得它有用,我可以附上有关如何创建Kafka Producer和发送键控消息的更多信息。