2017-08-16 116 views
5

每次我谷歌這一點,我覺得不贊成使用「河」的做法。如果這是一個有用的信息,我正在使用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

回答

6

你的問題是廣泛的 - 所以這是一個選項的指針。

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

這有更少的開銷,但不跟蹤的歷史變遷。最新的變化被保留,但沒有更多的回來。

更改跟蹤捕獲表中的行已更改的事實,但不捕獲已更改的數據。這使得 應用程序可以確定直接從用戶表中獲取的最新行數據所更改的行。因此, 更改跟蹤在歷史問題上更受限制,它可以與 答案進行比較,以更改數據捕獲。 .../...

0

如何將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" 
1

您可以使用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以類似的方式完成 –

0

此回購所以,只是我的2¢上實現這一點。在過去,我通過設置觸發器來寫入作爲事件日誌的緩衝區表來完成此操作。然後,我在計時器上安裝了無服務器功能(AWS Lambda),該計時器將清除該事件日誌並將所需更改推送到ES中。這樣我就不必在觸發器中做任何瘋狂的事情,或者甚至改變我的原始代碼。

1

儘管問題是要求從MSSQL - >ElasticSearch同步,但我覺得跨異構系統同步的基本思想是完全相同的。 您可能需要

  • 定義和創建要sync'ed
  • 軌道的最後一批,以同步數據的批次來確定從哪裏開始,基本上標記
  • 轉換數據
  • 最後運輸一批

這篇文章Continuous data sync across Hetereogeneous Systems - YoursAndMyIdeas解釋所有細節,以更詳細地實現這一點。