基础概念
ES 数据模型与关系型数据库差异显著,核心概念对应关系如下:
索引:类似 RDBMS 的 “数据库”,是结构相似文档的集合,索引名需小写,内部拆分为多个分片实现分布式存储。
文档:类似 RDBMS 的 “行”,是 ES 最小数据单元,每个文档有唯一 _id,包含多个字段。
字段:类似 RDBMS 的 “列”,需定义类型,字段规则通过 “映射” 管理。
分片:ES 分布式存储的核心,将索引拆分为多个独立 Lucene 索引:
主分片:创建索引时指定数量,负责数据写入;
副本分片:主分片的备份,负责读请求与故障恢复,需分配在与主分片不同的节点上。
节点:组成 ES 集群的单个服务器实例,按职责分为主节点、数据节点、协调节点等。
分布式架构
节点职责与部署建议
主节点:负责集群元数据管理、节点状态监控,不处理数据请求。建议部署 3 个主节点,需高稳定性,对硬件要求低。配置参数:node.master: true、node.data: false。
数据节点:存储分片、处理数据读写与聚合分析,是性能核心。需高 CPU、高内存、SSD 磁盘,根据数据量横向扩展。配置参数:node.data: true、node.master: false。
协调节点:接收客户端请求,分发到数据节点,聚合查询结果后返回。高并发场景建议单独部署,避免占用数据节点资源。配置参数:node.master: false、node.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 是分布式全文检索的核心中间件,通过分片机制实现高可用与水平扩展,结合全文检索、实时分析能力,成为日志平台、电商搜索、监控系统的核心组件。生产环境需重点关注分片规划、内存配置与安全加固,平衡写入与查询性能,确保集群稳定运行。
2235

被折叠的 条评论
为什么被折叠?



