01 Elasticsearch 集群基本概念
集群的基本概念是存在多台机器,这些机器在同一个组中,这样一个组或多个组称为一个集群。
1.1 Elasticsearch 的特点
可以横向扩展至数百上千的服务器节点,实现同时处理PB级数据专门为分布式场景设计,并且在设计时尽可能地屏蔽了分布式的复杂性1.2 Elasticsearch 集群的概念
节点:一个运行中的Elasticsearch实例称为一个节点
集群:集群由一个或者多个拥有相同cluster.name
配置的节点组成,他们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分配所有的数据。
主节点:主节点在节点中通过选举机制产生,当一个节点被选举成为主节点,它将负责管理集群范围内的所有变更,例如增加和删除索引,增加和删除节点等操作。而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。
用户请求处理:当用户请求数据时,用户可以将请求发送给集群中包括主节点在内的所有节点,这些节点都知道任意文档数据在集群中所处的位置。所以,无论用户将请求发送给哪一个节点,这些节点都能够将请求直接转发到存储所请文档数据的节点,并收集被请求的文档数据返回给用户。
02 Elasticsearch 集群安装部署
2.1 集群配置
Elasticsearch集群的配置在ES的配置文件中完成,主要配置三个字段分别是cluster.name, discovery.seed_hosts, cluster.initial_master
。在进入生产之前进行Discovery和集群形式设置十分关键,其目的在于方便集群中的节点可以相互发现并选举一个主节点。当需要与其他主机上的节点形成集群时,使用discovery.seed_hosts
设置。该设置提供集群中其他节点的列表,这些节点符合主节点条件并且可能处于活动状态且可联系以播种发现过程。
cluster.name
:集群名称设置是节点加入集群的前提,一个节点只有cluster.name
在与集群中的所有其他节点共享时才能加入集群。discovery.seed_hosts
:提供集群中符合主节点的地址列表。也可以是包含以逗号分隔的地址的单个字符串。每个地址的格式为host:port
或host
。如果一个主机名通过 DNS 解析为多个地址,Elasticsearch 会使用所有这些地址。此设置以前称为discovery.zen.ping.unicast.hosts
, 它的旧名称已被弃用。discovery.seed_providers
:指定使用哪种类型的种子主机提供程序来获取用于启动发现过程的种子节点的地址。默认情况下,是基于设置的种子主机提供程序从discovery.seed_hosts
设置中获取种子节点地址。此设置以前称为discovery.zen.hosts_provider
,它的旧名称已被弃用。
cluster.name: LogAnalysisSys # 集群名称
node.name: master # 节点名称,节点名称不可重复
path.data: /data/elasticsearch # 数据目录
path.logs: /var/log/elasticsearch # 日志目录
bootstrap.memory_lock: true # 内存锁定
network.host: 172.16.155.131,127.0.0.1 # 绑定监听地址
http.port: 9200 # 默认端口号
discovery.seed_hosts: ["172.16.255.131", "172.16.255.132", "172.16.255.133"] # 集群发现节点配置
cluster.initial_master_nodes: ["master"] # 默认主节点配置
http.cors.enabled: true # 外网访问配置
http.cors.allow-origin: "*"
2.2 新增节点上安装部署ES
2.2.1 安装ES
参考环境部署中的第四部分,在其他节点上安装部署ES,在虚拟机上安装部署ES
sudo dpkg -i elasticsearch-7.13.2-amd64.deb # 安装deb包
2.2.2 修改配置文件
在配置完成的ES节点上找到其配置文件,然后使用scp
命令将配置文件拷贝到新节点,直接拷贝可能存在权限问题,目的节点使用root账户登录可以解决这一问题。
sudo scp elasticsearch.yml wang@172.16.255.132:/etc/elasticsearch
通过scp
拷贝过来的配置文件可能存在用户权限问题导致启动失败,通过如下命令修改配置文件的权限
chown -R root:elasticsearch elasticsearch.yml
配置内容如下所示
cluster.name: LogAnalysisSys
node.name: node-1
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 172.16.255.132,127.0.0.1
http.port: 9200
discovery.seed_hosts: ["172.16.255.131", "172.16.255.132"]
http.cors.enabled: true
http.cors.allow-origin: "*"
常见添加节点部署错误:内存错误
由于新增节点的物理环境不一样,可能出现内存不够的问题,使用jouralctl -xe
查看如果运行失败是Memory out of range
造成的需要重新设置内存大小,
错误 1
There is insufficient memory for the Java Runtime Environment to continue
解决方案
作为 JVM 应用程序,Elasticsearch主服务器进程仅使用专用于 JVM 的内存。所需的内存可能取决于所使用的 JVM(32 位或 64 位)。JVM 使用的内存通常包括:
堆空间(通过-Xms和配置-Xmx)元空间(受可用本机内存量的限制)内部 JVM(通常为数十 Mb)依赖于操作系统的内存功能,如内存映射文件。Elasticsearch 主要依赖于堆内存,并且通过将-Xms 和 -Xmx(堆空间)选项传递给运行Elasticsearch服务器的 JVM 来手动设置。
使用如下命令打开内存配置文件
sudo nano /etc/elasticsearch/jvm.options
首先,取消注释的价值Xmx和Xms。然后,修改的价值-Xms和-Xmx你的物理内存不超过50%。这些设置的值取决于服务器上可用的 RAM 量,Elasticsearch 需要内存用于 JVM 堆以外的用途,为此留出空间很重要。
最低要求:如果物理 RAM <= 1 GB,内存设置应该是:# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space-Xms128m
-Xmx128m或者-Xms256m
-Xmx256m
中等要求:如果物理 RAM >= 2 GB但<= 4 GB,内存设置应该是:
-Xms512m
-Xmx512m
或者
-Xms750m
-Xmx750m
较大要求:如果物理 RAM >= 4 GB但<= 8 GB,内存设置应该是:
-Xms1024m
-Xmx1024m
或者
-Xms2048m
-Xmx2048m
注意:如果物理 RAM >= 8 GB,您可以决定要分配多少堆空间给 Elasticsearch。您可以分配-Xms2048m和-Xmx2048mOR-Xms4g和-Xmx4g或根据可用资源,获得更好的性能甚至更高。
错误 2
Initial heap size not equal to the maximum heap size
解决方案
确保的值-Xms和Xmx是相等的。也就是说,如果使用的是最低要求物理 RAM <= 1 GB,内存设置不能是这样:
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space-Xms128m
-Xmx256m
应该是这样的:
-Xms128m
-Xmx128m
或者
-Xms256m
-Xmx256m
错误 3
the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
解决方案
打开ES的配置文件elasticsearch.yml,并对discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes
进行正确配置
修复所有错误后,运行以下命令以启动并确认Elasticsearch的状态:
sudo systemctl start elasticsearch
sudo systemctl status elasticsearch
2.2.3 创建数据目录并授权
要在节点上创建数据目录,并授权
mkdir /data/elasticsearch -p
chown -R elasticsearch:elasticsearch /data/elasticsearch/
2.2.4 设置内存锁定
vim /usr/lib/systemd/system/elasticsearch.service # 修改启动配置文件
# 在末尾添加如下内容
[Service]
LimitMEMLOCK=infinity
2.2.5 重启服务
完成上述配置之后,重启ES
systemctl daemon-reload
systemctl start elasticsearch.service
2.2.6 查看日志和端口
tail -f /var/log/elasticsearch/LogAnalysisSys.log # 查看集群的日志
netstat -Intup|gerp 9200
03 集群管理
3.1 查看集群信息
集权管理APICluster APIs 官方文档
curl -XGET 'localhost:9200/_cluster/health&pretty' # 返回当前集群健康状态
curl -XGET 'localhost:9200/_cat/nodes?human&pretty' # 返回当前节点数与节点信息
curl -XGET 'localhost:9200/_cat/indices&pretty' # 返回索引信息
集群健康状态:集群运行状况 API 返回集群运行状况的简单状态。您还可以使用 API 获取仅指定数据流和索引的健康状态。对于数据流,API 检索流的后备索引的健康状态。
GET _cluster/health/<target>
集群状态信息:集群状态 API 允许访问表示整个集群状态的元数据。这包括信息,例如: 集群中的节点集所有集群级别的设置有关集群中索引的信息,包括它们的映射和设置集群中所有分片的位置。
GET /_cluster/state/<metrics>/<target>
查询节点的状态 :集群节点信息 API 允许检索一个或多个或全部集群节点信息。此处解释了所有节点选择选项 。默认情况下,它返回节点的所有属性和核心设置。
GET /_nodes/<node_id>
终端curl命令如下,查看节点信息和配置信息等
curl -XGET 'localhost:9200/_nodes/procese?human&pretty'
curl -XGET 'localhost:9200/_nodes/_all/info/jvm.procese?human&pretty'
curl -XGET 'localhost:9200/_cat/nodes?human&pretty' # 返回当前节点数与节点信息
3.2 集群分裂故障修复
分裂故障
如果集群由两个节点组成,master被设置为2时,一台节点出现故障将导致集群不可用
解决方案
把集群中还存活的节点的配置文件与主节点选举相关的配置选项注释掉,让该存活节点独立出集群,并重启服务。
discovery.zen.minimum_master_nodes: 1
如果不配置discovery.zen.minimum_master_nodes
选项,在节点在物理空间上多区域分布时,如果出现短暂断网会导致不同区域之间的节点独立出集群并划分为多个新集群,使得网络恢复之后,节点之间数据可能出现不一致的情况,集群无法恢复。而配置该选项之后,如果出现上述情况,节点之间会陷入等待状态,区域之间网络恢复之后,集群组织状态不变。
另一种解决方案,如果集群中节点数据出现不一致情况,可以直接选择清空其中一个节点的所有数据,然后重启服务让该节点自动拉取同步集群的最新数据。
分裂故障模拟实验
在两个节点的集群中,开启其中一个节点的防火墙,模拟节点宕机情况导致集群分裂的情况。
集群出现分裂故障之前的状态
开启master节点的防火墙,模拟网络抖动导致网络断开
sudo ufw enable # 开启防火墙
sudo ufw disable # 关闭防火墙
sudo ufw status # 查看防火墙状态
开启防火墙之后,可以看到集群分裂,node-1从集群中断开
断开状态数据插入
如果node-1的配置中discovery.zen.minimum_master_nodes: 1
,则node-1分裂之后会自行组建集群。
若在这种分裂状态下,分别向master和node-1插入不同新数据,便模拟出分裂故障后集群数据不一致情况
恢复网络
这时关闭防火墙恢复网络时,再看两个节点的数据状态,可以看到两个节点分别构成了两个不同的集群。
然后分别重新启动两个节点,由于已经配置互相发现Discovery,两个节点又恢复成一个集群,其中他们在断连中分别插入的数据,不同的数据分别同步到其他节点上,相同的数据以主节点为准同步,但是还是会出现数据不一致的情况。这种数据不一致情况,会导致查询结果不一致。
数据不一致的一种可行的解决方案:删除其中一个节点中的所有数据,然后重新启动加入集群,让该节点自动同步集群中主节点的数据。
rm -rf /data/elasticsearch/*
systemctl restart elasticsearch.service
3.3 集群新增第三个节点
和第二节介绍的新增节点步骤一致:安装ES、配置ES、新建数据目录、设置内存锁定,最后启动服务。
但是在配置ES时需要注意的是,discovery.seed_hosts
选项中不需要包含集群中所有的节点IP地址,只需要配置一个已经在集群中节点的IP地址和该节点自身的IP地址即可:[集群节点IP,自身IP]
。配置内容如下:
cluster.name: LogAnalysisSys
node.name: node-2
node.master: false
node.data: true
node.ingest: false
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 172.16.255.139,127.0.0.1
http.port: 9200
discovery.seed_hosts: ["172.16.255.131", "172.16.255.139"]
cluster.initial_master_nodes: ["master"]
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-credentials: true
节点无法加入集群故障
Elasticsearch: failed to validate ining join request from node
解决方法:直接清空该节点的数据目录中的内容,rm -rf /data/elasticsearch/*
,然后重启节点。
04 集群分片与副本
4.1 集群分片与副本的容错机制
添加第三个节点后,集群由master, node-1, node-2
三个节点组。集群中包含两个索引,分别是配置为1分片1副本的vipinfo索引和5分片1副本的logsys索引。集群分片与副本分布状态如下图
分片分布情况说明:以logsys索引为例,在三个数据节点中,数据被分散分布。其中保证每一个数据主分片都有一个数据副分片,让主分片通过选举机制被分配到不同的节点上,保证集群的高可靠性和可恢复性。
集群容错情况:由三个节点构成的集群,他的极端损坏情况是两个节点不在同一时间内宕机。例如,一个节点损坏后systemctl stop elasticsearch.service
,集群将重新分布数据分片,如下图所示
这种情况下集群的健康状态是green,但是集群中已经出现了节点宕机的情况。所以,在集群监控中不仅要监控集群的健康状态,还要监控集群的节点个数,当其中任一条件不满住时进行告警。
curl -XGET 'localhost:9200/_cluster/health&pretty' # 返回当前集群健康状态
curl -XGET 'localhost:9200/_cat/nodes?human&pretty' # 返回当前节点数与节点信息
如果两个节点同时宕机,且节点在宕机过程中数据丢失,则会导致集群整体数据的丢失,从而使得集群数据不可用。
第一个节点故障之后,集群的数据分片完成了重新备份。此时如果第二个节点出现故障,将不会导致集群失效,集群数据仍然可用。
集群恢复测试:在两个节点都关掉ES服务之后,将他们的数据目录也都删除,rm -rf /data/elasticsearch/*
。然后重启两个节点的ES服务,观察集群分片的重新备份如下
4.2 自定义索引分片与副本设置
分片多能够提高查询效率与速度,但是同时会增加磁盘空间占用率。
创建索引时设置分片:在创建索引的使用通过number_of_shards, number_of_replicas
两个选项分别设置索引的分片和副本
curl -XPUT '172.16.255.131:9200/logsys?pretty' -H 'Content-Type:application/json' -d'
{"settings": { "number_of_shards": 5, "number_of_replicas": 1}
}'
创建索引后设置副本:在创建索引之后,其分片选项不可修改,但是可以通过number_of_replicas
选项重新设置索引的副本数量
curl -XPUT '172.16.255.131:9200/logsys?pretty' -H 'Content-Type:application/json' -d'
{"settings": { "number_of_replicas": 1}
}'
多副本情况:在副本较多的情况下,可以避免集群极端损坏情况(三个节点的集群其中两个节点同时宕机),在副本足够的情况下,可以避免同时宕机出现的数据不完整情况。
例如下图中的tworeplicas
索引是3分片2副本
如果集群出现极端损坏情况,两个节点同时宕机,这时将导致只有1个副本的vipinfo, logsys
索引出现数据不完整的情况,无法完整读取该索引的数据,也无法向其中插入新数据。但是tworeplicas
索引是2副本,他的的数据是完整的,即使集群健康状态是红色,也可以继续使用该索引,可以向其中插入新数据。
更多推荐
集群,机制,基础,Elasticsearch
发布评论