引导一个集群

首次启动 Elasticsearch 集群时,需要在集群中的一个或多个 符合主节点条件的节点上 显式定义符合主节点条件的初始节点集。 这就是所谓的集群引导 (cluster bootstrapping)。 这仅在集群第一次启动时需要:已经加入集群的节点将此信息存储在它们的数据文件夹中,以便在集群完全重新启动时使用,并且加入正在运行的集群的新启动的节点从集群选举出的主节点获得此信息。

符合主节点条件的初始节点集在 cluster.initial_master_nodes 设置 中定义。 对于每个符合主节点条件的节点,这应设置为包含以下项目之一的列表:

  • 节点的 节点名称 (node.name)
  • 节点的主机名称(如果 node.name 未设置),因为node.name 默认值为节点的主机名称。 根据你的系统配置,必须使用完全限定的主机名或裸主机名。
  • 节点IP地址的发布地址(如果不能使用节点的 node.name)。 这通常是 network.host 解析的 IP 地址,但可以被覆盖
  • 节点发布地址的 IP 地址和端口,格式为 IP:PORT (如果无法使用节点的 node.name,并且有多个节点共享一个 IP 地址)。

当启动符合主节点条件的节点时,可以在命令行或 elasticsearch.yml 文件中提供此设置。 集群形成后,不再需要此设置。 不应该为不符合主节点条件的节点、符合主节点条件的节点加入现有集群 或 集群重新启动 设置该选项。

在集群中的单个符合主节点条件的节点上设置 cluster.initial_master_nodes 在技术上是足够的,并且只需在设置值中提及该单个节点,但是这在集群完全形成之前不提供容错。 因此,最好使用至少三个符合主节点条件的节点进行引导,每个节点的cluster.initial_master_nodes 设置包含所有的三个节点。

必须在设置 cluster.initial_master_nodes 的每个节点上将它设置为相同的节点列表,以确保在引导过程中只形成一个集群,从而避免数据丢失的风险。

对于具有3个符合主节点条件的节点(node names 分别为 master-amaster-bmaster-c)的集群,配置如下所示:

cluster.initial_master_nodes:
  - master-a
  - master-b
  - master-c

像所有的节点设置一样,也可以在命令行上指定用于启动 Elasticsearch 的初始主节点集:

$ bin/elasticsearch -Ecluster.initial_master_nodes=master-a,master-b,master-c

cluster.initial_master_nodes列表中使用的节点名称必须与节点的 node.name 属性完全匹配。 默认情况下,节点名被设置为机器的主机名,根据你的系统配置,主机名可能是也可能不是完全限定的。 如果每个节点名称都是完全限定的域名,如 master-a.example.com ,则你也必须在 cluster.initial_master_nodes 列表中使用完全限定的域名; 相反,如果节点名称是裸主机名(没有 .example.com 后缀),则也必须在 cluster.initial_master_nodes 列表中使用裸主机名。 如果混合使用了完全限定的主机名和裸主机名,或者 node.namecluster.initial_master_nodes 之间存在其他不匹配的问题,则集群将无法成功形成,你将会看到如下所示的日志消息:

[master-a.example.com] master not discovered yet, this node has
not previously joined a bootstrapped (v7+) cluster, and this
node must discover master-eligible nodes [master-a, master-b] to
bootstrap a cluster: have discovered [{master-b.example.com}{...

该消息显示了节点名 master-a.example.commaster-b.example.com 以及 cluster.initial_master_nodes 记录 master-amaster-b,从该消息可以清楚地看出,它们并不完全匹配。

选择一个集群名称

cluster.name 设置使你能够创建多个彼此独立的集群。 节点在第一次相互连接时,会验证它们是否同意自己的集群名称,而 Elasticsearch 只会将所有具有相同集群名称的节点组成一个集群。 集群名称的默认值是 elasticsearch,建议修改为与集群的逻辑名称一致。

开发模式下的自动引导 (Auto-bootstrapping in development mode)

如果集群使用完全默认的配置运行,那么它将在启动后的短时间内 根据可能在同一主机上运行的节点自动引导出一个集群。 这意味着默认情况下,可以在一台机器上启动几个节点,并让它们自动形成一个集群,这对开发环境和实验非常有用。 然而,由于节点可能并不总是足够快地成功发现彼此,因此不能依赖这种自动引导,也不能在生产部署中使用。

如果配置了以下任何设置,则自动引导将不会发生,必须按照 集群引导章节 中所描述的去配置 cluster.initial_master_nodes

  • discovery.seed_providers
  • discovery.seed_hosts
  • cluster.initial_master_nodes

如果你在没有配置这些设置的情况下启动一个 Elasticsearch 节点,那么它将在开发模式下启动并自动引导自己进入一个新的集群。 如果你在不同的主机上启动一些 Elasticsearch 节点,那么默认情况下,它们不会发现彼此,并且会在每个主机上形成不同的集群。 Elasticsearch 不会在单独的集群形成后将它们合并在一起,即使你随后尝试将所有节点配置到一个集群中。 这是因为没有办法在没有数据丢失风险的情况下将这些独立的集群合并在一起。 通过检查每个节点上的 GET / 报告的集群 UUID,你就能知道它们已经形成了单独的集群。 如果你打算组成一个集群,那么你应该重新开始:

  • 关闭所有节点。
  • 通过删除 数据(data)文件夹 的内容来彻底清除每个节点。
  • 按照上面描述的配置 cluster.initial_master_nodes
  • 重新启动所有节点,并验证它们是否已形成单个集群。