C# 如何将MSSQL同步到Elasticsearch?
每次我在谷歌上搜索这个,我都会发现“river”方法不受欢迎。如果这是一个有用的信息,我正在使用DapperC# 如何将MSSQL同步到Elasticsearch?,c#,sql-server-2008,dapper,nest,elasticsearch-net,C#,Sql Server 2008,Dapper,Nest,elasticsearch Net,每次我在谷歌上搜索这个,我都会发现“river”方法不受欢迎。如果这是一个有用的信息,我正在使用Dapper 那么,这些天的解决方案是什么呢?你的问题涉及面很广,因此这是指向一些选项的指针 用于查询数据库和分析数据 在文章中: 客户端库 一年多来,我们已经为客户提供了官方图书馆 大多数编程语言中的Elasticsearch。这意味着钩住 并通过现有的代码库获取数据 应该比较简单。这项技术还允许轻松地 在数据进入Elasticsearch之前对其进行咀嚼。一个常见的例子是 已使用ORM将域模型映射
那么,这些天的解决方案是什么呢?你的问题涉及面很广,因此这是指向一些选项的指针 用于查询数据库和分析数据 在文章中: 客户端库 一年多来,我们已经为客户提供了官方图书馆 大多数编程语言中的Elasticsearch。这意味着钩住 并通过现有的代码库获取数据 应该比较简单。这项技术还允许轻松地 在数据进入Elasticsearch之前对其进行咀嚼。一个常见的例子是 已使用ORM将域模型映射到 数据库,并将域模型挂接和索引回 Elasticsearch易于实现 关于如何在中使用弹性搜索,有大量文档: 这些文件将涉及以下内容: 安装: 这就是你需要发展的 插件 也可以用来代替河流,从河流中开发出各种插件 此外,还可以使用Logstash或类似工具将数据发送到 弹性搜索。例如,Elasticsearch附带的一些河流 现在在 即将发布的Logstash 1.5 额外阅读 虽然这是一种不同的语言和框架,但博客作者和信息可能有助于浏览。他建议在应用程序层执行此操作 从评论中解决问题 SQL Server提供了一个内置的系统来跟踪数据更改,这是一种自动跟踪数据更改的有效方法,无需执行手动方法来检查更改 有两种方法可以实现这一点: 使用: 使用时间戳跟踪数据更改。可以跟踪数据更改的历史记录 变更数据捕获为用户提供历史变更信息 通过捕获DML更改的事实和 已更改的实际数据。通过使用 读取事务日志并具有低优先级的异步进程 对系统的影响 使用: 这样可以减少管理费用,但无法跟踪历史变化。保留最新的更改,但不再后退 更改跟踪捕获表中的行已更改的事实, 但不捕获已更改的数据。这使得 应用程序来确定使用最新版本更改的行 直接从用户表中获取的行数据。所以,, 变更跟踪在历史问题方面更为有限 答案与更改数据捕获相比
你可以使用Logstash来完成这项工作。只需使用logstash JDBC插件来设置logstash管道。请点击此链接:-
还可以在GitHub上查看此回购协议,因此,我只需要2美分就可以实现此协议。在过去,我通过设置触发器写入作为事件日志的缓冲表来实现这一点。然后我在计时器上有一个无服务器函数(AWS Lambda),它将清除事件日志并将所需的更改推送到ES中。通过这种方式,我不必在触发器中做任何疯狂的事情,甚至不必真正更改我的原始代码。尽管问题是关于从
MSSQL
-->ElasticSearch同步的,但我觉得跨异构系统同步的基本思想是完全相同的。
你可能需要
- 定义并创建要同步的数据批
- 跟踪上次同步的批次,以确定从何处开始,基本上是标记
- 转换数据
- 最后运输一批
这篇文章更详细地解释了实现这一目标的所有细节。我多次看到这篇文章,觉得需要更新答案 为了将数据从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}"
}
}
输入{
jdbc{
jdbc_connection_string=>“jdbc:sqlserver://${sql_server};数据库=api;用户=;密码=;应用程序名=logstash”
#我们希望作为执行语句的用户
jdbc_user=>nil
id=>“索引名称”
jdbc_driver_library=>“/var/tmp/mssql-jdbc-6.2.2.jre8.jar”
jdbc_驱动程序_类=>“com.microsoft.sqlserver.jdbc.SQLServerDriver”
附表=>“*/2****”
语句=>“exec存储过程”
小写字母列名称=>false
}
}
输出{
弹性搜索{
“id”=>“索引名称”
“主机”=>“elasticsearch:9200”
“索引”=>“索引名称”
“文档id”=>“%{primary\u key}”
}
}
`您不同步到Elasticsearch。您可以从源代码中提取要搜索的信息,并将其发送给Elastic。river就是这么做的。如中所述,这已被Logstash取代。另一个选择是使用将数据直接发送到Elastic。顺便说一句,所有搜索引擎都是这样工作的,尽管接线没有显示太多。爬虫程序从源中提取数据,索引器处理数据以生成搜索索引,查询处理器使用这些索引加快搜索速度。这些角色可以在多台计算机上运行,以实现负载平衡和scalability@JedatKinports在数据库中使用布尔值是cert
var node = new Uri("http://mynode.example.com:8082/apiKey");
var config = new ConnectionConfiguration(node);
var client = new ElasticsearchClient(config);`
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}"
}
}