Elasticsearch

基础概念

ES 数据模型与关系型数据库差异显著,核心概念对应关系如下:

索引:类似 RDBMS 的 “数据库”,是结构相似文档的集合,索引名需小写,内部拆分为多个分片实现分布式存储。

文档:类似 RDBMS 的 “行”,是 ES 最小数据单元,每个文档有唯一 _id,包含多个字段。

字段:类似 RDBMS 的 “列”,需定义类型,字段规则通过 “映射” 管理。

分片:ES 分布式存储的核心,将索引拆分为多个独立 Lucene 索引:

        主分片:创建索引时指定数量,负责数据写入;

        副本分片:主分片的备份,负责读请求与故障恢复,需分配在与主分片不同的节点上。

节点:组成 ES 集群的单个服务器实例,按职责分为主节点、数据节点、协调节点等。

分布式架构

节点职责与部署建议

主节点:负责集群元数据管理、节点状态监控,不处理数据请求。建议部署 3 个主节点,需高稳定性,对硬件要求低。配置参数:node.master: truenode.data: false

数据节点:存储分片、处理数据读写与聚合分析,是性能核心。需高 CPU、高内存、SSD 磁盘,根据数据量横向扩展。配置参数:node.data: truenode.master: false

协调节点:接收客户端请求,分发到数据节点,聚合查询结果后返回。高并发场景建议单独部署,避免占用数据节点资源。配置参数:node.master: falsenode.data: false

分片机制与集群稳定性

分片分配:如索引 product 设 3 个主分片、1 个副本,3 个数据节点会均匀分配,确保单点故障不丢数据。

脑裂防护:配置 discovery.zen.minimum_master_nodes: 确保新主节点选举需多数节点同意;通过心跳检测及时识别故障。

特性

全文检索:基于 Lucene 倒排索引,支持中文分词、模糊查询,适用于电商搜索、文档检索。

近实时:数据写入后默认 1 秒可查询,适用于实时日志分析、社交动态检索。

分布式聚合:支持分组、统计、时间分组,可并行计算,适用于日志指标统计、销售分析。

实战配置

 核心环境配置

cluster.name: es-prod-cluster  # 集群名(所有节点一致)
node.name: data-node-1         # 节点名(唯一)
node.roles: [data, ingest]     # 角色:数据节点+预处理节点
network.host: 0.0.0.0          # 监听所有网卡(生产指定内网IP)
http.port: 9200                # 客户端访问端口
transport.port: 9300           # 节点间通信端口

# 主节点发现(种子节点列表)
discovery.seed_hosts: ["192.168.1.101:9300", "192.168.1.102:9300"]
cluster.initial_master_nodes: ["master-node-1", "master-node-2"]

# 性能优化
index.refresh_interval: 5s     # 日志场景可设30s(减少刷盘频率,提升写入性能)
indices.memory.index_buffer_size: 15%  # 索引缓冲区占堆内存比例

索引创建与查询示例

 创建商品索引

# PUT http://192.168.1.101:9200/product
{
  "settings": {
    "number_of_shards": 3,      # 主分片3个(不可改)
    "number_of_replicas": 1,    # 副本1个(可动态改)
    "analysis": {               # 自定义IK分词器
      "analyzer": {"ik_max_word": {"type": "ik_max_word"}}
    }
  },
  "mappings": {
    "properties": {
      "product_id": {"type": "keyword"},  # 商品ID(精确匹配)
      "title": {                          # 商品标题(全文检索)
        "type": "text", "analyzer": "ik_max_word",
        "fields": {"keyword": {"type": "keyword"}}  # 子字段用于排序
      },
      "price": {"type": "double"},        # 价格(数值类型)
      "create_time": {"type": "date", "format": "yyyy-MM-dd HH:mm:ss"}
    }
  }
}

 全文检索与聚合分析

# GET http://192.168.1.101:9200/product/_search
{
  "query": {
    "match": {"title": "iPhone 黑色"}  # 搜索“iPhone 黑色”商品
  },
  "sort": [{"price": {"order": "desc"}}],  # 按价格降序
  "aggs": {                             # 按分类统计平均价格
    "category_avg_price": {
      "terms": {"field": "category", "size": 10},
      "aggs": {"avg_price": {"avg": {"field": "price"}}}
    }
  }
}

与优化

关键优化点

分片规划:主分片数量根据数据量与节点数定,每个分片大小控制在 20-50GB;副本数量按需调整。

内存配置:JVM 堆内存设为物理内存的 50%,剩余内存留给 OS 缓存。

写入优化:用 Bulk API 批量写入,延长 refresh_interval避免单条写入; refresh_interval 过短会频繁刷盘,副本过多会增加同步开销,均会降低写入性能 。

安全加固:启用 xpack.security,创建只读 / 管理员用户;配置 HTTPS 加密,限制 network.host 为内网 IP,禁止公网直接访问。

 常见问题

集群变黄:副本分片未分配,可新增数据节点或减少副本数量。

查询缓慢:检查是否用 filter 过滤,避免深度分页,确保查询字段有合适索引。

总结

ES 是分布式全文检索的核心中间件,通过分片机制实现高可用与水平扩展,结合全文检索、实时分析能力,成为日志平台、电商搜索、监控系统的核心组件。生产环境需重点关注分片规划、内存配置与安全加固,平衡写入与查询性能,确保集群稳定运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值