elasticsearch - Elasticsearch:同一台机器上的几个独立节点
问题描述
我们当前的软件解决方案使用本地 ES 安装(1 个集群和 1 个节点)来存储文档,以便以后用户能够搜索它们。节点的摄取不是连续完成的,但假设每月一次使用批量。文档集不是很大,文档的大小很小。该解决方案在普通笔记本电脑(具有 8Gb RAM 的 i5)中正常工作,没有问题,因为用例不需要很大的性能。
现在,我们的软件解决方案面临 2 个新要求:
- 应该为其他客户打上烙印
- 同一最终用户(使用同一台机器)应该能够使用我们解决方案的多个实例(来自不同客户)
对于这两个新要求,当前的解决方案不能使用,因为所有文档都将使用相同的索引在同一个节点中进行索引。进一步的搜索将显示来自不同客户的文档。
解决此问题的第一种方法是基于客户对文档进行索引,即为每个客户创建索引并在相应索引上创建索引/搜索文档。但是,我们正在考虑另一种解决方案,它允许我们执行以下操作:
- ES 索引信息必须很容易从系统中删除(即通过删除数据文件夹)
- 每个客户可能希望使用我们解决方案的更新版本(即使用 ES 7),而其他客户将保留旧版本(即 ES 6)
基于此,我认为解决方案是在同一台 PC 上安装多个 ES,每个都具有其客户相关配置:
- 不同的集群
- 不同的节点名称和端口
- 不同的ES版本
那么我的问题是,有没有人遇到过类似的用例?安装几个 ES 让他们的服务同时连续运行会不会是性能问题?使用此配置可能会出现哪些问题?
任何帮助,将不胜感激。
更新
根据收到的答案以及未来可能的答案,我想进一步澄清一下我们的解决方案 + ES 的架构:
- 我们的解决方案是在普通笔记本电脑上执行的桌面应用程序
- 单用户
- 即使在 PC 中安装了多个客户特定的解决方案,一次也只有 1 个处于活动状态
- 当用户想要搜索特定文档时,搜索将偶尔执行(就像有人打开 Wikipedia 搜索文章一样)
所以主题...
- 基础设施故障
- 数据复制
- 高搜索需求下的性能
... 不重要
解决方案
您可以在生产中的同一台机器上运行多个 ES 安装,但它有很多缺点。
理想情况下,您应该至少有 1 个分片副本,并且它应该存在于另一台物理机器(节点)中,以便在基础设施出现故障的情况下可以恢复,这样做是为了提高系统的弹性。
在生产中,经常会遇到这样一个用例,其中只有一个分片是不够的,您需要将索引分成多个主分片以使其水平可扩展,但如果您只使用一台物理服务器,那么拥有多个分片将无济于事你。
在一个安装中存在大量流量并且消耗所有物理资源(如 RAM、CPU、磁盘)并导致所有安装在生产中停止的情况下,多个安装也无济于事。它也变得难以找出根本原因并快速解决问题,因为 ES 安装不是无状态的,您不能只在另一台机器上启动相同的安装,而不移动其所有数据和配置。
基本上,您的系统是一个真正基于租户的 SAAS 应用程序,通过研究您的需求,您应该考虑以下因素来设计您的系统:
- 升级 ES 版本有时不是很简单,它还涉及对应用程序代码的大量重大更改,仅使用最新版本运行的集群无法解决问题。因此,您的应用程序应该公开租户(您的客户)注册 API,该 API 还接受客户想要使用的 ES 版本,并相应地由您的代码处理。
- ES 索引信息必须很容易地从系统中删除:- 我没有得到这里的问题,您可以使用ES API简单地删除它,这是推荐的方法,而不是手动进行。
希望我的回答对您来说很清楚,如果我错过了您的任何要求并且您需要进一步澄清,请告诉我。
根据问题的更新,我添加以下几点:
正如 OP 提到的它是一个非常小的桌面应用程序而不是服务器端应用程序,那么不要混合和存储每个客户的内容是非常重要的。任何人都可以像https://github.com/lmenezes/cerebro一样安装 ES web admin 插件并读取其他客户的数据。
在您的情况下,最好的解决方案是根据客户指定的版本安装一个 ES,并且只有 1 个与运行桌面应用程序的客户相关的索引。您可以轻松地使用我之前提到的删除 API。
根本不需要进行多次安装,即使它们不会处于活动状态,但它们仍然会消耗本地磁盘空间(这在桌面应用程序的情况下更为重要)并且可能导致这个和这个问题而不是它更简洁的设计可以将不必要的信息存储在桌面应用程序上,并且还会导致安全问题,这通常是更大的问题。
推荐阅读
- java - 展开时如何在通知中获取圆形头像?
- javascript - 用于中间件函数调用的“任何类型值的不安全调用”
- process - 如何将 OS Process Sampler 的结果保存到变量中?
- javascript - 如何使用 JavaScript 变量更改 HTML 值?
- discord.js - Discord.js v13 将缓冲区作为附件发送会导致图像不可见
- r - 当PickerInput中的值更改时,我想在按钮上添加发光效果
- sql-server - 为什么 LINQ 生成的 SQL 包含同一列的多个“IS NULL”条件
- javascript - ResizableBox 不包装内容
- spring-boot - 如何强制 Quartz 在集群模式下顺序运行
- mysql - 获取按日期分组的计数(列)的平均值,但满足某些条件