文章目录

  • 集群节点
  • master
  • data 数据节点
  • 仅协调节点
  • 符合远程条件的节点
  • 集群配置
  • path.data
  • path.logs
  • cluster.name 集群名称
  • node.name 节点名称
  • 相关网络配置
  • network.host
  • http.port
  • transport.port
  • 集群发现配置
  • discovery.seed_hosts
  • 引导集群配置
  • cluster.initial_master_nodes
  • 集群搭建
  • 安装第一个节点 myNode1
  • 集群基础配置
  • 将新节点加入集群
  • 查看集群的状态
  • 集群启动常见错误
  • 文件描述符和虚拟内存过小
  • 修改 /etc/security/limits.conf 配置(请使用 root 或 有 sudo 权限的账号修改)
  • 修改 /etc/sysctl.conf 配置(请使用 root 或 有 sudo 权限的账号修改)


集群节点

我通常认定一个单独运行的 es 服务为一个 es 节点。

es 的节点通过 elasticsearch.yml 的 node.roles 参数来定义,如果不设置 node.roles,则默认如下的角色

  • master 具有主节点资格
  • data 数据节点
  • data_content 内容数据节点
  • data_hot 热点数据节点
  • data_warm 温数据节点
  • data_cold 冷数据节点
  • data_frozen 冻结数据节点
  • ingest 摄取节点
  • ml 机器学习节点
  • remote_cluster_client 符合远程集群的节点
  • transform 变换节点

master

master 表示具有主节点资格:拥有该角色,表示当前节点有资格被选举为主节点。一个高可用的集群中,应至少包含三个符合主节点资格的节点。

主节点负责轻量级集群范围内的操作,例如创建或删除索引、跟踪哪些节点是集群的一部分以及决定将哪些分片分配给哪些节点。拥有稳定的主节点对于集群健康非常重要。

主节点必须有一个path.data目录,其内容在重新启动后仍然存在,就像数据节点一样,因为这是存储集群元数据的地方。集群元数据描述了如何读取存储在数据节点上的数据,因此如果丢失则存储在数据节点上的数据将无法读取。

  • 专用主节点

对于整个集群来说,主节点非常重要,主节点负责的集群事物也很多,意味着主节点要消耗更多的资源,为避免主节点因其他事物而过载,我们可以设置主节点为专用主节点。(注:此设置一般在大型集群中使用,其实我们一般的项目中通常是不用设置专用主节点的)。专用主节点,设置:

node.roles: [ master ]
  • 仅投票主节点

仅投票的主节点是参与 主节点选举但不会充当集群选举主节点的节点。仅投票主节点设置,需要同时设置 master 和 voting_only 。注:仅投票节点也是符合主节点资格的节点,只是不会成为主节点。

只要有一半以上的投票节点可用,群集仍可以正常工作。这意味着如果有三个或四个主资格节点,群集可以容忍其中一个不可用。如果有两个或更少的主资格节点,则它们必须都保持可用。所以我们的节点至少需要 3 个。

群集中的主资格节点通常应该是奇数。如果是偶数,Elasticsearch会将其中一个节点排除在投票配置之外,以确保其大小为奇数。这种省略并不会降低集群的容错能力。

node.roles: [ data, master, voting_only ]

data 数据节点

数据节点保存数据并执行数据相关操作,例如 CRUD、搜索和聚合等这些 I/O、内存和 CPU 密集型操作。具有该角色的节点可以担任任何专门的数据节点角色。

ES 可以单节点集群、两节点集群、三节点甚至更多节点的集群,单节点集群和两节点集群都有其局限性,我们就不做过多的讨论了。

可以使用专门的数据角色将数据节点分配到特定层:data_content、data_hot、data_warm、 data_cold或data_frozen。一个节点可以属于多个层,具有这些角色的节点不能具有 data 角色。

仅协调节点

仅协调节点就像负载均衡器一样,负责路由请求、处理搜索和分发批量索引。

符合远程条件的节点

符合远程条件的节点充当跨集群客户端并连接到 远程集群。连接后,您可以使用跨集群搜索来搜索远程集群。您还可以使用跨集群复制在集群之间同步数据。

node.roles: [ remote_cluster_client ]

集群配置

关于 ES 应用的安装,请移步本专栏的 Elasticsearch 简介与安装 一文。

