侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 352 篇文章
  • 累计创建 135 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

ES教程20-ElasticSearch 集群搭建详细步骤

孔子说JAVA
2022-10-25 / 0 评论 / 0 点赞 / 128 阅读 / 12,064 字 / 正在检测是否收录...
广告 广告

互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器开始无法满足负载均衡及高可用的需求,集群因此应运而生。集群(或称为群集)是由多台主机构成,但对外只表现为一个整体,只提供一个访问入口(域名或IP),相当于一台大型计算机。Elasticsearch做集群时Master节点至少有三台服务器或者三个Master实例加入相同集群。

1、集群的种类

根据集群针对的目标差异,可分为三种:

  • 高可用集群 (High Availability Cluster):高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。提高应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,达到高可用(HA) 的容错效果。HA的工作方式包括双工和主从两种模式,双工即所有节点同时在线;主从则只有主节点在线,但当出现故障时从节点能自动切换为主节点。例如:“故障切换”、“双机热备” 等。

  • 负载均衡集群(Load Balance Cluster):将流量均衡的分布在不同的节点上,每个节点都可以处理一部分负载,并且可以在节点之间动态分配负载,以实现平衡。主要目的提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体性能。

  • 高性能集群(High Performance Computer Cluster):以提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力。高性能依赖于"分布式运算”、“并行计算” , 通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力。例如,“云计算”、“网格计算”等。

Elasticsearch做集群时Master节点至少有三台服务器或者三个Master实例加入相同集群,三个Master节点最多只能故障一台Master节点,如果故障两个Master节点,Elasticsearch将无法组成集群,会报错,Kibana也无法启动,因为Kibana无法获取集群中的节点信息。

2、ES集群的基础概念

2.1 集群Cluster

ElasticSearch 是一个分布式的搜索引擎,所以一般由多台物理机组成。而在这些机器上通过配置一个相同的cluster name,让其互相发现从而把自己组织成一个集群。ES集群存在三种健康状态,单节点ES也可以算是一个集群。

  • green(绿色):代表所有索引的主分片和副本均已分配且可用,集群是100%可用
  • yellow(黄色):主分片已分配且全部主分片可用,但所有的副本不全部可用,可能是缺失,也有可能是某个索引的副本未被分配,可以通过move cancel allocate 命令所属的API进行分配或移动分片到指定节点,使用这里要注意主分片和其副本绝不能在同一节点。此时系统容错性和集群高可用被弱化。
  • red(红色):所有的主分片不全部可用,这代表很有可能存在丢失数据的风险。如果只有一个单节点Elasticsearch那么属于一种yellow状态,因为没有副本。

2.2 节点Node

ElasticSearch 是以集群的方式运行的,而节点是组成ES集群的基本单位,所以每个 ElasticSearch 实例就是一个节点,每个物理机器上可以有多个节点,使用不同的端口和节点名称。

  • 节点按主要功能可以分为:主节点(Master Node)数据节点(Data Node)协调节点(Coordianting Node) 客户端节点 等。

2.2.1 主节点(或候选主节点)

主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作,维护集群状态信息。主节点负荷相对较轻,客户端请求可以直接发往任何节点,由对应节点负责分发和返回处理结果。

  • 可以设置一个节点不承担主节点角色。

一个节点启动之后, 采用 Zen Discovery 机制去寻找集群中的其他节点,并与之建立连接,集群会从候选主节点中选举出一个主节点, 并且一个集群只能选举一个主节点,在某些情况下,由于网络通信丢包等问题,一个集群可能会出现多个主节点,称为“脑裂现象”,脑裂会存在丢失数据的可能,因为主节点拥有最高权限,它决定了什么时候可以创建索引,分片如何移动等,如果存在多个主节点,就会产生冲突,容易产生数据丢失。

  • 要尽量避免这个问题,可以通过 discovery.zen.minimum_master_nodes 来设置最少可工作的候选主节点个数。建议设置为(候选主节点/2) + 1 比如三个候选主节点,该配置项为 (3/2)+1 ,来保证集群中有半数以上的候选主节点,没有足够的master候选节点, 就不会进行master节点选举,减少脑裂的可能。

主节点的参数设置:

node.master = true
node.data = false

2.2.2 数据节点

