目录
1. Elasticsearch 详细介绍
Elasticsearch 是一个开源的 分布式搜索和分析引擎,基于 Apache Lucene 构建,专为处理大规模数据而设计,提供近实时的搜索和分析能力。它广泛应用于 全文检索、日志分析、业务指标监控、安全分析 等领域。
1.1 Elasticsearch 核心概念
(1)基本架构
概念 | 说明 |
---|---|
Node(节点) | 一个运行中的 Elasticsearch 实例(服务器)。 |
Cluster(集群) | 多个 Node 组成的分布式系统(默认集群名 elasticsearch )。 |
Index(索引) | 类似数据库的“表”,存储相关文档(如 products , logs )。 |
Document(文档) | 索引中的基本数据单元(JSON 格式,类似数据库的“行”)。 |
Shard(分片) | 索引可拆分为多个分片,支持水平扩展(默认 1 主分片 + 1 副本)。 |
Replica(副本) | 分片的副本,提供高可用和负载均衡。 |
(2)数据模型(与关系型数据库对比)
RDBMS | Elasticsearch |
---|---|
Database | Index |
Table | Index (Type 已废弃) |
Row | Document |
Column | Field |
Schema | Mapping |
SQL | Query DSL |
1.2 核心特性
(1)全文检索
支持 分词(Analyzer) 和 模糊搜索(如“Elastc”能匹配“Elasticsearch”)。
内置多种语言分析器(中文需插件如 IK Analyzer)。
(2)近实时(NRT)
数据写入后 1 秒内 可被搜索(相比传统数据库的 B-tree 索引更快)。
(3)分布式 & 高可用
数据自动分片(Sharding)和复制(Replication)。
节点故障时自动切换副本。
(4)强大的聚合分析
支持 统计(Metrics)、分组(Buckets)、嵌套聚合(类似 SQL 的
GROUP BY
+COUNT/SUM
)。
(5)RESTful API
所有操作通过 HTTP API 完成,如:
GET /products/_search { "query": { "match": { "name": "手机" } } }
1.3 典型应用场景
场景 | 说明 |
---|---|
搜索引擎 | 电商商品搜索、新闻全文检索。 |
日志分析(ELK) | 存储和分析 Logstash/Filebeat 收集的日志。 |
指标监控 | 结合 Metricbeat 监控服务器性能。 |
安全分析(SIEM) | 检测异常行为(如频繁登录失败)。 |
业务分析 | 用户行为分析、实时仪表盘(通过 Kibana)。 |
1.4 数据写入与查询流程
(1)写入流程
客户端发送文档到任意 Node。
Node 根据文档 ID 计算目标分片(默认
_id
哈希)。数据写入主分片后,同步到副本分片。
返回写入成功响应。
(2)搜索流程
客户端发送查询请求到 Node。
Node 作为协调节点,将查询广播到所有相关分片。
各分片返回结果,协调节点合并后返回客户端。
1.5 Elasticsearch 生态
Kibana:数据可视化和管理界面。
Logstash:数据采集和预处理。
Beats:轻量级数据采集器(如 Filebeat、Metricbeat)。
Elastic Stack(ELK):Elasticsearch + Logstash + Kibana 的完整日志解决方案。
1.6 性能优化要点
方向 | 优化手段 |
---|---|
硬件 | 使用 SSD、增加内存(Lucene 依赖文件缓存)。 |
索引设计 | 合理设置分片数(建议每个分片 10-50GB)。 |
查询优化 | 使用 filter 替代 query (利用缓存)、避免通配符查询。 |
集群调优 | 调整 JVM 堆大小(不超过物理内存的 50%)。 |
1.7 对比其他搜索引擎
特性 | Elasticsearch | Solr | OpenSearch |
---|---|---|---|
实时性 | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
分布式 | 原生支持 | 需手动配置 | 兼容 ES 生态 |
易用性 | 简单 | 较复杂 | 类似 ES |
适用场景 | 日志、分析 | 文本搜索 | AWS 替代 ES |
✅ 适用场景:
需要快速搜索和分析结构化/非结构化数据。
实时日志或指标监控(如 ELK 架构)。
❌ 不适用场景:
频繁更新的 OLTP 系统(传统数据库更合适)。
强一致性要求的场景(ES 是最终一致性)。
Elasticsearch 凭借其分布式架构和强大的搜索能力,已成为大数据和实时分析领域的核心工具之一。
2. 部署Elasticsearch
2.1 创建名字空间
kubectl create namespace elk
2.3 创建service
vim elasticsearch-service.yaml
--- apiVersion: v1 kind: Service metadata: name: elasticsearch-cluster #无头服务的名称,需要通过这个获取ip,与主机的对应关系 namespace: elk labels: app: elasticsearch spec: ports: - port: 9200 name: elasticsearch clusterIP: None selector: app: elasticsearch --- apiVersion: v1 kind: Service metadata: name: elasticsearch #service服务的名称,向外暴露端口 namespace: elk labels: app: elasticsearch spec: ports: - port: 9200 name: elasticsearch type: NodePort selector: app: elasticsearch
2.4 创建statefulset
vim elasticsearch-statefulset.yaml
--- apiVersion: apps/v1 kind: StatefulSet metadata: name: elasticsearch namespace: elk spec: serviceName: "elasticsearch-cluster" #填写无头服务的名称 replicas: 1 #实例数,最好为3 selector: matchLabels: app: elasticsearch template: metadata: labels: app: elasticsearch spec: containers: - name: elasticsearch image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/elasticsearch:7.17.3 imagePullPolicy: IfNotPresent resources: requests: memory: "500Mi" cpu: "500m" limits: memory: "1000Mi" cpu: "1000m" ports: - containerPort: 9200 name: elasticsearch env: - name: node.name valueFrom: fieldRef: fieldPath: metadata.name - name: discovery.type value: zen - name: cluster.name value: elasticsearch - name: cluster.initial_master_nodes value: "elasticsearch-0" - name: discovery.zen.minimum_master_nodes value: "1" - name: discovery.seed_hosts value: "elasticsearch-0.elasticsearch-cluster" - name: network.host value: "0.0.0.0" - name: "http.cors.allow-origin" value: "*" - name: "http.cors.enabled" value: "true" - name: "number_of_shards" #分片数 value: "5" - name: "number_of_replicas" #每个分片的副本数 value: "1" - name: path.data value: /usr/share/elasticsearch/data #数据存储路径 volumeMounts: - name: es-data mountPath: /usr/share/elasticsearch/data #挂载数据目录 initContainers: - name: fix-permissions image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/busybox:1.37.0 imagePullPolicy: IfNotPresent command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"] securityContext: privileged: true volumeMounts: - name: es-data mountPath: /usr/share/elasticsearch/data #挂载数据目录 - name: increase-vm-max-map image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/busybox:1.37.0 imagePullPolicy: IfNotPresent command: ["sysctl", "-w", "vm.max_map_count=262144"] securityContext: privileged: true - name: increase-fd-ulimit image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/busybox:1.37.0 imagePullPolicy: IfNotPresent command: ["sh", "-c", "ulimit -n 65536"] securityContext: privileged: true volumeClaimTemplates: #这步自动创建pvc,并挂载动态pv - metadata: name: es-data spec: accessModes: ["ReadWriteMany"] storageClassName: nfs-client #存储类名称 resources: requests: storage: 2Gi
2.5 部署所有资源
[root@master1 Elasticsearch]# ls elasticsearch-service.yaml elasticsearch-statefulset.yaml [root@master1 Elasticsearch]# kubectl apply -f ./ service/elasticsearch-cluster created service/elasticsearch created statefulset.apps/elasticsearch created
2.6 检查Pod 状态
[root@master1 Elasticsearch]# kubectl get pod -n elk NAME READY STATUS RESTARTS AGE elasticsearch-0 1/1 Running 0 45s filebeat-6db9l 1/1 Running 0 87m filebeat-qllxg 1/1 Running 0 87m filebeat-r5hw7 1/1 Running 0 87m kafka-0 1/1 Running 0 26m