【问题标题】:How to set up ES cluster?ES集群如何搭建?
【发布时间】:2013-05-25 03:20:23
【问题描述】:

假设我有 5 台机器要在其上运行 elasticsearch 集群,并且它们都连接到共享驱动器。我将弹性搜索的一个副本放在该共享驱动器上,这样三个人都可以看到它。我是否只是在我所有机器上的共享驱动器上启动弹性搜索,集群会自动发挥它的魔力?或者我是否必须配置特定设置才能让 elasticsearch 意识到它在 5 台机器上运行?如果有,相关设置是什么?我应该担心配置副本还是自动处理?

【问题讨论】:

  • 您不会将共享文件夹用于索引,是吗?

标签: elasticsearch


【解决方案1】:

超级简单。

您需要每台机器拥有自己的 ElasticSearch 副本(只需复制您现在拥有的那个)——原因是每台机器/节点都将保留自己的文件,这些文件在集群中分片。

您真正需要做的唯一一件事就是编辑配置文件以包含集群的名称。

如果所有机器具有相同的集群名称,elasticsearch 将自动完成剩下的工作(只要机器都在同一个网络上)

阅读此处以帮助您入门: https://www.elastic.co/guide/en/elasticsearch/guide/current/deploy.html

当您创建索引(数据的去向)时,您可以定义您想要多少副本(它们将分布在集群中)

【讨论】:

  • 另外——安装头插件。它使监视索引的状态变得更加容易。 mobz.github.io/elasticsearch-head
  • 为什么需要在每台机器上都有单独的副本?根据我在单节点机器上看到的情况,您可以更改节点名称以使多个实例使用相同的副本运行:concept47.com/austin_web_developer_blog/elasticsearch/… 当您拥有具有单个共享驱动器的单独机器时,这是否不适用?我认为如果我为单个副本设置一个集群名称,我可以让每台机器运行该单个副本,所以集群名称理论上是相同的还是我不正确?
  • 每台机器(或节点)都需要自己的文件空间来编写 lucene 索引文件。如果您更改配置文件(检查链接)以指向本地节点上的另一个目录,那么它可能会起作用。
  • 我的印象是每个集群的不同节点名称,因为弹性搜索的单个实例会自动判断另一个实例已经在运行,弹性搜索会根据节点创建单独的目录。 (如果这不是正确的假设,请纠正我)
  • 为什么不试试看 - 你总是可以清理它?回来报告-我很感兴趣。过去我在每台机器上都运行了一个安装,因为这看起来更加冗余和安全。
【解决方案2】:

它通常是自动处理的。

如果自动发现不起作用。通过启用单播发现编辑弹性搜索配置文件

节点 1:

    cluster.name: mycluster
    node.name: "node1"
    node.master: true
    node.data: true
    discovery.zen.ping.multicast.enabled: false
    discovery.zen.ping.unicast.hosts: ["node1.example.com"]

节点 2:

    cluster.name: mycluster
    node.name: "node2"
    node.master: false
    node.data: true
    discovery.zen.ping.multicast.enabled: false
    discovery.zen.ping.unicast.hosts: ["node1.example.com"]

节点 3、4、5 以此类推。将节点 1 设为主节点,其余仅作为数据节点。

编辑:请注意,根据 ES 规则,如果您有 N 节点,那么按照惯例,N/2+1 节点应该是故障转移机制的主节点它们可能是也可能不是数据不过,节点。

此外,如果自动发现不起作用,最可能的原因是网络不允许(因此被禁用)。如果在多个服务器上发生过多的自动发现 ping,则管理这些 ping 的资源将阻止其他服务正常运行。

例如,假设一个 10,000 个节点的集群和所有 10,000 个节点执行自动 ping。

【讨论】:

  • 为了澄清,所有“unicast.hosts”都应该是主服务器的IP/FQDN吗?似乎是你的例子所表明的。
  • 根据 1.7.x 中的 elasticsearch.yml cmets,如果您设置“node.master: false”,则该节点将永远不会成为主节点......
  • @Jonesome - 我的示例说明了一个主节点和 >1 个数据节点。如果您不希望某个节点充当主节点,则将属性设置为 false 应该没问题。但是,如果您希望您的节点成为主节点,则永远不应触及此属性。
  • @KannarKK 但是对于ES,如果你在除1之外的每个节点上都设置“node.master: false”,如果master宕机了,是不是整个集群都宕机了?这不会破坏集群的主要目的吗?为什么不将“node.master”完全排除在 yml 之外(默认为 true),这样如果主节点死了,另一个节点可以成为主节点?
  • @Jonesome - 我已经在答案中包含了这个信息:......请注意,根据 ES 规则,如果你有 N 个节点,那么按照惯例,N/2+1 个节点应该是用于故障转移机制的主节点 不过,它们可能是也可能不是数据节点。因此,如果您有 >1 个主人,请将他们的所有信息添加到主机列表中
