【Elastic (ELK) Stack 实战教程】04、ElasticSearch 集群进阶及优化

目录

一、ES 集群故障转移

1.1 什么是故障转移

1.2 模拟节点故障

1.2.1 重新选举

1.2.2 主分片调整

1.2.3 副本分片调整

二、ES 文档路由原理

2.1 文档的创建流程 

2.2 文档的读取流程 

2.3 文档批量创建的流程

2.4 文档批量读取的流程

​三、ES扩展集群节点

3.1 节点扩展环境准备

3.2 节点扩展 node4 配置

3.3 节点扩展 node5 配置

3.4 节点扩展检查

3.5 扩展路由节点

四、ES 集群调优建议(每台机器都需要)

4.1 内核参数优化

4.2 配置参数优化 

4.3 JVM 参数优化 


一、ES 集群故障转移

1.1 什么是故障转移

        所谓故障转移指的是,当集群中有节点发生故障时,这个集群是如何进行自动修复的。ES集群目前是由 3 个节点组成,如下图所示,此时集群状态是 green:

1.2 模拟节点故障

假设: node1 所在机器宕机导致服务终止,此时集群会如何处理?

大体分为三个步骤: 

  1. 重新选举

  2. 主分片调整

  3. 副本分片调整

1.2.1 重新选举

        node2 和 node3 发现 node1 无法响应;一段时间后会发起 master 选举,比如这里选择 node2 为 master 节点;此时集群状态变为 Red 状态:

1.2.2 主分片调整

        node2 发现主分片 P0 未分配,将 node3 上的 R0 提升为主分片;此时所有的主分片都正常分配,集群状态变为 Yellow状态:

1.2.3 副本分片调整

        node2 将 P0 和 P1 主分片重新生成新的副本分片 R0、R1,此时集群状态变为 Green:

二、ES 文档路由原理

        ES 文档分布式存储,当一个文档存储至 ES 集群时,存储的原理是什么样的?如图所示,当我们想一个集群保存文档时,Document1 是如何存储到分片 P1 的?选择 P1 的依据是什么? 

        其实是有一个文档到分片的映射算法,其目是使所有文档均匀分布在所有的分片上,那么是什么算法呢?随机还是轮询呢? 这种是不可取的,因为数据存储后,还需要读取,那这样的话如何读取呢?

        实际上,在 ES 中,通过如下的公式计算文档对应的分片存储到哪个节点,计算公式如下: 

shard = hash(routing) % number_of_primary_shards

# hash                         算法保证将数据均匀分散在分片中
# routing                      是一个关键参数,默认是文档id,也可以自定义。
# number_of_primary_shards     主分片数

# 注意:该算法与主分片数相关,一但确定后便不能更改主分片。因为一旦修改主分片修改后,Share 的计算就完全不一样了。

2.1 文档的创建流程 

2.2 文档的读取流程 

2.3 文档批量创建的流程

2.4 文档批量读取的流程

三、ES扩展集群节点

3.1 节点扩展环境准备

主机名称IP
es-node4192.168.170.130
es-node5192.168.170.131

3.2 节点扩展 node4 配置

实际生产环境中最好是用 Oracle jdk 安装:Linux 部署 JDK+MySQL+Tomcat 详细过程_移植mysql+tomcat_Stars.Sky的博客-CSDN博客 

这边省事就直接 yum 安装 java 了: 

[root@es-node4 ~]# yum -y install java 
[root@es-node4 ~]# rpm -ivh elasticsearch-7.8.1-x86_64.rpm 

[root@es-node4 ~]# vim /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-es                    # 加入的集群名称
node.name: es-node4
node.data: true                        # data节点(默认,可以不写)
node.master: false                     # 不参与 master 选举
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"]    # 选择要加入集群中的其中几个节点 ip 即可,不需要全部。

[root@es-node4 ~]# systemctl enable --now elasticsearch.service 

3.3 节点扩展 node5 配置

[root@es-node5 ~]# yum -y install java 
[root@es-node5 ~]# rpm -ivh elasticsearch-7.8.1-x86_64.rpm 