数据节点用来保存数据,负责数据的存储和CRUD等具体操作,数据节点对机器配置要求比较高,首先需要有足够的磁盘空间来存储数据,其次数据操作对系统CPU、Memory和IO的性能消耗都很大。通常随着集群的扩大,需要增加更多的数据节点来提高可用性。

  • 可以设置一个节点不承担数据节点角色。

数据节点的参数设置:

node.master = false
node.data = true

2.2.3 协调节点

协调节点负责处理请求,是一种角色,而不是真实的Elasticsearch的节点,不能通过配置项来指定哪个节点为协调节点。集群中的任何节点,都可以充当协调节点的角色。当一个节点A收到用户的查询请求后,会把查询子句分发到其它的节点,然后合并各个节点返回的查询结果,最后返回一个完整的数据集给用户。在这个过程中,节点A扮演的就是协调节点的角色。

  • 默认情况下,每个节点都可以是协调节点。

ES的一次请求非常类似于Map-Reduce操作。在ES中对应的也是两个阶段,称之为scatter-gather。客户端发出一个请求到集群的任意一个节点,这个节点就是所谓的协调节点,它会把请求转发给含有相关数据的节点(scatter阶段),这些数据节点会在本地执行请求然后把结果返回给协调节点。协调节点将这些结果汇总(reduce)成一个单一的全局结果集(gather阶段) 。

2.2.4 客户端节点

客户端节点不做候选主节点,也不做数据节点的节点,只负责请求的分发、汇总等等,增加客户端节点类型更多是为了负载均衡的处理。

node.master = false
node.data = false

2.2.5 提取节点(预处理节点)

能执行预处理管道,有自己独立的任务要执行,在索引数据之前可以先对数据做预处理操作,不负责数据存储也不负责集群相关的事务。

提取节点参数设置:

node.ingest = true

2.2.6 部落节点

在多个集群之间充当联合客户端,它是一个特殊的客户端,可以连接多个集群,在所有连接的集群上执行搜索和其他操作。部落节点从所有连接的集群中检索集群状态并将其合并成全局集群状态。掌握这一信息,就可以对所有集群中的节点执行读写操作,就好像它们是本地的。请注意部落节点需要能够连接到每个配置的集群中的每个单个节点。

2.3 分片处理机制

设置分片大小的时候,需预先做好容量规划, 如果节点数过多, 分片数过小, 那么新的节点将无法分片, 不能做到水平扩展, 并且单个分片数据量太大, 导致数据重新分配耗时过大。

假设一个集群中有两个数据节点。orders索引的分片分布情况如下所示:

PUT /orders
{
	"settings":{
		"number_of_shards":2,  //主节点
		"number_of_replicas":2  //副本节点
	}
}

11115

整个集群中存在P0和P1两个主分片, P0对应的两个R0副本分片, P1对应的是两个R1副本分片。

3、ES集群搭建

ES单机版安装:ES教程2-ES的下载与安装

3.1 ElasticSearch集群部署规划

准备三台虚拟机:

  • 10.10.20.28: Node-1 (Elastic主节点), Kibana(可视化操作平台), elasticsearch-head(可视化管理工具)

  • 10.10.20.29: Node-2 (Elastic数据节点)

  • 10.10.20.30: Node-3 (Elastic数据节点)

11116

在三台节点上,分别安装ElasticSearch服务。受限于条件,本文将3个节点都安装于同一台服务器上,以不同的端口进行区别。

3.2 下载及解压安装包

7.17.3之后的版本支持JDK1.8,所以我们这里选择elasticsearch-7.17.3版本进行安装。

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.3-linux-x86_64.tar.gz

解压ES,将elasticsearch安装在 /home/es/es/cluster 目录下

tar -zxvf elasticsearch-7.17.3-linux-x86_64.tar.gz -C /home/es/es/cluster/

3.3 修改 jvm.options 配置

默认情况下,ES启动JVM最小内存1G,最大内存1G

# 进入elasticsearch-7.17.3安装目录
cd cluster/elasticsearch-7.17.3

# 修改config目录下的jvm.options文件
vim config/jvm.options

修改内存大小:

## 修改内存大小 ,内存小我就设置成这样了
-Xms512m
-Xmx512m

