我有一个基于java的web应用程序,它使用2个microsoftsql后端数据库服务器(一个服务器是实时数据库,因为它是事务性的,另一个是报表数据库)。事务数据库和报表数据库之间的延迟大约为30分钟,增量数据是使用sql作业加载的,sql作业每30分钟运行一次,执行大约需要20-25分钟。此作业正在执行ssis包,使用此包,来自报表数据库的数据将进一步处理,并存储在hdfs和hbase中,最终用于分析。
现在,我想减少这个延迟,为此,我正在考虑实现一个消息传递框架。在做了一些研究之后,我了解到kafka可以解决我的问题,因为kafka除了作为消息传递框架外,还可以作为etl工具。
我该怎么办?我是否应该创建与SQLServer中的表结构类似的主题并对其执行操作?我是否应该重定向我的应用程序以先在kafka中编写任何更改,然后在事务数据库中编写任何更改?请考虑上述用例,建议使用kafka。
1条答案
按热度按时间y3bcpkx11#
有两种方法可以做到这一点,需要最少的代码,然后总是可以选择编写自己的代码。
(有些同事刚看完这个,用的是sql server和oracle,所以我在这里稍微了解一下)
如果您使用的是企业版的sql server,则可以使用更改数据捕获和confluent kakfa connect来读取对数据的所有更改。这(似乎)需要一个企业许可证,并可能包括一些其他额外的费用(我是模糊的细节在这里)。这可能是因为我们使用的是较旧版本的sql server,或者因为我们有许多数据库服务器)。
如果您没有/不能使用cdc,那么kafka connect的jdbc支持也有一种模式,它可以轮询数据库中的更改。如果您的记录有某种时间戳列,那么这种方法效果最好,但通常是这样。
不带cdc的仅轮询模式意味着您不会得到所有更改—即如果您每30秒轮询一次,并且记录更改两次,您将不会得到有关此更改的单独消息,但如果这是合理的,您将得到一条包含这两个更改的消息。这对于您的业务领域来说可能是可以接受的,但是需要注意的是。
无论如何,kafka connect非常酷-它将根据表名自动为您创建kafka主题,包括将avro模式发布到模式注册表(主题名是可以知道的,因此如果您处于auto topic creation=false的环境中,那么您可以根据表名手动创建主题。从没有kafka connect知识开始,我花了大概2个小时才弄清楚足够的配置,以便将一个大型sqlserver数据库转储到kafka。
我在一个github存储库中找到了描述所有这些的文档,其中包括设置文档等。
你可以选择让你的web应用程序本身就是一个Kafka制作者,而忽略底层的数据库内容。这可能是一个更好的解决方案,比如一个请求在数据存储中创建了许多记录,但实际上这是一个相关的事件(一个订单可能会在关系数据库中生成一些行项目记录,但下游数据库只关心订单是否已生成)。
在用户端(即“紧挨着”另一个数据库),您可以在另一端使用kafka connect获取更改,甚至可以在需要时编写自定义插件,或者编写您自己的kafka用户微服务将更改放入另一个数据库。