【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.1索引、文档、分片、副本

server/2025/3/3 23:00:09/

👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路


文章大纲

  • 1.2 核心概念精讲-1.2.1索引(Index)、文档(Document)、分片(Shard)、副本(Replica)
    • 1. 索引(`Index`):数据的逻辑容器
      • 1.1 定义与核心特性
        • 典型索引示例(电商商品索引):
      • 1.2 与传统数据库的对比
      • 1.3 索引生命周期管理(`ILM`)
    • 2. 文档(`Document`):数据存储的基本单元
      • 2.1 `JSON`文档结构
      • 2.2 动态映射 vs 显式映射
      • 2.3 文档操作的原子性
    • 3. 分片(`Shard`):分布式架构的核心设计
      • 3.1 主分片与数据分布
        • 分片数量设定策略
      • 3.2 `分片大小与性能优化`
    • 4. 副本(`Replica`):高可用与性能的基石
      • 4.1 副本的核心作用
      • 4.2 副本配置策略
        • 副本与写入性能的关系
    • 5. 总结与最佳实践
      • 核心概念关联
      • 最佳实践指南
      • 未来演进方向

1.2 核心概念精讲-1.2.1索引(Index)、文档(Document)、分片(Shard)、副本(Replica)


1. 索引(Index):数据的逻辑容器

1.1 定义与核心特性

  • 逻辑容器:索引是Elasticsearch中最高层的数据组织单元,类似于传统数据库中的“表”。
  • 动态映射自动推断字段类型(如字符串识别为textkeyword)。
  • 多租户支持:一个集群可承载数千个独立索引(如logs-2023products)。