image-1666606451534

3.4 配置 elasticsearch.yml 文件

修改 elasticsearch.yml 文件, vim config/elasticsearch.yml:

# 集群名称,三台集群,要配置相同的集群名称!!!
cluster.name: my-application
# 节点名称
node.name: node-1
# 是否有资格被选举为master,ES默认集群中第一台机器为主节点
node.master: true
# 是否存储数据
node.data: true
#最⼤集群节点数,为了避免脑裂,集群节点数最少为 半数+1
node.max_local_storage_nodes: 3
# 数据目录
path.data: /home/es/es/cluster/node-1/data
# log目录
path.logs: /home/es/es/cluster/node-1/logs
# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip
network.host: 0.0.0.0
# 设置对外服务http端口,默认为9200
http.port: 9201
# 内部节点之间沟通端⼝
transport.tcp.port: 9301
# 写⼊候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["localhost:9301", "localhost:9302", "localhost:9303"]
# 初始化⼀个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
# 设置集群中N个节点启动时进行数据恢复,默认为1
gateway.recover_after_nodes: 3 

# 下面的两个配置在安装elasticsearch-head、Kibana的时候会用到
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# 跨域访问允许的域名地址,(允许所有域名)以上使用正则
http.cors.allow-origin: "*"

# 关闭xpack
# xpack.security.enabled: false

3.5 复制3个数据节点目录

复制当前es构建3个数据节点。

# 分别拷贝三份文件到3个节点目录
cp -r /home/es/es/cluster/elasticsearch-7.17.3/ /home/es/es/cluster/node-1
cp -r /home/es/es/cluster/elasticsearch-7.17.3/ /home/es/es/cluster/node-2
cp -r /home/es/es/cluster/elasticsearch-7.17.3/ /home/es/es/cluster/node-3

3.6 修改数据节点的配置

node-1节点的配置不需要修改,这里我们只需修改node-2和node-3的配置。

  • node-2节点配置,和node-1不同配置为:node.name、path.data、path.logs、http.port、transport.tcp.port。
# 集群名称,三台集群,要配置相同的集群名称!!!
cluster.name: my-application
# 节点名称
node.name: node-2
# 是否有资格被选举为master,ES默认集群中第一台机器为主节点
node.master: true
# 是否存储数据
node.data: true
#最⼤集群节点数,为了避免脑裂,集群节点数最少为 半数+1
node.max_local_storage_nodes: 3
# 数据目录
path.data: /home/es/es/cluster/node-2/data
# log目录
path.logs: /home/es/es/cluster/node-2/logs
# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip
network.host: 0.0.0.0
# 设置对外服务http端口,默认为9200,可更改端口不为9200
http.port: 9202
# 内部节点之间沟通端⼝
transport.tcp.port: 9302
# 写⼊候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["localhost:9301", "localhost:9302", "localhost:9303"]
# 初始化⼀个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
# 设置集群中N个节点启动时进行数据恢复,默认为1
gateway.recover_after_nodes: 3 

# 下面的两个配置在安装elasticsearch-head、Kibana的时候会用到
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# 跨域访问允许的域名地址,(允许所有域名)以上使用正则
http.cors.allow-origin: "*"

# 关闭xpack
# xpack.security.enabled: false
  • node-3节点配置,和node-1不同配置为:node.name、path.data、path.logs、http.port、transport.tcp.port。
# 集群名称,三台集群,要配置相同的集群名称!!!
cluster.name: my-application
# 节点名称
node.name: node-3
# 是否有资格被选举为master,ES默认集群中第一台机器为主节点
node.master: true
# 是否存储数据
node.data: true
#最⼤集群节点数,为了避免脑裂,集群节点数最少为 半数+1
node.max_local_storage_nodes: 3
# 数据目录
path.data: /home/es/es/cluster/node-3/data
# log目录
path.logs: /home/es/es/cluster/node-3/logs
# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip
network.host: 0.0.0.0
# 设置对外服务http端口,默认为9200,可更改端口不为9200
http.port: 9203
# 内部节点之间沟通端⼝
transport.tcp.port: 9303
# 写⼊候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["localhost:9301", "localhost:9302", "localhost:9303"]
# 初始化⼀个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
# 设置集群中N个节点启动时进行数据恢复,默认为1
gateway.recover_after_nodes: 3

