如何将MSSQL同步到Elasticsearch?

时间:2017-08-16 08:43:15

标签: c# sql-server-2008 dapper nest elasticsearch-net

每当我谷歌这一点,我都会发现“河流”方法已被弃用。如果这是一个有用的信息,我正在使用Dapper。

那么这些日子的解决方案是什么?

5 个答案:

答案 0 :(得分:11)

你的问题是广义的 - 所以这是指向某些选项的指针。

Elastic search用于查询数据库并分析数据。

在文章Deprecating Rivers中:

客户端库

  

一年多以来,我们已经有了官方客户端库   大多数编程语言中的Elasticsearch。这意味着挂钩   进入您的应用程序并通过现有代码库获取数据   应该比较简单。这种技术也很容易实现   在数据到达Elasticsearch之前进行数据处理。一个常见的例子是   已经使用ORM将域模型映射到的应用程序   数据库,并将域模型挂钩并索引回   Elasticsearch往往易于实现。

有关如何使用弹性搜索的大量文档:

Elasticsearch.Net

文档将解决以下问题:

安装package

PM> Install-Package Elasticsearch.Net

Connection

var node = new Uri("http://mynode.example.com:8082/apiKey");  
var config = new ConnectionConfiguration(node);  
var client = new ElasticsearchClient(config);`  

Security

Pooling and Failover

Building requests

这是你需要开发的。

Response handling

Error handling

<强>插件

也可以使用

Logstash代替Rivers,从中开发了各种插件。

  

此外,可以使用Logstash或类似工具将数据发送到   Elasticsearch。例如,Elasticsearch带来了一些河流   现在实现为Logstash插件(如CouchDB中的插件)   即将到来的Logstash 1.5。

额外阅读

虽然这是一种不同的语言和框架 - Advanced Search for Your Legacy Application的博客David Pilato和信息可能有助于浏览。他建议在应用层中进行。

解决评论中的问题。

Data changes can be tracked

SQL Server提供了一个内置系统来跟踪数据更改,这是一种自动跟踪数据更改的有效方法,无需实施手动方法来检查更改。

有两种方法可以实现这一目标:

使用Change Data Capture

使用时间戳跟踪数据更改。可以跟踪数据更改的历史记录。

  

更改数据捕获为用户提供历史更改信息   表通过捕获DML更改的事实和   已更改的实际数据。使用a捕获更改   读取事务日志并且具有低的异步进程   对系统的影响。

使用Change Tracking

这减少了开销,但没有跟踪历史变化。保留了最新的更改,但没有进一步的回复。

  

更改跟踪捕获表中的行已更改的事实,   但不捕获已更改的数据。这使得   用于确定使用最新更改的行的应用程序   行数据直接从用户表中获得。因此,   变更跟踪在历史问题上更加有限   答案与更改数据捕获相比。 ... / ...

答案 1 :(得分:2)

您可以使用Logstash来完成这项工作。只需使用logstash JDBC插件即可设置logstash管道。请点击此链接: - Migrate MySQL data to ElasticSearch

同时在GitHub ElasticSearchCRUD

上查看此回购

答案 2 :(得分:1)

即使问题是要求同步来自MSSQL - &gt; ElasticSearch,我觉得跨异构系统同步的基本思想将完全相同。 你可能需要

  • 定义和创建要同步的批量数据
  • 跟踪同步的最后一批,以确定从哪里开始,基本上是标记
  • 转换数据
  • 最后运输批次

本文Continuous data sync across Hetereogeneous Systems - YoursAndMyIdeas解释了更详细地实现这一目标的所有细节。

答案 3 :(得分:1)

我多次看过这篇文章,觉得它需要更新的答案。

为了将数据从mssql实例传输到Elasticsearch中,我使用了ELK堆栈固有的Logstash。您可以使用jdbc输入插件定义各个管道和配置。

这是一个示例配置文件。这将每2分钟运行一次存储过程,并将数据插入正确的索引中。请记住提供一些仅同步新数据记录的方法,否则在数据变大时会遇到扩展问题。

input {  
    jdbc {
        jdbc_connection_string => "jdbc:sqlserver://${sql_server};database=api;user=<username>;password=<password>;applicationname=logstash"
        # The user we want to execute our statement as
        jdbc_user => nil
        id => "index_name"
        jdbc_driver_library => "/var/tmp/mssql-jdbc-6.2.2.jre8.jar"
        jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
        schedule => "*/2 * * * *"
        statement => "exec stored_procedure"
        lowercase_column_names => false

    }

}


output {
    elasticsearch {
        "id" => "index_name"
        "hosts" => "elasticsearch:9200"
        "index" => "index_name"
        "document_id" => "%{primary_key}" 

    }

}

`

答案 4 :(得分:0)

所以,这只是我的2¢。在过去,我通过设置触发器来写入充当事件日志的缓冲表来完成此操作。然后我在计时器上有一个无服务器功能(AWS Lambda),它将清除事件日志并将所需的更改推送到ES。这样我就不必在触发器中做任何疯狂的事情,或者甚至更改我的原始代码。