目录
一、ES 集群基本概念
1.1 ES 集群的好处
es 天然支持集群模式,其好处主要有两个:
-
能够增大系统的容量,如内存、磁盘,使得 es 集群可以支持 PB 级的数据;
-
能够提高系统可用性,即使部分节点停止服务,整个集群依然可以正常服务。
1.2 ES 如何组集群
单节点 ES,如下图所示:
如果单节点出现问题,服务就不可用了,如何新增一个 es 节点加入集群:
ELasticsearch 集群是由多个节点组成的,通过cluster.name 设置集群名称,并且用于区分其它的集群,每个节点通过 node.name 指定节点的名称。
二、ES 集群环境部署
2.1 环境准备
操作系统:Centos 7.9
主机名称 | IP |
es-node1 | 192.168.170.132 |
es-node2 | 192.168.170.133 |
es-node3 | 192.168.170.134 |
2.2 初始化环境
可以查看我的这篇文章:CentOS 7 初始化系统_centos7初始化_Stars.Sky的博客-CSDN博客
注意:三台集群都要进行初始化操作!
2.3 安装 ES 软件
所有集群节点都需要安装 ES 软件:
rpm -ivh elasticsearch-7.8.1-x86_64.rpm
2.4 集群节点配置
2.4.1 node1 集群节点配置
[root@es-node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: my-es # 集群名称
node.name: es-node1 # 节点名称
path.data: /var/lib/elasticsearch # 数据存储路径
path.logs: /var/log/elasticsearch # 日志存储路径
network.host: 0.0.0.0 # 监听在本地哪个地址上
http.port: 9200 # 监听端口
discovery.seed_hosts: ["192.168.170.132", "192.168.170.133", "192.168.170.134"] # 集群主列表
cluster.initial_master_nodes: ["192.168.170.132", "192.168.170.133", "192.168.170.134"] # 仅第一次启动集群时进行选举
2.4.2 node2 集群节点配置
[root@es-node2 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: my-es
node.name: es-node2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.170.132", "192.168.170.133", "192.168.170.134"]
cluster.initial_master_nodes: ["192.168.170.132", "192.168.170.133", "192.168.170.134"]
2.4.3 node3 集群节点配置
[root@se-node3 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: my-es
node.name: es-node3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.170.132", "192.168.170.133", "192.168.170.134"]
cluster.initial_master_nodes: ["192.168.170.132", "192.168.170.133", "192.168.170.134"]
2.5 启动 ES
# 三台机器都要启动
systemctl enable --now elasticsearch.service
三、ES 集群健康检测
Cluster Health 获取集群的健康状态,整个集群状态包括以下三种:
-
green 健康状态,指所有主副分片都正常分配;
-
yellow 指所有主分片都正常分配,但是有副本分片未正常分配;
-
red 有主分片未分配,表示索引不完备,写可能有问题。(但不代表不能存储数据和读取数据)
检查 ES 集群是否正常运行,可以通过 curl、Cerebro 两种方式。
3.1 Curl 命令检查集群状态
curl 任意节点 ip 或者主机名称都可以:
[root@es-node1 ~]# curl es-node1:9200/_cluster/health?pretty=true
{
"cluster_name" : "my-es",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 0,
"active_shards" : 0,
"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
}
[root@es-node1 ~]# curl es-node1:9200/_cat/nodes?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.170.133 57 63 9 0.25 0.28 0.15 dilmrt * es-node2
192.168.170.134 36 63 8 0.15 0.27 0.16 dilmrt - es-node3
192.168.170.132 31 63 9 0.13 0.26 0.15 dilmrt - es-node1
上面可以看到,es-node2 为 master 节点!(带 * )
3.2 Cerebor 检查集群状态
可视化 cerebro 工具检查 ES 集群状态。
下载地址:Releases · lmenezes/cerebro · GitHub
# 安装到任意节点都可以
[root@es-node1 ~]# rpm -ivh cerebro-0.9.4-1.noarch.rpm
# cerebro 依赖于 Java 环境
[root@es-node1 ~]# yum -y install java
# 修改配置文件
[root@es-node1 ~]# vim /etc/cerebro/application.conf
# Path of local database file
data.path: "/var/lib/cerebro/cerebro.db"
#data.path = "./cerebro.db"
# 启动服务
[root@es-node1 ~]# systemctl enable --now cerebro
在浏览器访问 es-node1 IP:192.168.170.132:9000
集群检查效果如下图所示:
四、ES 集群节点类型
es 集群中节点类型介绍:
-
Cluster State
-
Master
-
Data
-
Coordinating
4.1 Cluster State
Cluster State:集群相关的数据称为 cluster state;会存储在每个节点中,主要有如下信息:
-
节点信息,比如节点名称、节点连接地址等
-
索引信息,比如索引名称、索引配置信息等
4.2 Master
-
ES 集群中只能有一个 master 节点, master 节点用于控制整个集群的操作;
-
master 主要维护 Cluster State,当有新数据产生后, Master 会将数据同步给其他 Node 节点;
-
master 节点是通过选举产生的,可以通过 node.master: true 指定为 Master节点。( 默认true )
当我们通过 API 创建索引 PUT /doc_index,Cluster State 则会发生变化,由 Master 同步至其他 Node 节点。
4.3 Data
-
存储数据的节点即为 data 节点,默认节点都是 data 类型,配置 node.data: true( 默认为 true );
-
当创建索引后,索引创建的数据会存储至某个节点,能够存储数据的节点,称为 data 节点。
4.4 Coordinating
-
处理请求的节点即为 coordinating 节点,该节点为所有节点的默认角色,不能取消;
-
coordinating 节点主要将请求路由到正确的节点处理。比如创建索引的请求会由 coordinating路由到 master 节点处理;当配置 node.master:false、node.data:false 则为 coordinating节点。
五、ES 集群分片副本
5.1 提高 ES 集群可用性
5.1.1 服务可用性
-
2 个节点的情况下,允许其中 1 个节点停止服务;
-
多个节点的情况下,坏的节点不能超过集群一半以上。
5.1.2 数据可用性
-
通过副本 replication 解决,这样每个节点上都有完备的数据。
-
如下图所示,node2 上是 oldxu_index 索引的一个完整副本数据。
5.2 增大 ES 集群的容量
如何增大 ES 集群系统的容量?我们需要想办法将数据均匀分布在所有节点上,则引入分片 shard 解决。
什么是分片?将一份完整数据分散为多个分片存储。
-
分片是 es 支持 Pb 级数据的基石;
-
分片存储了索引的部分数据,可以分布在任意节点上;
-
分片存在主分片和副本分片之分,副本分片主要用来实现数据的高可用;
-
副本分片的数据由主分片同步,可以有多个,用来提高读取数据性能的。
注意:主分片数在索引创建时指定且后续不允许在更改;默认 ES 7 版本分片数为1个。
如下图所示:在 3 个节点的集群中创建 oldxu_index 索引,指定 3 个分片和 1 个副本:
# 创建索引,设定主分片和副本分片
PUT /oldxu_index
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
}
# 动态修改副本分片
PUT /oldxu_index/_settings
{
"number_of_replicas": 9
}
5.3 增加节点能否提高容量
问题:目前一共有 3 个 ES 节点,如果此时增加一个新节点是否能提高 oldxu_index 索引数据容量?
答案:不能,因为 oldxu_index 只有 3 个分片,已经分布在 3 台节点上,那么新增的第四个节点对于 oldxu_index 而言是无法使用到的,所以也无法带来数据容量的提升。
5.4 增加副本能否提高读性能
问题:目前一共有 3 个 ES 节点,如果增加副本数是否能提高 oldxu_index 的读吞吐量?
答案:不能,因为新增的副本还是会分布在这 node1、node2、node3 这三个节点上的,还是使用了相同的资源,也就意味着有读请求来时,这些请求还是会分配到 node1、node2、node3 上进行处理、也就意味着,还是利用了相同的硬件资源,所以不会提升读性能。
问题:如果需要增加读吞吐量性能,应该怎么来做?
答案:增加读吞吐量还是需要添加节点,比如在增加三个节点 node4、node5、node6。那么将原来的 R0、R1、R2 分别迁移至新增的三个节点上,当有读请求来时会被分配 node4、node5、node6,也就意味着有新的 CPU、内存、IO,这样就不会在占用 node1、node2、node3 的硬件资源,那么这个时候读吞吐量才会得到真正的提升。
5.5 副本与分片总结
分片数和副本的设定很重要,需要提前规划好!
-
过小会导致后续无法通过增加节点实现水平扩容;
-
设置分片过大会导致一个节点上分布过多的分片,造成资源浪费。分片过多也会影响查询性能。
上一篇文章:【Elastic (ELK) Stack 实战教程】02、ElasticSearch 基础_Stars.Sky的博客-CSDN博客
下一篇文章:【Elastic (ELK) Stack 实战教程】04、ElasticSearch 集群进阶及优化_Stars.Sky的博客-CSDN博客