本篇文章依据ElasticSearch权威指南进行实操和记录
1,空集群
即不包含任何节点的集群
集群大多数分为两类,主节点和数据节点
主节点
职责:主节点负责管理集群的状态,例如分配分片、添加和删除节点、监控节点故障等。它们不直接处理搜索或数据存储任务,但它们对于集群的健康和性能至关重要。
选举过程:在Elasticsearch中,主节点是通过选举产生的。默认情况下,集群中的任何节点都可以成为主节点候选者。这意味着任何一个节点都可以发起成为主节点的请求,然后与其他节点竞争以决定谁是新的主节点。
资源需求:主节点通常不需要太多的资源来处理其任务,因为它不直接处理数据。但是,它需要稳定的网络连接和足够的CPU来处理集群状态管理任务。
数据节点
职责:数据节点负责存储数据、搜索数据和处理与数据相关的操作,如索引和搜索请求。数据节点是执行实际数据存储和检索任务的地方。
资源需求:数据节点需要大量的资源来存储和处理数据。这包括大量的内存(用于缓存)、磁盘空间(用于存储数据)以及CPU资源(用于处理搜索和聚合查询)。
配置:在Elasticsearch中,默认情况下,每个节点都是数据节点。但是,你可以通过配置来指定哪些节点应该仅作为主节点或仅作为数据节点运行
空集群即启动节点且不包含任何数据和索引,由于集群中必有一个主节点,所以空集群比定为主节点
2,集群健康
集群健康是集群监控系统数据中的其中一项,而且最为重要
输入如下指令
GET /_cluster/health
返回
可以看到status返回了yellow
status状态
status指示着当前集群在总体上是否工作正常。包括三种颜色,green
:所有的主分片和副本分片都正常运行,yellow
:所有的主分片都正常运行,但不是所有的副本分片都正常运行,red
:有主分片没能正常运行。
全部字段含义
{
"cluster_name": "elasticsearch", //集群名称
"status": "green", //集群状态
"timed_out": false, //检查是否因超时中断,false表示检查完整完成
"number_of_nodes": 2, //集群中节点总数(当前为2个)
"number_of_data_nodes": 2, //具备数据存储功能的节点数量(当前为2个)
"active_primary_shards": 42, //活跃的主分片数(42个)
"active_shards": 84,//总分片数(含副本,84个)
"relocating_shards": 0, //正在迁移的分片数(0表示无迁移)
"initializing_shards": 0, //初始化中的分片数
"unassigned_shards": 0, //未分配的分片数
"unassigned_primary_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 //活跃分片百分比,100表示全部分片正常
}
3,添加索引
索引之前这篇文章简单介绍过ElasticSeach快速上手笔记-入门篇-CSDN博客
es的索引指的是存储相关数据的数据结构,可以类比成mysql的数据表,es索引会存储不同的数据结构key和value的关系
分片是一个 Lucene 的实例,以及它本身就是一个完整的搜索引擎。 我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互
分片可以把数据分散存储在es的集群中
同样分片也分为主分片和副分片
主分片:每个索引被划分成若干个主分片,每个主分片都是一个独立的索引。主分片负责处理所有的读和写操作,主分片的数量在索引创建时确定,之后不能更改,主分片是数据存储的基本单位,每个主分片存储索引的一部分数据
副分片:副本分片是主分片的完整复制,位于不同的节点上,副本的数量可以在索引运行时动态调整,副本分片用于提高系统的可用性和容错性。如果某个节点故障,系统仍然能够通过副本分片提供服务
新建索引
接下来参考权威指南在空集群新建一个索引
PUT /blogs
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
返回
可以看到成功新建
再次查看集群健康状态
可以看到status=yellow,集群状态主分片全部正常运行,但是副分片未全部正常,
unassigned_shards=5,这里处于未被分配状态的分片数量有5个,除了最开始的2个,刚才又新建了2个,所以有5个
注意分片要不只存储原始数据,要不只存储副本数量,无需既存储原始数据又存储副本数据,这样会在数据丢失的时候原始数据和副本全部丢失
4,添加故障转移
当前咱的集群只有一个节点,这样当前节点宕机等异常的时候会导致数据丢失
所以可以部署新的节点来解决这个问题
准备新节点
首先复制一份es文件
同时把data文件删除掉
修改elasticsearch.yml文件
cluster.name: elasticsearch
node.name: node-1
http.port: 9303
cluster.name:集群名字,确认两个节点保持相同
node.name:节点名称,不同的节点名称唯一
http.port:端口号,各个节点均不同
启动新节点
./bin/elasticsearch
进入es文件下 和之前启动节点相同执行以上指令
kibana查看节点数量
输入指令
GET /_cat/nodes?v
返回
可以看到当前集群下有两个节点
查看集群健康状态
GET /_cluster/health
返回
可以看到这个时候的status=green了 表明所有的节点都在正常运行
同时unassigned_shards的数量变成了0
表明所有的分片都分配好了
分片分布情况
节点一分片数量3个,节点二数量3个
可以看到两个节点的分片是均匀分布的
5,水平扩容
在了解水平扩容之前,先了解下扩容有几类
水平扩容:水平扩容是指增加更多的节点到集群中,而不是增加单个节点的资源。这种方式可以显著提高系统的容量和处理能力
垂直扩展:垂直扩展是指增加单个节点的资源,比如增加CPU、内存或者存储空间。这种方式通常通过升级单个节点的硬件来实现。
当开发的项目量级逐渐增加,需要的存储的数据越来越多,只有两个节点是远远不够的,所以需进行水平扩容
增加节点3
参考之前部署节点部署节点3
可以看到节点3成功启动了
重新查看当前集群的节点情况
GET /_cat/nodes?v
返回
可以看到这个时候多了节点node-3,共有3个节点
分片分布情况
node-1
node-1的分片有2个
node-3
node-3的分片有2个
默认节点
默认节点同样有2个
作用
之前每个节点拥有3个分片,现在每个节点拥有2个分片
每个节点的硬件资源(CPU, RAM, I/O)将被更少的分片所共享,每个分片的性能将会得到提升
现在拥有6个分片(3个主分片和3个副本分片)的索引可以最大扩容6个节点,每个节点上存在一个分片,并且每个分片拥有所在节点的全部资源
继续扩容
权威指南里指出当需要的节点数量超过了当前的分片数量的时候,该咋办
这时候可以通过增加分片的数量进而进行水平扩容
增加分片可以选择主分片和副本分片,但主分片在索引新建的时候已确定了,但副本分片可以进行读操作和搜索操作可以动态修改
修改副本分片数量为2个
PUT /blogs/_settings
{
"number_of_replicas" : 2
}
返回
再次查看分片分布情况
node-1
node-3
默认节点
这个时候分片数量扩容到了9个,因此节点数量可以扩容到9个
注意这个时候咱只是新建了3个节点,没有提高性能,单分片能够从节点中获取的资源更少,所以需拿到更好的水平得把节点数量扩容到分片数量保持相同
当然现在在不增加节点的情况下,可以保证部分节点宕机的情况下,数据不会丢失
6,应对故障
现在来测试下宕机的情况下,节点之间的处理逻辑
查看节点情况
这个时候关闭主节点之后,而集群中必定有个主节点,所以会新选举出来一个新的主节点
同时主分片会丢失,但不会影响es的正常工作
同时这个主分片对应的副本分片会变成主分片
指令
查看节点的id
GET /_cat/nodes?v&h=id,name,ip,node.role,master
返回
id name ip node.role master
O3QH local 127.0.0.1 cdfhilmrstw *
Y-Pa node-2 127.0.0.1 cdfhilmrstw -
qqxZ node-3 127.0.0.1 cdfhilmrstw -
这个时候主节点为local
其它的两个节点为从节点
原节点主副分片分配情况
index shard prirep state docs store dataset ip node
blogs 0 r STARTED 0 249b 249b 127.0.0.1 node-2
blogs 0 p STARTED 0 249b 249b 127.0.0.1 node-3
blogs 0 r STARTED 0 249b 249b 127.0.0.1 local
blogs 1 r STARTED 0 249b 249b 127.0.0.1 node-2
blogs 1 r STARTED 0 249b 249b 127.0.0.1 node-3
blogs 1 p STARTED 0 249b 249b 127.0.0.1 local
blogs 2 p STARTED 0 249b 249b 127.0.0.1 node-2
blogs 2 r STARTED 0 249b 249b 127.0.0.1 node-3
blogs 2 r STARTED 0 249b 249b 127.0.0.1 local
主节点拥有 1个主节点p1、2个副分片r0和r2
从节点node-2 拥有r0、r1、p2
从节点node-3拥有 p0、r1、r2
删除主节点
首先看主节点的PID
GET /_nodes/process
返回
可以看到PID为74142
关闭该节点
kill -9 74142
重新启动节点1
可以看到主节点变成了节点3
id name ip node.role port master
qqxZ node-3 127.0.0.1 cdfhilmrstw 9302 *
O3QH local 127.0.0.1 cdfhilmrstw 9300 -
Y-Pa node-2 127.0.0.1 cdfhilmrstw 9301 -
再次关闭节点3
可以看到节点2被选举成为了主节点
当主节点关闭,其余的从节点会选举成为新的主节点
新分片分布情况
node-2分片:p0、p1、p2
节点1:r0、r1、r2
这个时候查看集群健康状态
GET /_cluster/health
返回
可以看到状态status=yellow
由于这个时候关闭了节点3,有3个副本分片没有被分配,但集群仍然会正常运行,由于节点1存储这个所有主分片的副本分片
重新启动节点3
看分片情况
节点1:r0、r1、r2
节点2:p0、p1、p2
节点3:r0、r1、r2
这个时候未分配的副本分片重新分配给了节点3