【Elastic (ELK) Stack 实战教程】03、ElasticSearch 集群搭建

目录

一、ES 集群基本概念

1.1 ES 集群的好处

1.2 ES 如何组集群

二、ES 集群环境部署

2.1 环境准备

2.2 初始化环境

2.3 安装 ES 软件 

2.4 集群节点配置

2.4.1 node1 集群节点配置

2.4.2 node2 集群节点配置

2.4.3 node3 集群节点配置

2.5 启动 ES

三、ES 集群健康检测

3.1 Curl 命令检查集群状态

3.2 Cerebor 检查集群状态

四、ES 集群节点类型 

4.1 Cluster State  

4.2 Master

4.3 Data

4.4 Coordinating 

五、ES 集群分片副本

5.1 提高 ES 集群可用性

5.1.1 服务可用性

5.1.2 数据可用性

5.2 增大 ES 集群的容量  

5.3 增加节点能否提高容量

5.4 增加副本能否提高读性能 

5.5 副本与分片总结


一、ES 集群基本概念

1.1 ES 集群的好处

es 天然支持集群模式,其好处主要有两个:

  1. 能够增大系统的容量,如内存、磁盘,使得 es 集群可以支持 PB 级的数据;

  2. 能够提高系统可用性,即使部分节点停止服务,整个集群依然可以正常服务。

1.2 ES 如何组集群

单节点 ES,如下图所示:

如果单节点出现问题,服务就不可用了,如何新增一个 es 节点加入集群:

        ELasticsearch 集群是由多个节点组成的,通过cluster.name 设置集群名称,并且用于区分其它的集群,每个节点通过 node.name 指定节点的名称。 

二、ES 集群环境部署

2.1 环境准备

操作系统:Centos 7.9

主机名称IP
es-node1192.168.170.132
es-node2192.168.170.133
es-node3192.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 获取集群的健康状态,整个集群状态包括以下三种:

  1. green 健康状态,指所有主副分片都正常分配;

  2. yellow 指所有主分片都正常分配,但是有副本分片未正常分配;

  3. 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

  1. ES 集群中只能有一个 master 节点, master 节点用于控制整个集群的操作;

  2. master 主要维护 Cluster State,当有新数据产生后, Master 会将数据同步给其他 Node 节点;

  3. master 节点是通过选举产生的,可以通过 node.master: true 指定为 Master节点。( 默认true ) 

 

        当我们通过 API 创建索引 PUT /doc_index,Cluster State 则会发生变化,由 Master 同步至其他 Node 节点。

4.3 Data

  1. 存储数据的节点即为 data 节点,默认节点都是 data 类型,配置 node.data: true( 默认为 true );

  2. 当创建索引后,索引创建的数据会存储至某个节点,能够存储数据的节点,称为 data 节点。

4.4 Coordinating 

  1. 处理请求的节点即为 coordinating 节点,该节点为所有节点的默认角色,不能取消;

  2. 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 副本与分片总结

分片数和副本的设定很重要,需要提前规划好!

  1. 过小会导致后续无法通过增加节点实现水平扩容;

  2. 设置分片过大会导致一个节点上分布过多的分片,造成资源浪费。分片过多也会影响查询性能。

上一篇文章:【Elastic (ELK) Stack 实战教程】02、ElasticSearch 基础_Stars.Sky的博客-CSDN博客

下一篇文章:【Elastic (ELK) Stack 实战教程】04、ElasticSearch 集群进阶及优化_Stars.Sky的博客-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stars.Sky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值