假设我有 5 台机器要在其上运行弹性搜索集群,并且它们都连接到共享驱动器。我将弹性搜索的一个副本放在该共享驱动器上,这样三个人都可以看到它。我是否只是在我所有机器上的共享驱动器上启动弹性搜索,集群会自动发挥它的魔力?或者我是否必须配置特定设置才能让 elasticsearch 意识到它在 5 台机器上运行?如果有,相关设置是什么?我应该担心配置副本还是自动处理?
4 回答
它超级容易。
您将需要每台机器拥有自己的 ElasticSearch 副本(只需复制您现在拥有的副本)——原因是每台机器/节点都将保留自己的文件,这些文件在集群中分片。
您真正需要做的唯一一件事是编辑配置文件以包含集群的名称。
如果所有机器具有相同的集群名称,elasticsearch 将自动完成其余的工作(只要机器都在同一个网络上)
阅读此处以帮助您入门: https ://www.elastic.co/guide/en/elasticsearch/guide/current/deploy.html
当你创建索引(数据去哪里)时,你定义了你想要多少副本(它们将分布在集群周围)
它通常是自动处理的。
如果自动发现不起作用。通过启用单播发现编辑弹性搜索配置文件
节点 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。
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 实例是否将成为主实例
node.data : 指定此 ES 实例是否将成为数据节点(保存数据)
bootsrap.memory_lock:禁用交换。您可以在不设置此标志的情况下启动集群。但建议设置锁定。更多信息:https ://www.elastic.co/guide/en/elasticsearch/reference/master/setup-configuration-memory.html
network.host: 0.0.0.0 如果你想通过网络公开 ES 实例。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:这在最近的版本中有所改变。使用将成为该集群一部分的 ES 实例的TCP 端口(重要)初始化所有 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)
我尝试了@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"]