ES 大部分都配置都在 $ES_HOME/config/elasticsearch.yml 文件中配置。

path.data

每个数据和主节点都需要访问存储分片、索引和集群元数据的数据目录。默认为 $ES_HOME/data 但可以在配置文件中配置 elasticsearch.yml 绝对路径或相对路径。

path.logs

ES 的日志路径。默认为 $ES_HOME/logs。建议data 和 logs 目录和 ES 主目录分开。

cluster.name 集群名称

cluster.name一个节点只有在与集群中的所有其他节点共享集群时才能加入集群。默认名称为 elasticsearch。为避免任意的 ES 服务加入集群,我们需要自定义设置集群的名称。同一个集群应该配置同样的集群名称

node.name 节点名称

Elasticsearch 启动时节点名称默认为服务器的主机名。

相关网络配置

network.host

设置此节点的 HTTP 和传输流量地址。该节点将绑定到该地址,并将其用作其发布地址。默认情况下,Elasticsearch 仅绑定到环回地址,例如127.0.0.1和 [::1]。要配置集群,则此地址需要修改为网络地址。接受 IP 地址、主机名或特殊值。
特殊值包括如下几个:

  • local
    系统上的任何环回地址,例如127.0.0.1。
  • site
    系统上的任何站点本地地址,例如192.168.0.1。
  • global
    系统上的任何全局范围的地址,例如8.8.8.8。
  • _[networkInterface]_
    使用名为 的网络接口的地址[networkInterface]。en0例如,如果您希望使用名为then set的接口的地址network.host: en0
  • 0.0.0.0
    所有可用网络接口的地址。

network.host 配置是 http.host、transport.host 等的默认配置。

http.port

HTTP 客户端通信绑定的端口。接受单个值或范围。如果指定了范围,则节点将绑定到该范围中的第一个可用端口。默认为9200-9300。

transport.port

节点之间的通信而绑定的端口。接受单个值或范围。如果指定了范围,则节点将绑定到该范围中的第一个可用端口。将此设置设置为每个符合主节点资格的节点上的单个端口,而不是一个范围。默认为9300-9400。

更多的网络相关设置,可以查看官网 网络设置 比如跨域设置、请求正文最大大小设置等

集群发现配置

当 ES 集群任务主节点发生故障 或 启动当前节点时,ES 会进行一个集群的发现过程。

  • 如果是主节点发生故障,则持续到选举出新的主节点为止
  • 如果是新启动 ES 节点,则持续到当前节点找到主节点为止

discovery.seed_hosts

此设置提供集群中其他符合主节点资格且处于活动状态的节点列表。每个地址可以是 IP 地址,也可以是通过 DNS 解析为一个或多个 IP 地址的主机名。

discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11 
   - seeds.mydomain.com 
   - [0:0:0:0:0:ffff:c0a8:10c]:9301

ES 集群时会依次尝试和探测该列表地址并验证其是否具有主节点资格。如果此地址不具备主节点资格,则继续向下执行发现过程。直到发现主节点或者发现足够多的具有主节点资格的节点来进行并完成选举。

示例最后为 IPv6 的地址,IPv6地址必须括在方括号中

如果不配置端口,会使用 transport.port 配置覆盖

更多的服务发现的配置请查看官网 服务发现设置

引导集群配置

cluster.initial_master_nodes

配置符合主节点资格的节点名称 node.name 列表。默认为空。第一次启动 Elasticsearch 集群需要在集群中的一个或多个符合主资格的节点上显式定义一组初始符合主资格的节点,这称为集群引导。仅在集群第一次启动时才需要这样做。如果是加入正在运行的集群的新启动节点,从集群选出的主节点获取此信息。

集群搭建

注:这里我们的集群为多台不同的服务器集群(192.168.1.10、192.168.1.11、192.168.1.12),本地多节点集群我们这里就略过不说了。

为什么是3台?请注意 ES 集群至少需要 3 个节点。

注意安装版本,我们文章的版本为 elasticsearch-8.6.2-linux-x86_64.tar.gz (8.6.2)

安装第一个节点 myNode1

请参考 Elasticsearch 简介与安装 一文

请在首次启动之后,保存账号密码登信息,再进行下面的步骤。如需修改密码请参考 Elasticsearch 用户管理 一文。

建议在此节点就添加好用户,比我我们示例中的 myuser 用户

