ES使用心得
客户端
Transport Client已经快要废弃了,官方推荐使用High Level REST Client。
常用命令
启停
systemctl start elasticsearch
systemctl stop elasticsearch
节点状态
curl http://myservice1:9200/_cat/nodes?vip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
xx.xx.xx.205 15 96 2 0.10 0.08 0.08 mdi - xx.xx.xx.205
xx.xx.xx.250 18 98 14 0.66 0.35 0.31 di - xx.xx.xx.250
xx.xx.xx.7 25 99 2 0.21 0.11 0.06 mdi - xx.xx.xx.7
xx.xx.xx.30 30 93 13 1.15 0.60 0.42 di - xx.xx.xx.30
xx.xx.xx.249 64 94 3 0.09 0.06 0.10 di - xx.xx.xx.249
xx.xx.xx.12 75 99 2 0.20 0.08 0.06 mdi * xx.xx.xx.12
xx.xx.xx.2 70 96 1 0.14 0.09 0.07 di - xx.xx.xx.2
xx.xx.xx.36 27 99 13 0.83 0.45 0.36 di - xx.xx.xx.36
注意node.role和master两列,前者表示节点角色,有:mdi(master+data+ingest)和di(data+ingest)。
master列为星号的表示主节点。比如这里xx.xx.xx.12就是主节点。
集群健康状态
curl http://myservice1:9200/_cat/health?vepoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1651459176 02:39:36 elasticsearch green 8 8 3796 1898 0 0 0 0 - 100.0%
各列含义:
cluster ,集群名称
status,集群状态 green代表健康;yellow代表分配了所有主分片,但至少缺少一个副本,此时集群数据仍旧完整;red代表部分主分片不可用,可能已经丢失数据。
node.total,代表在线的节点总数量
node.data,代表在线的数据节点的数量
shards, active_shards 存活的分片数量
pri,active_primary_shards 存活的主分片数量 正常情况下(replica=1), shards的数量是pri的两倍。
relo, relocating_shards 迁移中的分片数量,正常情况为 0
init, initializing_shards 初始化中的分片数量 正常情况为 0
unassign, unassigned_shards 未分配的分片 正常情况为 0
pending_tasks,准备中的任务,任务指迁移分片等 正常情况为 0
max_task_wait_time,任务最长等待时间
active_shards_percent,正常分片百分比 正常情况为 100%
列出所有索引
curl http://myservice1:9200/_cat/indices?v
修改索引副本数
PUT test/_settings
{"index": {"number_of_replicas" : 1}
}
文档增删改查
指定ID创建一个索引,并往其中加入文档,文档格式为json
curl -XPUT -H "Content-Type: application/json" 'myservice1:9200/customer/external/1?pretty' -d '
{
"name": "yibei"
}'不指定ID的加入一个文档
curl -XPOST -H "Content-Type: application/json" 'myservice1:9200/customer/external?pretty' -d '
{
"name": "xx3"
}'修改文档内容
curl -XPOST -H "Content-Type: application/json" 'myservice1:9200/customer/external/1/_update?pretty' -d'
{
"doc":{"name": "lixiao","age":45}
}'从索引里根据ID取得某个文档
curl -XGET 'myservice1:9200/customer/external/1?pretty'搜索所有文档
curl -XPOST -H "Content-Type: application/json" 'myservice1:9200/customer/_search?pretty' -d '
{
"query": { "match_all": {} },
"from": 0,
"size":20
}'删除索引
curl -XDELETE 'myservice1:9200/customer?pretty'查看恢复进程
curl -XGET 'myservice1:9200/_recovery'
文档update or insert
参考这里:
使用doc_as_upsert:
curl -XPOST -H "Content-Type: application/json" 'myservice1:9200/customer/external/1/_update' -d '{"doc" : {"name" : "yibei1"},"doc_as_upsert" : true
}'
进阶
shard/replica和ES节点
参看该文说明
节点down掉对集群影响的实验
总共8个节点,分别看一下同时down掉1/2/3个节点对集群状态和读写的影响。
8个节点的总分片和主分片数是:3796 1898
同时1个节点down掉,查看集群健康状态:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1651460709 03:05:09 elasticsearch yellow 7 7 3322 1898 0 0 474 0 - 87.5%
集群状态变为黄色,主分片未受影响,备份分片减少,未分配分片数为474,active_shards_percent从100%降为87.5%。
读操作未受影响,写操作略有点慢,但还是能写入。
另外,我们注意到一点,这种情况相当于节点退出,ES会自动做shard relocation,因此shards和active_shards_percent会缓慢恢复。同时由于主分片未受损,大概20min左右,集群就会重新恢复到green状态。
同时2个节点down掉,查看集群健康状态:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1651468939 05:22:19 elasticsearch red 6 6 3405 1861 2 0 381 0 - 89.9%
集群状态变为红色,主分片有损失,active_shards_percent降到89.9%,这个值看来跟down掉的节点数并无线性关系。
读操作未受影响,写操作时如果正在做shard relocation,略有点慢,但还是能写入的。
shards和active_shards_percent会缓慢恢复,但恢复不到100%的状态,因为主分片已受损了,补偿不回来的。过了一段时间,集群状态最后也始终停留在red,此时active_shards_percent停留在98.3%,unassign有64个分片无法恢复,恰好就是损失的主分片数的2倍!
最后,我们将2个节点恢复,集群经过30s的shard relocation,即可恢复green状态,active_shards_percent也为100%.
同时3个节点down掉,查看集群健康状态:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1651462580 03:36:20 elasticsearch red 5 5 2641 1826 0 0 1155 0 - 69.6%
集群状态变为红色,主分片已受损,备份分片更是减少的厉害,active_shards_percent降到了69.6%。
读操作未受影响,写操作有时慢,有时还会超时,报错:
{"error" : {"root_cause" : [{"type" : "unavailable_shards_exception","reason" : "[customer][4] primary shard is not active Timeout: [1m], request: [BulkShardRequest [[customer][4]] containing [index {[customer][external][G3sTg4ABDFINJI3kc3ug], source[\n{\n\"name\": \"liping2\"\n}]}]]"}],"type" : "unavailable_shards_exception","reason" : "[customer][4] primary shard is not active Timeout: [1m], request: [BulkShardRequest [[customer][4]] containing [index {[customer][external][G3sTg4ABDFINJI3kc3ug], source[\n{\n\"name\": \"liping2\"\n}]}]]"},"status" : 503
}
可能刚好写到受损的主分片上了。再试一次,又成功了,应该是选了一个健康的主分片来写。
三个节点down掉后,ES依然会自动做shard relocation,因此shards和active_shards_percent会缓慢恢复,但恢复不到100%的状态,因为主分片已受损了,补偿不回来的。过了40min,集群状态最后也始终停留在red,此时active_shards_percent停留在96.2%,unassign有144个分片无法恢复,恰好就是损失的主分片数的2倍!
最后,我们将3个节点恢复,集群经过1~2min的shard relocation,即可恢复green状态,active_shards_percent也为100%。
结论
- 节点退出后的shard relocation动作会比较慢,在relocation阶段如果有业务查询或修改也会比较慢;
- 节点加入后的shard relocation动作很快,基本上1~2min就可以恢复正常;
- replica=1时,仅仅down掉2个节点,就会导致集群的主分片受损,永远陷入red状态,并可能导致写入超时(写到受损主分片时);
- 分片可以认为是一块为index预分配的空间,只在index新建或删除时会变化,而在insert doc时并不会变;分片数在索引创建时确定,后续不能修改,除非用reindex重建索引。
为何分片数在索引创建后就不能修改
Reason that you can't change the primary shards are due to the fact, it will change the way data is split between primary shards and changing them will cause consistent hashing to break, which is very popular technique to horizontally scale and splitting the data technique.Replicas shards are just copy so you can increase and decrease as it doesn't make any impact on consistent hashing.If you want to change the primary shards, you have to create a new index and use alias API and Reindex API for efficiently doing it
replica与数据节点数的关系
ES有个选项,叫auto_expand_replicas,会自动根据data node数扩展replica,默认是关闭的。根据这个选项我们可以猜测,replica与data node数之间应该是有关系的,不能说数据节点在扩充,而replica始终不变,理论上replica也要随之递增。
那么,两者间有没有一个推荐的关系公式呢?
google了一下,有如下结论:
Another factor to consider with replicas is the number of nodes available. Replicas are always placed on different nodes from the primary shard, since two copies of the same data on the same node would add no protection if the node were to fail. As a result, for a system to support n replicas, there need to be at least n + 1 nodes in the cluster. For instance, if there are two nodes in a system and an index is configured with six replicas, only one replica will be allocated. On the other hand, a system with seven nodes is perfectly capable of handling one primary shard and six replicas.
考虑replica=1的情况,这时如果只down一个节点A,A上的主shard必定在其他完好的节点上有备shard(主备shard不能在同一个节点),所以即使A down掉了,也不会导致主shard受损,因为其他节点上的备shard会接替成为新的主shard。
这是我们上面做的第一个实验的情况。
如果down了两个节点,情况就不同了,很可能这俩节点上的主shard在其他完好节点上就没有备shard,于是就有可能主shard受损。这是我们上面第二个实验的情况,我们会看到,最后有1.7%的主分片受损。但,如果此时我们将replic调高到2,则这俩故障节点上的主shard在其他完好节点上必定会有备shard,这样即使2个节点都down掉,也不会有主分片受损。
以此类推,down了三个节点时,如果replica=3,则必定在其他完好节点上有备shard,数据不会受损。
因此,若想数据完全不受损,必须满足:
replica数=可能down掉的最大数据节点数
但replica不是没有代价的,它就像数据库的索引,会额外占用内存、磁盘空间,在提高查询效率的同时,也会降低增删doc的效率。
所以,这里头是有一个折中的。
相关文章:
ES使用心得
客户端 Transport Client已经快要废弃了,官方推荐使用High Level REST Client。 常用命令 启停 systemctl start elasticsearch systemctl stop elasticsearch节点状态 curl http://myservice1:9200/_cat/nodes?vip heap.percent ram.percent cpu l…...