【解决方案3】:

我尝试了@KannarKK 在 ES 2.0.2 上建议的步骤,但是我无法启动并运行集群。显然,我想出了一些东西,因为我在 Master 上设置了 tcp 端口号,在 Slave 配置上 discovery.zen.ping.unicast.hosts 需要 Master 的端口号以及 IP 地址( tcp 端口号 )进行发现。因此,当我尝试以下配置时,它对我有用。

节点 1

cluster.name: mycluster
node.name: "node1"
node.master: true
node.data: true
http.port : 9200
tcp.port : 9300
discovery.zen.ping.multicast.enabled: false
# I think unicast.host on master is redundant.
discovery.zen.ping.unicast.hosts: ["node1.example.com"]

节点 2

cluster.name: mycluster
node.name: "node2"
node.master: false
node.data: true
http.port : 9201
tcp.port : 9301
discovery.zen.ping.multicast.enabled: false
# The port number of Node 1
discovery.zen.ping.unicast.hosts: ["node1.example.com:9300"]

【讨论】:

    【解决方案4】:

    Elastic Search 7 更改了集群初始化的配置。 需要注意的重要一点是 ES 实例使用传输层 (TCP) 进行内部通信,而不是通常用于对索引执行操作的 HTTP 协议。以下是 2 台机器集群的示例配置。

    cluster.name: cluster-new
    node.name: node-1
    node.master: true
    node.data: true
    bootstrap.memory_lock: true
    network.host: 0.0.0.0
    http.port: 9200
    transport.host: 102.123.322.211
    transport.tcp.port: 9300
    discovery.seed_hosts: [“102.123.322.211:9300”,"102.123.322.212:9300”]
    cluster.initial_master_nodes: 
            - "node-1"
            - "node-2”
    

    机器 2 配置:-

    cluster.name: cluster-new
    node.name: node-2
    node.master: true
    node.data: true
    bootstrap.memory_lock: true
    network.host: 0.0.0.0
    http.port: 9200
    transport.host: 102.123.322.212
    transport.tcp.port: 9300
    discovery.seed_hosts: [“102.123.322.211:9300”,"102.123.322.212:9300”]
    cluster.initial_master_nodes: 
            - "node-1"
            - "node-2”
    

    cluster.name:这对于将成为集群一部分的所有机器都是相同的。

    node.name : ES 实例的标识符。如果未给出,则默认为机器名称。

    node.master: 指定这个 ES 实例是否会成为 master

    node.data:指定此ES实例是否将成为数据节点(保存数据)

    bootsrap.memory_lock: 禁用交换。您可以在不设置此标志的情况下启动集群。但建议设置锁定。更多信息:https://www.elastic.co/guide/en/elasticsearch/reference/master/setup-configuration-memory.html

    network.host: 如果您想通过网络公开 ES 实例,则为 0.0.0.0。 0.0.0.0 不同于 127.0.0.1(又名 localhost 或环回地址)。 这意味着机器上的所有 IPv4 地址。如果机器有多个 IP 地址,并且服务器在 0.0.0.0 上进行侦听,则客户端可以从任何 IPv4 地址访问机器。

    http.port: ES 实例监听 HTTP 请求的端口

    transport.host:主机的 IPv4 地址(这将用于与运行在不同机器上的其他 ES 实例通信)。更多信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-transport.html

    transport.tcp.port: 9300(机器接受tcp连接的端口)

    discovery.seed_hosts:这在最近的版本中有所改变。 使用 TCP 端口(重要) 初始化将成为该集群一部分的 ES 实例的所有 IPv4 地址。这在属于该集群的所有 ES 实例中都是相同的。

    cluster.initial_master_nodes: 将参与主节点选举的 ES 机器的节点名称(node.name)。(基于 Quorum 的决策:-https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-quorums.html#modules-discovery-quorums

    【讨论】:

      猜你喜欢
      • 2016-08-29
      • 2015-01-17
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2021-06-12
      相关资源
      最近更新 更多