# 下面的两个配置在安装elasticsearch-head、Kibana的时候会用到
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# 跨域访问允许的域名地址,(允许所有域名)以上使用正则
http.cors.allow-origin: "*"

# 关闭xpack
# xpack.security.enabled: false

3.7 创建ES数据目录和log目录

根据之前每个节点的配置文件内配置path,创建ES存储数据和log目录。

mkdir -p /home/es/es/cluster/node-1/data
mkdir -p /home/es/es/cluster/node-1/logs
mkdir -p /home/es/es/cluster/node-2/data
mkdir -p /home/es/es/cluster/node-2/logs
mkdir -p /home/es/es/cluster/node-3/data
mkdir -p /home/es/es/cluster/node-3/logs

3.8 创建ES用户并授权

创建普通用户,由于ES需要使用非root用户来启动,所以下面创建一个普通用户es。

#创建es用户组
groupadd es

#创建新用户es ,设置用户组为es ,密码123456
useradd es -g es -p 123456

#授权,更改/elasticsearch-7.17.3文件夹所属用户及用户组为 es:es,此步骤可以略过
chown -R es:es /home/es/es/cluster/elasticsearch-7.17.3/

给节点文件授权

chown -R es:es /home/es/es/cluster/node-1
chown -R es:es /home/es/es/cluster/node-2
chown -R es:es /home/es/es/cluster/node-3

3.9 启动节点一

启动之前,设置ES的JVM占用内存参数,防止内存不足错误。我们已经在“3.3 修改 jvm.options 配置”中做了配置,如果不做配置有可能会出现下述错误。

image-1666608632204

  1. 切换到es用户
#切换用户es
su es
  1. 后台启动es
# 切换到node-1目录
cd node-1

# 后台启动
bin/elasticsearch -d
  1. 开启防火墙端口

切换到root用户,Ubuntu防火墙开放9201端口:

# 防火墙开放9201端口
ufw allow 9201

# 查看状态
ufw status
  1. 访问节点一

启动成功后访问节点一的集群状态信息不成功。

http://172.19.82.206:9201/_cat/health?v

image-1666609464620

查看日志中可以看到:master not discovered yet。是没有发现主节点。

image-1666609504699

3.10 启动节点二

按节点一的启动步骤启动节点二,启动成功访问节点一或节点二:

http://172.19.82.206:9201/_cat/health?v
http://172.19.82.206:9202/_cat/health?v

image-1666609626967

访问集群状态信息成功,查看日志可以发现已经选举出主节点。健康状况结果解释:

cluster:集群名称
status:集群状态
green:代表健康;
yellow:代表分配了所有主分片,但至少缺少一个副本,此时集群数据仍旧完整;
red: 代表部分主分片不可用,可能已经丢失数据。
node.total:代表在线的节点总数量
node.data:代表在线的数据节点的数量
shards: 存活的分片数量
pri: 存活的主分片数量 正常情况下 shards的数量是pri的两倍。
relo:迁移中的分片数量,正常情况为 0
init: 初始化中的分片数量 正常情况为 0
unassign:未分配的分片 正常情况为 0
pending_tasks:准备中的任务,任务指迁移分片等 正常情况为 0
max_task_wait_time:任务最长等待时间
active_shards_percent:正常分片百分比 正常情况为 100%

3.11 启动节点三

按节点一的启动步骤启动节点三,启动成功访问节点一或节点二或节点三:

http://172.19.82.206:9201/_cat/health?v
http://172.19.82.206:9202/_cat/health?v
http://172.19.82.206:9203/_cat/health?v

image-1666610715356

访问集群状态信息成功。可以看到节点已经变为3个,至此,ES集群已经搭建成功。

3.12 关闭es进程

如果想要关闭es进程,执行下述命令:

# 获取es进程号
ps -ef | grep elastic

# 杀掉进程号
kill -9 进程号

4、使用Kibana配置和管理集群

4.1 集群配置

因为之前我们在单机演示的时候也使用到了Kibana,我们先复制出来一个Kibana,然后修改它的集群配置。

# 切换到root用户
su root

# 定位到Kibana目录
cd /home/es/kibana

