Elasticsearch - 我需要 JDBC 驱动程序吗?

2024-01-29

Aim

将我的 Elasticsearch 服务器与 SQL 数据库中的新数据和过期数据同步

Issue

我可以通过两种截然不同的方法来实现这一目标,但我不知道哪种方法更好。我也可以pull使用 JDBC River 插件直接连接到 SQL 数据库,将信息发送到 elasticsearch。或者我可以push使用 PHP 客户端将数据传输到 elasticsearch,代码如下所示:

// The Id of the document
$id = 1;

// Create a document
$tweet = array(
    'id'      => $id,
    'user'    => array(
        'name'      => 'mewantcookie',
        'fullName'  => 'Cookie Monster'
    ),
    'msg'     => 'Me wish there were expression for cookies like there is for apples. "A cookie a day make the doctor diagnose you with diabetes" not catchy.',
    'tstamp'  => '1238081389',
    'location'=> '41.12,-71.34',
    '_boost'  => 1.0
);
// First parameter is the id of document.
$tweetDocument = new \Elastica\Document($id, $tweet);

// Add tweet to type
$elasticaType->addDocument($tweetDocument);

// Refresh Index
$elasticaType->getIndex()->refresh();

我打算每三十分钟运行一次 cron 来检查数据库中的项目,这些项目不仅具有“活动”标志,而且还没有“索引”标志,这意味着我需要将它们添加到索引中。

QUESTION

鉴于我有两种方法以两种不同的方式在elasticsearch和mysql之间同步数据,每个选项的优点和缺点是什么。是否有一个特定的用例来定义使用其中一个而不是另一个?


我会用河流法甚至认为内部构建解决方案可能更具可定制性。

在一边,jdbc-river 插件是一个已经构建的插件,到目前为止有大约 20 个贡献者。因此,您需要一个额外的团队来致力于改进该工具,同时 Elasticsearch 本身也在不断改进。

您所要做的就是安装它,甚至不需要复杂的配置来在集群和关系数据库之间设置一条河流。

jdbc-river 解决方案的另一个优点是您不需要处理内存管理。该插件可以在“拉模式”下充当河流,也可以在“推模式”下充当馈线。在 feeder 模式下,该插件在单独的 JVM 中运行,并且可以连接到远程 Elasticsearch 集群。我个人更喜欢river模式,因为在这种情况下,Elasticsearch 将处理索引和内存管理问题。

关系数据在内部转换为结构化 JSON 对象,用于 Elasticsearch 文档的无模式索引模型。

两端都是可扩展的。该插件可以并行地从不同的 RDBMS 源获取数据,多线程批量模式确保索引到 Elasticsearch 时的高吞吐量。

该解决方案的缺点之一是它不会在索引完成时发出通知。作为解决方案,我建议您使用计数API http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-count.html比较结果。

河流的另一个缺点是它不拉力update,它只是在insert or delete。我当然指的是 sql 操作 UPDATE、INSERT 和 DELETE。

二手的,您的解决方案可能会带来一些您可能需要考虑的优点和缺点。

您的解决方案是高度可定制的,因此您可以根据需要管理脚本。但考虑到任何可用的 PHP Elasticsearch 客户端的当前状态(官方 Elasticsearch-php 客户端 http://www.elasticsearch.org/guide/en/elasticsearch/client/php-api/current/index.html , Elastica https://github.com/ruflin/Elastica or FOSElastica 捆绑包 https://github.com/FriendsOfSymfony/FOSElasticaBundle),即使这些人在这些方面做得很好,与用于河流的官方 Elasticsearch JAVA API 相比,它仍然被认为是一个不太成熟的 API。

您还应该考虑处理所有可能因内存丢失、管理、性能等问题而导致集群出现的错误。

例如:我尝试使用 Elastica API 构建概念验证,将数据从数据库推送到集群,配置为 32g RAM,每个核心运行 @2.05GHz,在测试环境中运行 8 个核心,但没有涉及太多细节。我花了 5 个小时才将 10M 记录从数据库推送到集群。与河流一样,同样的记录需要 20 分钟。当然,可能可以对我的代码进行优化,但我认为它会给我带来更多的时间。

所以,只要你能根据自己的需求定制河流,就可以使用它。如果河牌圈不支持你想做的事情,那么你可以坚持自己的解决方案。

NB:当然,您可能还需要考虑其他问题,但在这里讨论这个主题很长。所以我选择了一些你应该注意的要点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch - 我需要 JDBC 驱动程序吗? 的相关文章

随机推荐