如何将MSSQL同步到Elasticsearch?

问题描述:

每次我谷歌这一点,我觉得不赞成使用“河”的做法。如果这是一个有用的信息,我正在使用Dapper。如何将MSSQL同步到Elasticsearch?

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

+2

你不*同步到Elasticsearch。你*提取你想从你的源搜索的信息并发送给Elastic。河就是这样。这已被Logstash取代,如[https://www.elastic.co/blog/deprecating-rivers](https://www.elastic.co/blog/deprecating-rivers)所述。另一个选择是使用[.NET客户端](https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/index.html)将数据直接发送到Elastic –

+2

顺便说一句,这就是所有的搜索引擎都能正常工作,尽管布线没有那么多。爬行器从数据源中提取数据,索引器对数据进行处理以生成搜索索引,并且查询处理器使用这些索引来加速搜索。这些角色可以在多台机器上运行,以实现负载平衡和可扩展性 –

+0

感谢@PanagiotisKanavos:“您不会同步到Elasticsearch,您可以从源文件中提取想要搜索的信息并将其发送给Elastic。”我只是不知道这样做的标准做法是什么。 – JedatKinports

你的问题是广泛的 - 所以这是一个选项的指针。

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也可以用来代替河流,从各种插件已经被开发。

此外,可以使用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进行了更改的事实和已更改 实际数据的历史变化信息。通过使用读取事务日志的 异步进程捕获更改,并对系统产生较低的 影响。

使用Change Tracking

这有更少的开销,但不跟踪的历史变迁。最新的变化被保留,但没有更多的回来。

更改跟踪捕获表中的行已更改的事实,但不捕获已更改的数据。这使得 应用程序可以确定直接从用户表中获取的最新行数据所更改的行。因此, 更改跟踪在历史问题上更受限制,它可以与 答案进行比较,以更改数据捕获。 .../...

如何将MSSQL同步到Elasticsearch?

一个简单的解决方案可能是一个PowerShell脚本(SQL Agent工作):

Import-Module 'sqlps' -DisableNameChecking; 

Invoke-Sqlcmd ` 
-ServerInstance "(local)\SQL2016" ` 
-Database "msdb" ` 
-Query "SELECT TOP(1) object_id AS id, name, type_desc FROM sys.objects" ` 
| Select-Object * -ExcludeProperty ItemArray, Table, RowError, RowState, HasErrors -OutVariable sql_results 

$id = $sql_results.id 
$json_results = ConvertTo-Json -InputObject $sql_results[0] # In this case, input object is an array/table with a single row 

Invoke-RestMethod "http://localhost:9200/index007/type007/$id" -Method Put -Body $json_results -ContentType "application/json" 

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

也会检出GitHub上ElasticSearchCRUD

+0

对于SQL服务器,检查https://shariefmohatad.wordpress。 com/2016/03/29/ms-sql-config-with-logstash /可以使用JDBC以类似的方式完成 –

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

尽管问题是要求从MSSQL - >ElasticSearch同步,但我觉得跨异构系统同步的基本思想是完全相同的。 您可能需要

  • 定义和创建要sync'ed
  • 轨道的最后一批,以同步数据的批次来确定从哪里开始,基本上标记
  • 转换数据
  • 最后运输一批

这篇文章Continuous data sync across Hetereogeneous Systems - YoursAndMyIdeas解释所有细节,以更详细地实现这一点。