包含 TB 及以上规模数据的 Elasticsearch 集群的推荐设置是什么?

What is the recommended setup for an Elasticsearch cluster that contains data at the scale of TBs and above?

目前,我有几个 Elasticsearch 节点 运行 在几台包含 TB 大小索引的裸机上。我们正在重组我们的基础架构,我不确定这是否是最好的方法。

我一直在寻找 Docker、Mesos 和 Vagrant 作为替代方案,但我不确定它们是否可行。我认为有四种情况是相关的(连同我遇到的问题):

  1. Mesos-Elasticsearch:这个包 运行s Mesos 上的 Elasticsearch。这看起来不错,但它似乎只允许以小磁盘大小扩展数据节点。此外,没有 master/client 个节点。该软件包目前在 Github 上还处于 alpha 阶段——我在其默认设置中收到了 'No route to Host' 和 MasterNotDiscoveredException 错误。有人有这方面的经验吗?
  2. Docker:我对容器不太熟悉,但是Dockerhub 有几个用于Elasticsearch 的容器。此外,Mesos 允许容器 运行 在其之上。我担心每个容器中的低磁盘 space 因为我的数据是 TB 级的。此外,数据是持久的。调整容器的磁盘大小是否可行,或者 Docker 容器是否有不同的设置?
  3. Vagrant VMs:我会想象每个ES节点都有一个VM适合分配资源。与裸机上的 运行ning 相比,这有什么实质性的好处吗?这似乎与 Mesos 不兼容。
  4. 裸机:这是当前设置。

我想知道这四个中的哪一个是您在 TB 级别的 Elasticsearch 集群的首选设置。每个选项的优缺点?

我是 Apache Mesos Elasticsearch Framework 的作者。我建议您尝试所有这些方法,然后选择您拥有最佳体验的方法。当谈到性能时,请确保您牢记性能要求,然后执行测试。还有其他事情需要考虑。我会在问题中提到。

  1. Elasticsearch Framework for mesos is the most resilient of these four options. Elasticsearch nodes are run as Mesos tasks. If any of the tasks fail (hardware or software failure) they are restarted somewhere else within the Mesos cluster. If you want to add nodes (to increase performance) or remove nodes (to reduce resource use) this is as simple as sending a one-line curl request. The data is very safe. The default configuration (can be overridden) replicates all data to all nodes. So the cluster can suffer a catastrophic event and be left with a single node, and not lose any data. You can also use any Docker volume plugin to write the data to an external volume instead, so that if the tasks die, the data are still contained on the cloud volumes. There are a few other features too, check out the website. Also checkout the videos on the Container Solutions youtube channel. We're also developing tools to help make development easier, see minimesos.

  2. 这是完全合理的,但您必须考虑如何编排您的集群。如果一个或多个容器死亡,会发生什么?你能承受那种损失吗?如果是这样,这可能是 DevOps 的最佳选择(即,您可以针对看起来像真实事物的集群进行复制和测试)。

  3. 这是我唯一反对的选项。这对开发来说没问题,但你会在生产中看到一个严重的性能问题。您可能会在另一个 VM(云)中拥有一个完整的堆栈 VM(vagrant)。开销是不必要的。 Link 1, Link 2.

  4. 这是 Elastic 官方推荐的方法,可能会为给定的硬件配置提供最高性能。但是因为这些是静态部署 a) 机器的大部分资源都会被浪费(未使用 RAM/CPU/etc.),b) 在配置新实例时会有明显的延迟(尤其是在大型组织中!)(与单个api 呼叫) 和 c) 如果一个实例失败,它将不会被替换,也不会被修复,直到有人修复它(与自动故障转移相比)。如果你对 Elasticsearch 的需求是固定的,你不需要像 DevOps 那样的灵活性并且你不介意一点停机时间,那么这可能是最简单的方法(但要确保你的 ES 配置正确!)。

因此,如果是我,那么我会考虑用于测试的 dockerized 设置、小型 POC 和可能非常小的生产任务。除此之外,我每次都会选择 Mesos Elasticsearch 选项。

我的公司或多或少也有同样的问题,但在 POC 等方面可能会更进一步。

目前,我们通过 Marathon 运行在 Mesos 0.27.1 上使用 custom Docker image 建立一个 3 节点 ES 集群。我们在容器中挂载主机卷(路径),这意味着您可以在 Mesos Slave 的主机上挂载例如 Ceph 卷。但这在某种程度上是一个相当手动的过程。在我看来最大的问题是数据安全,因为默认情况下数据只存储在主机本身,以及应用程序在 Marathon 中扩展时的行为(必须使用约束,因此只有一个节点 运行 每个 Mesos 从站等)。

我们也尝试了提到的 Mesos ES framework a few months ago, but were not satisfied with the state of the framework back then. From what I see on the docs 它在过去几个月里改进了很多,但是 Mesos 仍然缺少一些重要的功能(例如 Docker 卷驱动程序的持久卷支持)。 .不过这不是框架的问题,而是跟Mesos有关

我很快会再次尝试 Mesos 框架。我特别喜欢设置 --externalVolumeDriver 的可能性,这意味着我们现在可以使用 Docker RBD 卷驱动程序(因为我们正在使用 Ceph)...