[root@es-node5 ~]# vim /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-es                    # 加入的集群名称
node.name: es-node5
node.data: true                        # data节点(默认,可以不写)
node.master: false                     # 不参与 master 选举
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"]    # 选择要加入集群中的其中几个节点 ip 即可,不需要全部。

[root@es-node5 ~]# systemctl enable --now elasticsearch.service 

3.4 节点扩展检查

        通过 cerebor 检查集群扩展后的状态;如果出现集群无法加入、或者加入集群被拒绝,尝试删除该节点 /var/lib/elasticsearch/* 下的文件,然后重启 es 即可:

3.5 扩展路由节点

        如果将 data 节点修改为 Coordinating 节点(如 node5);注意需要清理数据(生产环境中谨慎操作!),否则无法启动:

[root@es-node5 ~]# vim /etc/elasticsearch/elasticsearch.yml 
node.data: false

[root@es-node5 ~]# systemctl stop elasticsearch.service 

[root@es-node5 ~]# /usr/share/elasticsearch/bin/elasticsearch-node repurpose

[root@es-node5 ~]# systemctl restart elasticsearch.service 

node5 节点就不能存储数据了: 

四、ES 集群调优建议(每台机器都需要)

4.1 内核参数优化

# 对于操作系统,需要调整几个内核参数
[root@es-node1 ~]# vim /etc/sysctl.conf 

# 设定系统最大打开文件描述符数,建议修改为 655360 或者更高
fs.file-max=655360
# 用于限制一个进程可以拥有的虚拟内存大小,建议修改成 262144 或更高     
vm.max_map_count = 262144
net.core.somaxconn = 32768
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1000 65535
net.ipv4.tcp_max_tw_buckets = 400000

# 让配置生效
[root@es-node1 ~]# sysctl -p

# 调整最大用户进程数(nproc),调整进程最大打开文件描述符(nofile)
# 删除默认 nproc 设定文件
[root@es-node1 ~]# rm -rf /etc/security/limits.d/20-nproc.conf 
[root@es-node1 ~]# vim /etc/security/limits.conf 
*               soft    nproc            20480
*               hard    nproc            20480
*               soft    nofile           65536
*               hard    nofile           65536

4.2 配置参数优化 

#1. 锁定物理内存地址,避免 es 使用 swap 交换分区,频繁的交换,会导致 IOPS 变高。
[root@es-node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
bootstrap.memory_lock: true

#2. 配置 elasticsearch 启动参数
[root@es-node1 ~]# sed -i '/\[Service\]/aLimitMEMLOCK=infinity' /usr/lib/systemd/system/elasticsearch.service

[root@es-node1 ~]# systemctl daemon-reload
[root@es-node1 ~]# systemctl restart elasticsearch.service

4.3 JVM 参数优化 

        JVM 内存具体要根据 node 要存储的数据量来估算,为了保证性能,在内存和数据量间有一个建议的比例:像一般日志类文件, 1G 内存能存储 48G~96GB 数据;jvm 堆内存最大不要超过31GB;其次就是主分片的数量,单个控制在 30-50GB。

        假设总数据量为 1TB,3 个 node 节点,1 个副本;那么实际要存储的大小为 2TB,因为有一个副本的存在;2TB / 3 = 700GB,然后每个节点需要预留 20% 的空间,意味着每个 node 要存储大约 850GB 的数据;按照内存与存储数据的比率计算:

        850GB/48=17GB,小于 31 GB,因为 31*48=1.4TB 及每个 Node 可以存储 1.4TB 数据,所以 3 个节点足够;850GB/30=30 个主分片,因为要尽量控制主分片的大小为 30GB;

        假设总数据量为 2TB,3 个 node 节点,1 个副本;那么实际要存储的大小为 4TB,因为有一个副本的存在;4TB/3 = 1.4TB,然后每个节点需要预留 20% 的空间出来,意味着每个 node 要存储大约 1.7TB 的数据;按照内存与存储数据的比率计算:

        1.7TB/48=32GB 大于 31G,因为 31*48=1.4TB 及每个 Node 最多存储 1.4TB 数据,所以至少需要 4 个节点;1.5TB/30G=50 个主分片,因为要尽量控制主分配存储的大小为 30GB。

[root@es-node1 ~]# vim /etc/elasticsearch/jvm.options
-Xms31g # 最小堆内存
-Xmx31g # 最大堆内存

#可根据服务器内存大小,修改为合适的值。一般设置为服务器物理内存的一半最佳,但最大不能超过32G

# 每天 1TB 左右的数据量的服务器配置
16C 64G 6T 3 台 ECS

上一篇文章:【Elastic (ELK) Stack 实战教程】03、ElasticSearch 集群搭建_Stars.Sky的博客-CSDN博客

下一篇文章:【Elastic (ELK) Stack 实战教程】05、Filebeat 日志收集实践(上)_Stars.Sky的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/5939.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【目标检测论文阅读笔记】Multi-scene small object detection with modified YOLOv4

Abstract. 小目标检测的应用存在于我们日常生活中的许多不同场景中,该课题也是目标检测与识别研究中最难的问题之一。因此,提高小目标检测精度不仅在理论上具有重要意义,在实践中也具有重要意义。然而,当前的检测相关算法在这项任…

Node.js学习笔记——Express.js

一、express介绍 express是一个基于Node.js平台的极简、灵活的WEB应用开发框架,官方网址:https://www.expressjs.com.cn/ 二、express使用 2.1express下载 express本身是一个npm包,所以可以通过npm安装。 npm init npm i express 2.2expr…

Java接口

目录 抽象类 抽象类的概述 如何使用抽象类 抽象类的使用 抽象特征 关于抽象需要注意的几个事情 接口(interface) 常量 如何实现接口 接口与接口多继承 接口的注意事项 抽象类 抽象类的概述 父类中的方法,被它的子类们重写,子类各自的实现都不…

《花雕学AI》02:人工智能挺麻利,十分钟就为我写了一篇长长的故事

ChatGPT最近火爆全网,上线短短两个多月,活跃用户就过亿了,刷新了历史最火应用记录,网上几乎每天也都是ChatGPT各种消息。国内用户由于无法直接访问ChatGPT,所以大部分用户都无缘体验。不过呢,前段时间微软正…

Vulnhub:DC-3靶机

kali:192.168.111.111 靶机:192.168.111.250 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --scripthttp-enum 192.168.111.250 通过nmap得知目标CMS为Joomla 3.7.0 漏洞利用 搜索发现该版本存在sql注入 利用sqlmap获取目标后台用户密码 sqlmap -u &…

测试行业3年经验,面试想拿 17K,HR说你只值 8K,该如何回答或者反驳?

面试最尴尬的不是被拒绝,而是直接说你不值那个价格... 最近朋友在面试的时候,HR 突然来了句:你只值 7K。朋友后面和我说了这个事。我想如果是我处在这种情况下,自己并不能很好地回答或者反驳。不知道大家会怎么回答或者反驳&…

基于vivado(语言Verilog)的FPGA学习(4)——FPGA选择题总结(针对华为逻辑岗实习笔试)

基于vivado(语言Verilog)的FPGA学习(4)——FPGA选择题总结 文章目录基于vivado(语言Verilog)的FPGA学习(4)——FPGA选择题总结1. 消除险象2. 建立时间和保持时间3.ISE4.DMA5.仿真器6…

【Linux】-- 权限和Shell运行原理

目录 Shell的运行原理 用户切换 su - / su sudo 权限 chmod chown chgrp 八进制方法修改文件属性 目录权限 粘滞位 umask 自定义默认权限 Shell的运行原理 广义上,Linux发行版 Linux内核 外壳程序 Linux 从广义上来理解它是一个操作系统 而从狭义上…

关于Map类的使用小结

目录 1. 常用Map类和区别 2. HashMap工作原理 2.1 Put()执行过程 2.2 扩容机制 3. ConcurrentHashMap 3.1 工作原理 3.2 JDK7分段锁的优缺点 1. 常用Map类和区别 Map类包含:HashMap、HashTable、LinkedHashMap、TreeMap。 1) 从功能上区分。 HashMap&…

多线程进阶学习11------CountDownLatch、CyclicBarrier、Semaphore详解

CountDownLatch ①. CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞 ②. 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞) ③. 计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行 public static void m…

SpringBoot学习笔记上

文章目录1 SpringBoot1.1 SpringBoot介绍1.2 SpringBoot创建的三种方式1.3SpringBootApplication注解1.4 SpringBoot的配置文件1.5多环境配置1.6 使用jsp1.7 ComnandLineRunner 接口 , ApplcationRunner接口2 Web组件2.1 拦截器2.2 Servlet2.3 过滤器Filter2.4 字符…

gpt3官网中文版-人工智能软件chat gpt安装

GPT-3(Generative Pre-trained Transformer 3)是一种自然语言处理模型,由OpenAI研发而成。它是GPT系列模型的第三代,也是目前最大、最强大的自然语言处理模型之一,集成了1750亿个参数,具有广泛的使用场景&a…

Flutter Row 实例 —— 新手礼包

大家好,我是 17。 本文在 3.31 日全站综合热榜第一。 新手礼包一共 3 篇文章,每篇都是描述尽量详细,实例讲解,包会! Flutter Row 实例 —— 新手礼包Flutter TextField UI 实例 —— 新手礼包Flutter TextField 交…

靠近用户侧和数据,算网融合实现极致协同

游弋自如的生产力,在边缘。IMMENSE、36氪|作者 1846年1月,纽约。 一行长短不一的电码顺着通讯线路飞往130公里开外的费城,这是华尔街的巨头们首次使用电报传输讯息,更具有金钱意味的是,电力通讯的成功&am…

【蓝桥杯集训·周赛】AcWing 第96场周赛

文章目录第一题 AcWing 4876. 完美数一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第二题 AcWing 4877. 最大价值一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第三题 AcWing 4878. 维护数组一、题目1、原…

路由策略实验

运行OSPF协议 [R1]ospf 1 router-id 1.1.1.1 [R1-ospf-1]area 0 [R1-ospf-1-area-0.0.0.0]network 192.168.12.1 0.0.0.0 [R1-ospf-1-area-0.0.0.0]network 192.168.13.1 0.0.0.0 [R2]ospf 1 router-id 2.2.2.2 [R2-ospf-1]area 0 [R2-ospf-1-area-0.0.0.0]network 192.168.…

抖音seo矩阵系统源码搭建技术+二开开源代码定制部署

抖音已经成为了当今最为流行的短视频平台之一,拥有着庞大的用户群体和海量的视频资源。对于一些商家或者运营者来说,如何从这些视频资源中挖掘出有效的信息,进而提升自己的品牌、产品或者内容的曝光度,就成为了一个非常重要的问题…

一次通过.frm和.ibd恢复mysql数据表的过程

1、导出.frm和.ibd文件 2、安装Mysql的Utilities 3、执行命令(实际恢复的表) mysqlfrm --diagnostic ./stat_vehicle_mileage.frm4、复制Sql,添加ROW_FORMATCOMPACT(需要检测生成的Sql语句是否可用) CREATE TABLE …

Android开发-Android常用组件-ProgressBar进度条

4.8 ProgressBar进度条 常用属性 android:max 进度条的最大值 android:progress 进度条已完成进度值 android:progressDrawable 设置轨道对应的Drawable对象 android:indeterminate 如果设置成true,则进度条不精确显示进度 android:indeterminateDrawable …

YOLO算法改进指南【算法解读篇】:2.如何训练自己的数据集

我们接着上一篇文章配置完YOLOv5需要的环境后,今天我们试着用YOLOv5训练自己的数据。(在开始本教程前,记得先跑一遍入门篇,确保环境是正常的) 有图有真相,先看看我的运行结果 【YOLOv5 源码地址】 🚀 我的环境: 语言环境:Python3.8编译器:PyCharm深度学习环境: to…