Stable Diffusion - 幻想 (Fantasy) 风格与糖果世界 (Candy Land) 人物提示词配置
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132212193 图像由 DreamShaper8 模型生成,融合糖果世界。 幻想 (Fantasy) 风格图像是一种以想象力为主导的艺术形式,创造了…...
部署K8S集群
目录 一、环境搭建 1、准备环境 2、安装master节点 3、安装k8s-master上的node 4、安装配置k8s-node1节点 5、安装k8s-node2节点 6、为所有node节点配置flannel网络 7、配置docker开启加载防火墙规则允许转发数据 二、k8s常用资源管理 1、创建一个pod 2、pod管理 一、…...

在时间和频率域中准确地测量太阳黑子活动及使用信号处理工具箱(TM)生成广泛的波形,如正弦波、方波等研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

一百五十四、Kettle——Linux上安装Kettle9.3(踩坑,亲测有效,附截图)
一、目的 由于kettle8.2在Linux上安装后,共享资源库创建遇到一系列问题,所以就换成kettle9.3 二、kettle版本以及安装包网盘链接 kettle9.3.0安装包网盘链接 链接:https://pan.baidu.com/s/1MS8QBhv9ukpqlVQKEMMHQA?pwddqm0 提取码&…...

PackageNotFoundError: No package metadata was found for bitsandbytes解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
uni-app和springboot完成前端后端对称加密解密流程
概述 使用对称加密的方式实现。前端基于crypto-js。uni-app框架中是在uni.request的基础上,在拦截器中处理的。springboot在Filter中完成解密工作。 uni-app 项目中引入crypto-js。 npm install crypto-js加密方法 const SECRET_KEY CryptoJS.enc.Utf8.parse(…...

【Unity造轮子】制作一个简单的2d抓勾效果(类似蜘蛛侠的技能)
前言 欢迎阅读本文,本文将向您介绍如何使用Unity游戏引擎来实现一个简单而有趣的2D抓勾效果,类似于蜘蛛侠的独特能力。抓勾效果是许多动作游戏和平台游戏中的常见元素,给玩家带来了无限的想象和挑战。 不需要担心,即使您是一…...
Unity 人物连招(三段连击)
一: 连招思路 首先人物角色上有三个攻击实例对象 Damage,每一个damage定义了攻击的伤害值,攻击距离,触发器名称,伤害的发起者,攻击持续时间,攻击重置时间,伤害的碰撞框大小等字段: …...
关于WSL以及docker连接adb的坑
结论 WSL可以连接到adb,需要和主机保持一致的adb型号。主机是windows还是macOS的docker没法直接连接到adb设备,只有主机为Linux才可以。其他平台只能通过TCP网络协议。 具体过程 关于WSL连接adb设备 windows安装adb工具(安装可以去官网下…...

python安装第三方包时报错:...\lib\site-packages\pip\_vendor\urllib3\response.py...
安装redis第三方包: pip install redis报错现象: 解决方法:使用以下命令可成功安装 pip install redis -i http://pypi.douban.com/simple --trusted-host pypi.douban.com...
腾讯云从业者认证考试考点——云存储产品
文章目录 存储产品功能云存储产品概述存储产品存储网关存储服务 存储分类按存储方式分按存储频率分 云存储与传统存储的区别功能需求性能需求容量扩展数据共享 云硬盘CBS产品概述归档存储和文件存储归档存储CAS文件存储CFS 对象存储存储网关存储网关的分类 云数据迁移CDM日志服…...

猿辅导Motiff与IXDC达成战略合作,将在UI设计领域推动AI革新更多可能性
近日,“IXDC 2023国际体验设计大会”在北京国家会议中心拉开序幕,3000设计师、1000企业、200全球商业领袖,共襄为期5天的用户体验创新盛会。据了解,此次大会是以“设计领导力”为主题,分享全球设计、科技、商业的前沿趋…...

条件操作符(三目操作符)
比如之前我们想写一个条件判断表达式是这样写的: 用操作符就可以这样写: 应用,比如求两个数的最大值...
(五)Unity开发Vision Pro——FAQ
常见问题 (FAQ) 1.问:我看到在visionOS 模拟器中运行的结果与在硬件上运行的结果不同 请注意,在模拟器中运行时,某些特定于硬件的功能不可用 - 最明显的是 AR 数据。这可能意味着 VisionOS 模拟器中的模拟结果可能与 Vision Pro 耳机上的模…...

GitOps 与 DevOps:了解关键差异,为企业做出最佳选择
在软件开发领域,GitOps 和 DevOps 是加强协作和实现软件交付流程自动化的重要技术。虽然这两种模式都旨在提高软件开发生命周期的效率,但它们的核心原则和实施方式却各不相同。 本篇文章将帮助您了解 GitOps 和 DevOps 之间的差异、它们的工作流程&am…...
Java实现Word文档转PDF,PDF转Word,PDF转Excel,PDF转换工具
前言 java实现word文档转PDF,PDF转word 解决只能转换4页问题 解决每页头部存在水印问题 实现 引入依赖 <dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.0.3</ve…...

Docker部署ES服务,全量同步的时候内存爆炸,ES自动关闭,CPU100%
问题 使用canal-adapter全量同步(参考Canal Adapter1.1.5版本API操作服务,手动同步数据(4))的时候 小批量数据可以正常运行(几千条)只要数据量一大(上万条),…...

Python——添加照片边框
原图: 添加边框后: 添加边框会读取照片的exif信息如时间、相机型号、品牌以及快门焦段等信息,将他们显示在下面的边框中。 获取当前py文件路径 import os #get path that py file located def Get_Currentpath():file_path os.path.abspa…...

《高性能MySQL》——查询性能优化(笔记)
文章目录 六、查询性能优化6.1 查询为什么会慢6.2 慢查询基础:优化数据访问6.2.1 是否向数据库请求了不需要的数据查询不需要的记录多表关联时返回全部列总是取出全部列重复查询相同的数据 6.2.2 MySQL 是否在扫描额外的记录响应时间扫描的行数与返回的行数扫描的行…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...