赞
踩
目录
es 天然支持集群模式,其好处主要有两个:
能够增大系统的容量,如内存、磁盘,使得 es 集群可以支持 PB 级的数据;
能够提高系统可用性,即使部分节点停止服务,整个集群依然可以正常服务。
单节点 ES,如下图所示:
如果单节点出现问题,服务就不可用了,如何新增一个 es 节点加入集群:
ELasticsearch 集群是由多个节点组成的,通过cluster.name 设置集群名称,并且用于区分其它的集群,每个节点通过 node.name 指定节点的名称。
操作系统:Centos 7.9
主机名称 | IP |
es-node1 | 192.168.170.132 |
es-node2 | 192.168.170.133 |
es-node3 | 192.168.170.134 |
可以查看我的这篇文章:CentOS 7 初始化系统_centos7初始化_Stars.Sky的博客-CSDN博客
注意:三台集群都要进行初始化操作!
所有集群节点都需要安装 ES 软件:
rpm -ivh elasticsearch-7.8.1-x86_64.rpm
- [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"] # 仅第一次启动集群时进行选举
- [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"]
- [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"]
- # 三台机器都要启动
- systemctl enable --now elasticsearch.service
Cluster Health 获取集群的健康状态,整个集群状态包括以下三种:
green 健康状态,指所有主副分片都正常分配;
yellow 指所有主分片都正常分配,但是有副本分片未正常分配;
red 有主分片未分配,表示索引不完备,写可能有问题。(但不代表不能存储数据和读取数据)
检查 ES 集群是否正常运行,可以通过 curl、Cerebro 两种方式。
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 节点!(带 * )
可视化 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 集群中节点类型介绍:
Cluster State
Master
Data
Coordinating
Cluster State:集群相关的数据称为 cluster state;会存储在每个节点中,主要有如下信息:
节点信息,比如节点名称、节点连接地址等
索引信息,比如索引名称、索引配置信息等
ES 集群中只能有一个 master 节点, master 节点用于控制整个集群的操作;
master 主要维护 Cluster State,当有新数据产生后, Master 会将数据同步给其他 Node 节点;
master 节点是通过选举产生的,可以通过 node.master: true 指定为 Master节点。( 默认true )
当我们通过 API 创建索引 PUT /doc_index,Cluster State 则会发生变化,由 Master 同步至其他 Node 节点。
存储数据的节点即为 data 节点,默认节点都是 data 类型,配置 node.data: true( 默认为 true );
当创建索引后,索引创建的数据会存储至某个节点,能够存储数据的节点,称为 data 节点。
处理请求的节点即为 coordinating 节点,该节点为所有节点的默认角色,不能取消;
coordinating 节点主要将请求路由到正确的节点处理。比如创建索引的请求会由 coordinating路由到 master 节点处理;当配置 node.master:false、node.data:false 则为 coordinating节点。
2 个节点的情况下,允许其中 1 个节点停止服务;
多个节点的情况下,坏的节点不能超过集群一半以上。
通过副本 replication 解决,这样每个节点上都有完备的数据。
如下图所示,node2 上是 oldxu_index 索引的一个完整副本数据。
如何增大 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
- }
问题:目前一共有 3 个 ES 节点,如果此时增加一个新节点是否能提高 oldxu_index 索引数据容量?
答案:不能,因为 oldxu_index 只有 3 个分片,已经分布在 3 台节点上,那么新增的第四个节点对于 oldxu_index 而言是无法使用到的,所以也无法带来数据容量的提升。
问题:目前一共有 3 个 ES 节点,如果增加副本数是否能提高 oldxu_index 的读吞吐量?
答案:不能,因为新增的副本还是会分布在这 node1、node2、node3 这三个节点上的,还是使用了相同的资源,也就意味着有读请求来时,这些请求还是会分配到 node1、node2、node3 上进行处理、也就意味着,还是利用了相同的硬件资源,所以不会提升读性能。
问题:如果需要增加读吞吐量性能,应该怎么来做?
答案:增加读吞吐量还是需要添加节点,比如在增加三个节点 node4、node5、node6。那么将原来的 R0、R1、R2 分别迁移至新增的三个节点上,当有读请求来时会被分配 node4、node5、node6,也就意味着有新的 CPU、内存、IO,这样就不会在占用 node1、node2、node3 的硬件资源,那么这个时候读吞吐量才会得到真正的提升。
分片数和副本的设定很重要,需要提前规划好!
过小会导致后续无法通过增加节点实现水平扩容;
设置分片过大会导致一个节点上分布过多的分片,造成资源浪费。分片过多也会影响查询性能。
上一篇文章:【Elastic (ELK) Stack 实战教程】02、ElasticSearch 基础_Stars.Sky的博客-CSDN博客
下一篇文章:【Elastic (ELK) Stack 实战教程】04、ElasticSearch 集群进阶及优化_Stars.Sky的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。