典型索引示例(电商商品索引):
PUT /products
{"mappings": {"properties": {"title":        { "type": "text", "analyzer": "ik_max_word" },  // 中文分词"price":        { "type": "double" },"category":     { "type": "keyword" },  // 精确匹配"tags":         { "type": "text", "fielddata": true },  // 支持聚合"created_at":   { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }}}
}

1.2 与传统数据库的对比

特性Elasticsearch Index关系型数据库 Table
Schema灵活性动态映射(可扩展)严格预定义
数据类型支持支持地理位置/向量基础类型为主
写入性能(单节点)5万文档/秒1万行/秒
典型应用场景日志/搜索/分析事务处理

1.3 索引生命周期管理(ILM

  • ES 索引生命周期管理将索引的生命周期划分为四个主要阶段:
    • 热(Hot):索引处于活跃使用状态,频繁进行读写操作。新创建的索引默认处于此阶段,需要高性能的硬件资源来保证快速的读写响应。
    • 温(Warm):当索引不再频繁写入,但仍需要被查询时,可将其转移到温阶段。这个阶段可以使用性能较低、成本较便宜的硬件。
    • 冷(Cold):索引很少被访问,数据基本处于只读状态。可以将其存储在成本更低的存储介质上,以节省成本。
    • 删除(Delete):当索引中的数据不再需要时,将其从系统中删除,释放磁盘空间。
      针对日志类索引的自动化管理策略:
阶段存储介质分片策略保留周期典型操作
HotSSD3主分片+1副本3天频繁写入与实时查询
WarmHDD合并为1主分片30天只读查询,forcemerge操作
Cold归档存储1主分片+0副本180天冻结索引(freeze)
Delete---自动删除

2. 文档(Document):数据存储的基本单元

2.1 JSON文档结构

  • 最小数据单元:以JSON格式存储,支持嵌套对象和数组
  • 元数据字段
    {"_index": "products",     // 所属索引"_id": "p1001",          // 文档唯一标识"_version": 3,           // 版本号(乐观锁控制)"_source": {             // 原始数据"title": "iPhone 15","price": 6999.00,"category": ["手机", "数码"]}
    }
    

2.2 动态映射 vs 显式映射

对比维度动态映射显式映射
适用场景快速原型开发生产环境(字段类型严格管控)
字段类型推断自动(如"2023-10-01"→date类型)需手动定义
性能影响可能因字段爆炸导致内存问题???稳定可控
典型配置"dynamic": true"dynamic": strict(禁止未知字段)
  • 可能因字段爆炸导致内存问题
    • ES 的动态映射是一种非常方便的特性,当你向索引中写入文档时,如果文档中包含的字段在索引映射中不存在,ES 会自动为这些新字段创建映射。这使得用户在使用 ES 时无需预先定义所有可能的字段,提高了灵活性。
    • 如果文档中存在大量不同的字段,或者字段名的组合非常多,动态映射会不断创建新的字段映射,这就可能导致字段爆炸问题。
    • 字段爆炸导致内存问题的具体影响
      • 内存占用增加:每个字段映射都需要在内存中占用一定的空间,大量的字段映射会显著增加 ES 节点的内存使用量。当内存使用达到系统限制时,可能会导致节点性能下降,甚至引发内存溢出错误,使节点崩溃。
      • 查询性能下降字段数量的增加会使 ES 在执行查询时需要处理更多的信息,增加了查询的复杂度和时间开销。同时,内存压力也可能导致缓存命中率下降,进一步影响查询性能。
      • 磁盘空间占用增加:除了内存占用,大量的字段映射也会增加磁盘空间的使用,因为 ES 需要将这些映射信息持久化到磁盘上。
      • 示例场景
        • 假设你正在使用 ES 来存储用户行为日志,每个日志文档包含用户的操作信息。由于用户的操作可能非常多样化,不同用户的日志文档中可能包含大量不同的字段。随着时间的推移,可能会有越来越多不同的字段被动态映射到索引中,最终导致字段爆炸。例如:
        • // 文档 1
          {"user_id": "123","action": "click","button_name": "submit"
          }// 文档 2
          {"user_id": "456","action": "scroll","scroll_distance": "500px"
          }// 文档 3
          {"user_id": "789","action": "hover","element_id": "element_123"
          }
          
    • 解决办法
      • 关闭动态映射dynamic: false
      • 使用动态模板
      • 定期清理无用字段。定期检查索引中的字段使用情况,删除那些不再使用的字段,以减少内存和磁盘空间的占用。

2.3 文档操作的原子性

  • 写入流程
    在这里插入图片描述

  • 版本控制:通过_version字段实现乐观锁,避免并发冲突。
    示例:更新文档时指定版本号:

    PUT /products/_doc/p1001?version=3
    {"title": "iPhone 15 Pro"
    }
    

3. 分片(Shard):分布式架构的核心设计

3.1 主分片与数据分布

  • 分布式存储每个索引划分为多个分片,均匀分布在集群节点中
  • 路由算法shard = hash(_routing) % number_of_shards(默认_routing=_id)。
分片数量设定策略
数据规模建议主分片数示例场景
< 50GB1-2小型日志索引
50GB - 1TB3-5中型电商商品库
> 1TB10+大型社交媒体数据

注意分片数一旦创建不可修改,需提前规划!

3.2 分片大小与性能优化

  • 黄金法则:单个分片大小控制在10GB-50GB之间。
  • 性能对比
分片大小查询延迟(平均)写入吞吐量(文档/秒)
10GB120ms12,000
50GB350ms8,000
100GB950ms3,500

过大分片问题 !!!

  • 恢复时间过长(1TB分片恢复需数小时)
  • 垃圾回收(GC)压力增大

4. 副本(Replica):高可用与性能的基石

4.1 副本的核心作用

作用维度说明
数据高可用主分片故障时,副本分片自动晋升为主分片
读性能扩展查询请求可路由到副本分片(负载均衡)
数据冗余防止硬件故障导致数据丢失(副本数=1时,可容忍1个节点宕机)

4.2 副本配置策略

场景推荐副本数示例
开发环境0-1本地测试集群
生产环境(常规)1-2电商搜索服务
关键业务(金融)2-3交易日志
副本与写入性能的关系
  • 写入流程:主分片写入后需同步到所有副本,增加副本数会降低写入速度。
  • 性能测试数据
副本数写入吞吐量(文档/秒)查询QPS(万级)
015,0003.2
110,0006.5
26,5009.8

5. 总结与最佳实践

核心概念关联

在这里插入图片描述

最佳实践指南

  1. 索引设计

    • 预定义映射避免字段爆炸
    • 按时间滚动创建索引(如logs-2023-10
  2. 分片策略

    • 单个分片大小控制在10GB-50GB
    • 分片数 = 节点数 × 1.5(预留扩容空间)
  3. 副本配置

    • 生产环境至少1个副本
    • 写入密集型场景可暂时降低副本数

未来演进方向

  • 自动分片调整:基于负载动态调整分片分布
  • 存储分层SSD+HDD+对象存储混合架构
  • Serverless分片:按需自动扩缩容

http://www.ppmy.cn/server/172179.html

相关文章

mongodb副本集1主2从节点的配置方法示例

配置 MongoDB 副本集&#xff08;1 主节点 2 从节点&#xff09;的步骤如下&#xff1a; 环境准备 3 台服务器&#xff0c;分别运行 MongoDB 实例。确保服务器之间网络互通。安装 MongoDB&#xff08;版本需一致&#xff09;。 配置步骤 1. 修改 MongoDB 配置文件 在每个…

《白帽子讲 Web 安全》之移动 Web 安全

目录 摘要 一、WebView 简介 二、WebView 对外暴露 WebView 对外暴露的接口风险 三、通用型 XSS - Universal XSS 介绍 四、WebView 跨域访问 五、与本地代码交互 js 5.1接口暴露风险&#xff1a; 5.2漏洞利用&#xff1a; 5.3JavaScript 与 Native 代码通信 六、Chr…

1688代采系统:自动化采购的高效解决方案

在跨境电商迅猛发展的今天&#xff0c;海外买家和跨境电商卖家面临着商品采购的诸多挑战&#xff0c;如语言障碍、支付不便、物流复杂等问题。为应对这些挑战&#xff0c;1688代采系统应运而生&#xff0c;它对接了1688官方API&#xff0c;实现了自动采集商品数据、自动代采下单…

在android studio上使用rknn模块下面的yolov8_pose模型

我的第一想法就是直接把rk的demo当成so库封装来用,我直接在yolov8_pose的c代码下面添加yolov8_pose.cc与yolov8_pose.h用作封装,先上代码 yolov8_pose.cc #include "yolov8_pose.h"#include <stdint.h> #include <stdio.h> #include <stdlib.h> #…

Linux | Ubuntu 与 Windows 双系统安装 / 高频故障 / UEFI 安全引导禁用

注&#xff1a;本文为 “buntu 与 Windows 双系统及高频故障解决” 相关文章合辑。 英文引文&#xff0c;机翻未校。 How to install Ubuntu 20.04 and dual boot alongside Windows 10 如何将 Ubuntu 20.04 和双启动与 Windows 10 一起安装 Dave’s RoboShack Published in…

2025 GDC开发者先锋大会“人形机器人的开源之路”分论坛 | 圆桌会议:《开放协作:开源生态如何解锁人形机器人与具身智能的未来》(上篇)

在GDC全球开发者先锋大会期间&#xff0c;2月23日&#xff0c;由GDC组委会指导、国家地方共建人形机器人创新中心&#xff08;以下简称“国地中心”&#xff09;承办的“人形机器人的开源之路”主题论坛在上海西岸艺术中心成功举办。 在人工智能与机器人技术飞速发展的今天&…

C# 牵手DeepSeek:打造本地AI超能力

一、引言 在人工智能飞速发展的当下&#xff0c;大语言模型如 DeepSeek 正掀起新一轮的技术变革浪潮&#xff0c;为自然语言处理领域带来了诸多创新应用。随着数据隐私和安全意识的提升&#xff0c;以及对模型部署灵活性的追求&#xff0c;本地部署 DeepSeek 成为众多开发者和…

TCP传输过程中问题的检测和解决

TCP传输过程中问题的检测 在 Windows 和 Linux 系统中&#xff0c;可以通过以下方法检测 TCP 链接是否出现问题&#xff1a; Windows 系统 使用命令行工具&#xff1a; ping 命令&#xff1a;可初步排查网络问题。通过向目标主机发送 ICMP Echo 请求并接收响应&#xff0c;来…