我会用河流法甚至认为内部构建解决方案可能更具可定制性。
在一边,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:当然,您可能还需要考虑其他问题,但在这里讨论这个主题很长。所以我选择了一些你应该注意的要点。