集群基础配置

在 elasticsearch.yml 配置中添加如下配置:(注意是添加,不要修改启动时自动生成的配置)

# 数据目录(最好在 ES 的安装目录之外)
path.data: /DATA/es/data
# 日志目录(最好在 ES 的安装目录之外)
path.logs: /DATA/es/logs
# 集群名称
cluster.name: myTestEs
# 节点名称
node.name: myNode1

# 当前节点绑定到的ip地址(之后的 http.host、transport.host等都默认使用该配置)
# 一般为当前节点所在服务器的ip
network.host: 192.168.1.10

# 节点访问端口
http.port: 9200

# 集群间通信端口
transport.port: 9300

# 此设置提供集群中其他符合主节点资格且处于活动状态的节点列表。每个地址可以是 IP 地址,也可以是通过 DNS 解析为一个或多个 IP 地址的主机名
discovery.seed_hosts:
   - 172.2.1.168.1.10:9300
   - 172.2.1.168.1.11:9300
   - 172.2.1.168.1.12:9300

配置添加之后重启即可,这样我们就启动了集群的一个节点。

将新节点加入集群

  1. 解压安装包,解压后不要做任何修改和配置(请一定保持是全新的节点应用,否则会有已经使用等的错误出现)
  2. 在现有集群的任意节点上执行如下命令
./bin/elasticsearch-create-enrollment-token -s node

执行后会生成token字符串

  1. 在新节点的安装目录中执行如下命令(注意拷贝token字符串到命令中)
./bin/elasticsearch --enrollment-token <token>

执行后 Elasticsearch 会在 config/certs 目录下自动生成证书和密钥,并自动添加 SSL 相关的配置,并启动,但启动是会报错的,因为并没有进行集群相关的配置。

  1. 添加和修改 elasticsearch.yml 配置

按照我们上面的 <集群基础配置> 修改当前节点的集群配置即可,这里我们就不详细说明了。

  1. 修改成功之后重新启动节点应用即可(此时请使用后台运行)
./bin/elasticsearch -d -p pid

新节点不用再次添加用户,使用集群已创建的用户即可访问。

查看集群的状态

注意:新节点启动之后,还会有集群间的分配平衡过程,此过程会消耗一定的时间,所以在一定的时间范围内,我们可能得到yellow 的状态,这是正常现象

GET /_cluster/health

{
    "cluster_name": "myTestEs", // 集群名称
    "status": "green", // 集群状态
    "timed_out": false, // 是否超时
    "number_of_nodes": 2, // 节点数
    "number_of_data_nodes": 2,// 数据节点数
    "active_primary_shards": 9,// 活动的主分片数
    "active_shards": 18,// 活动的总分片数
    "relocating_shards": 0,// 正在重新定位的分片数
    "initializing_shards": 0, // 正在初始化的分片数
    "unassigned_shards": 0, // 未分配的分片数
    "delayed_unassigned_shards": 0, // 其分配被超时设置延迟的分片数
    "number_of_pending_tasks": 0, // 尚未执行的集群级更改数
    "number_of_in_flight_fetch": 0, // 未完成的提取数
    "task_max_waiting_in_queue_millis": 0,// 自最早启动的任务等待执行以来的时间(以毫秒为单位)
    "active_shards_percent_as_number": 100.0 // 集群中活动分片的比率,以百分比表示
}

按照同样的方式再添加其他节点即可。

集群启动常见错误

文件描述符和虚拟内存过小

bootstrap check failure [1] of [2]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
bootstrap check failure [2] of [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

修改 /etc/security/limits.conf 配置(请使用 root 或 有 sudo 权限的账号修改)

查看limits.conf,文件中有配置说明,此处不做详解。新增配置如下:

* soft nofile 65536
* hard nofile 65536
* hard stack  65536
* soft stack  65536
* soft nproc  65536
* hard nproc  65536

此方式为永久修改,修改后需要重启系统。也可以使用如下命令临时修改,在重启后会失效

ulimit -n 65536

修改 /etc/sysctl.conf 配置(请使用 root 或 有 sudo 权限的账号修改)

添加如下配置:

vm.max_map_count=262144

此方式为永久修改,修改后需要重启系统。也可以使用如下命令临时修改,在重启后会失效

sysctl -w vm.max_map_count=262144