# 复制一份Kibana
cp -r kibana-7.17.3-linux-x86_64 kibana-7.17.3-linux-x86_64-cluster

修改kibana配置

vim kibana-7.17.3-linux-x86_64-cluster/config/kibana.yml

在kibana.yml中加入下面的配置,因为我单机版也启动了一套Kibana,所以集群的Kibana配置端口为5602。

server.port: 5602

server.host: "0.0.0.0"

elasticsearch.hosts: ["http://172.19.82.206:9201","http://172.19.82.206:9202","http://172.19.82.206:9203"] 

启动Kibana

# 切换到bin目录
cd ../bin

# 前台方式启动kibana,非root用户
./kibana

# 前台方式启动kibana,root用户
./kibana --allow-root

# 后台方式启动kibanaa,非root用户
nohup ./kibana &

# 后台方式启动kibanaa,root用户
nohup ./kibana --allow-root &

Ubuntu开通防火墙端口访问

ufw allow 5602

4.2 管理集群

打开Kibana,点开 Stack Monitoring 集群监控

11117

11118

点击【Nodes】查看节点详细信息

11119

11120

在上图可以看到,第一个红框处显示【Green】,绿色,表示集群处理健康状态。第二个红框是我们集群的三个节点,注意,itcast-3旁边是星星,表示是主节点

5、ES搭建过程中的问题

问题1:如果你启动ES时使用的是root账户,会报下面的错误。

image-1666611524524

这是因为es不允许使用root启动,所以需要创建一个非root用户,以非root用户来启动es。创建elasticsearch 用户,或者使用其他非root用户,注意文件权限。如果你是非root用户则可以跳过这一步。

#创建elasticsearch用户组
groupadd elasticsearch

#创建新用户elasticsearch ,设置用户组为elasticsearch ,密码123456
useradd elasticsearch -g elasticsearch -p 123456

#授权,更改/elasticsearch-7.17.3文件夹所属用户及用户组为elasticsearch:elasticsearch
chown -R elasticsearch:elasticsearch /usr/local/elasticsearch-7.17.3/

#切换用户elasticsearch 
su elasticsearch 

问题2:如果你之前安装过ES,并且搭建集群的ES文件是从之前的目录复制过来的,那么请务必将data目录清空。

问题3:说明操作当前文件权限不够,给文件授权就好了。

image-1666611637544

chown -R elasticsearch:elasticsearch /usr/local/node-1
chown -R elasticsearch:elasticsearch /usr/local/node-2
chown -R elasticsearch:elasticsearch /usr/local/node-3

问题4:解决内存权限太小错误

[2022-10-18T14:58:01,836][ERROR][o.e.b.Bootstrap          ] [node-1] node validation exception
[1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2022-05-08T14:58:01,840][INFO ][o.e.n.Node               ] [node-1] stopping ...
[2022-05-08T14:58:01,870][INFO ][o.e.n.Node               ] [node-1] stopped
[2022-05-08T14:58:01,870][INFO ][o.e.n.Node               ] [node-1] closing ...
[2022-05-08T14:58:01,920][INFO ][o.e.n.Node               ] [node-1] closed

因为elasticsearch用户拥有的内存权限太小,至少需要262144。解决方案,切换到root用户下,在/etc/sysctl.conf文件最后添加一行:

vi /etc/sysctl.conf

添加的内容:

vm.max_map_count=262144

执行命令生效:

/sbin/sysctl -p 

问题5

ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
bootstrap check failure [1] of [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
ERROR: Elasticsearch did not exit normally - check the logs at /usr/local/node-1/logs/my-application.log

解决方案:

sudo vi /etc/security/limits.conf
#添加以下内容,注意:elasticsearch是当前用户名,不一定和我一样,
elasticsearch hard nofile 65536
elasticsearch soft nofile 65536

说明:elasticsearch表示运行的用户,如果你的当用户是es,那么前缀就是es,不一定和我一样,hard与soft表示限制的类型,nofile表示max number of open file descriptors,65536表示设置的大小。改完需要重新登录才能生效,或者切换用户

su root
Password: 
[root@localhost ~]# su sandwich
[root@localhost ~]# ulimit -Hn
65536
[root@localhost ~]# ulimit -Sn
65536
0

评论区