跳到主要内容

第5章 Elasticsearch进阶

5.1 中文分词器配置

分词器重要性

Elasticsearch 默认分词器对中文支持不佳,会将中文词语拆分为单个汉字,影响搜索准确性。

未配置分词器的问题示例

# 插入测试数据
POST /news/_doc/1
{"content":"美国留给伊拉克的是个烂摊子吗"}

# 搜索"中国"时,会被拆分为"中"和"国"两个字符搜索
POST /news/_search
{
"query": { "match": { "content": "中国" }}
}

IK 分词器安装

在线安装方式

/usr/share/elasticsearch/bin/elasticsearch-plugin install \
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.1/elasticsearch-analysis-ik-7.9.1.zip

离线安装方式

# 下载插件包到本地
/usr/share/elasticsearch/bin/elasticsearch-plugin install \
file:///opt/elasticsearch-analysis-ik-7.9.1.zip
⚠️ 分词器安装要求

重要注意事项

  • 🔗 版本对应:分词器版本必须与 ES 版本完全一致
  • 🌐 集群同步:所有节点都必须安装相同版本的分词器
  • 🔄 重启生效:安装后必须重启所有 ES 节点才能生效
  • 📋 兼容性检查:安装前确认插件与 ES 版本兼容性

分词器配置使用

创建支持中文分词的索引

# 创建索引映射
PUT /news_cn
{
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}
}

# 插入测试数据
POST /news_cn/_doc/1
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击"}

# 验证分词效果
POST /news_cn/_search
{
"query": { "match": { "content": "中国" }},
"highlight": {
"fields": { "content": {} }
}
}
💡 分词器类型说明

IK 分词器模式

  • ik_max_word:细粒度分词,索引时使用,拆分出更多词汇
  • ik_smart:粗粒度分词,搜索时使用,减少噪音干扰
  • 建议索引用 max_word,搜索用 smart

热更新词典配置

配置远程词典服务

# 1. 安装 nginx 提供词典服务
yum install nginx -y

# 2. 创建自定义词典文件
cat > /usr/share/nginx/html/custom_dict.txt << EOF
北京
深圳
人工智能
大数据
云计算
EOF

# 3. 启动 nginx
systemctl restart nginx
curl localhost/custom_dict.txt

配置 IK 分词器使用远程词典

# 编辑配置文件
cat > /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>

<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict"></entry>

<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>

<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://服务器IP/custom_dict.txt</entry>
</properties>
EOF

# 复制配置到所有节点
scp /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml node2:/etc/elasticsearch/analysis-ik/
scp /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml node3:/etc/elasticsearch/analysis-ik/

# 重启所有 ES 节点
systemctl restart elasticsearch

5.2 数据备份恢复

快照备份机制

Elasticsearch 提供基于快照的备份恢复功能,支持增量备份和跨集群恢复。

备份环境准备

🚨 集群备份前置要求

共享存储配置

  • 🗄️ 共享目录:集群备份必须使用所有节点都能访问的共享存储
  • 🔗 NFS 配置:推荐使用 NFS 作为共享存储解决方案
  • 👤 权限设置:确保 elasticsearch 用户对备份目录有读写权限
  • 🔄 一致性保证:所有节点必须挂载相同的备份目录

NFS 共享存储配置

# NFS 服务端配置
yum install nfs-utils -y
mkdir /data/backup -p
cat > /etc/exports << 'EOF'
/data/backup 10.0.0.0/24(rw,sync,all_squash,anonuid=997,anongid=995)
EOF
systemctl restart nfs

# NFS 客户端配置(所有 ES 节点)
yum install nfs-utils -y
mkdir /data/backup -p
mount -t nfs 10.0.0.51:/data/backup /data/backup
chown -R elasticsearch:elasticsearch /data/backup

备份配置

修改 ES 配置启用备份

# 在所有节点的 elasticsearch.yml 中添加
echo 'path.repo: ["/data/backup"]' >> /etc/elasticsearch/elasticsearch.yml

# 重启所有节点
systemctl restart elasticsearch

创建备份仓库

PUT _snapshot/backup_repository
{
"type": "fs",
"settings": {
"location": "/data/backup",
"compress": true
}
}

执行备份操作

创建快照备份

# 备份所有索引
PUT _snapshot/backup_repository/snapshot_all_$(date +%Y%m%d)
{
"indices": "*",
"ignore_unavailable": true,
"include_global_state": false
}

# 备份指定索引
PUT _snapshot/backup_repository/snapshot_logs_$(date +%Y%m%d)
{
"indices": "logs-*",
"ignore_unavailable": true
}

查看备份状态

# 查看备份进度
GET _snapshot/backup_repository/snapshot_all_20250126/_status

# 查看所有快照
GET _snapshot/backup_repository/_all

数据恢复操作

# 恢复整个快照
POST _snapshot/backup_repository/snapshot_all_20250126/_restore

# 恢复指定索引
POST _snapshot/backup_repository/snapshot_logs_20250126/_restore
{
"indices": "logs-2025-01-*",
"rename_pattern": "logs-(.+)",
"rename_replacement": "restored-logs-$1"
}

5.3 安全认证配置

X-Pack 安全功能

Elasticsearch 提供 X-Pack 安全组件,支持 SSL/TLS 加密和用户认证。

证书生成配置

# 生成 CA 证书
/usr/share/elasticsearch/bin/elasticsearch-certutil ca

# 生成节点证书
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

# 复制证书到配置目录
mkdir /etc/elasticsearch/certs
cp /usr/share/elasticsearch/*.p12 /etc/elasticsearch/certs/
chown -R elasticsearch:elasticsearch /etc/elasticsearch/certs/

# 分发证书到所有节点
scp -r /etc/elasticsearch/certs node2:/etc/elasticsearch/
scp -r /etc/elasticsearch/certs node3:/etc/elasticsearch/

安全配置启用

修改 elasticsearch.yml 启用安全功能

# 启用安全功能
xpack.security.enabled: true

# 启用传输层加密
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-stack-ca.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-stack-ca.p12

# 启用 HTTP 层加密(可选)
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: certs/elastic-stack-ca.p12

设置用户密码

# 重启集群后设置密码
systemctl restart elasticsearch

# 设置内置用户密码
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive

访问测试

image-20201218114653139.png

创建角色管理

image-20210713173335826.png

image-20210713173442732.png

image-20210713173543381.png

image-20210713173716844.png

image-20210713173745017.png

image-20210713173810005.png

image-20210713173846626.png

image-20210713173910749.png

image-20210713173926356.png

image-20210713173945088.png

image-20210713173956555.png

image-20210713174013798.png

⚠️ 安全配置注意事项

安全配置要求

  • 🔐 证书管理:妥善保管 CA 证书和私钥文件
  • 🔄 集群同步:所有节点必须使用相同的证书配置
  • 💾 密码安全:使用强密码并定期更换
  • 🌐 网络隔离:生产环境建议配置网络访问控制

5.4 性能优化配置

系统级优化

内核参数优化

# 设置虚拟内存参数
echo 'vm.max_map_count=262144' >> /etc/sysctl.conf
sysctl -p

# 关闭 swap 分区
swapoff -a
sed -i '/swap/d' /etc/fstab

文件描述符限制

# 设置文件句柄限制
cat >> /etc/security/limits.conf << EOF
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
elasticsearch soft nproc 4096
elasticsearch hard nproc 4096
EOF

ES 配置优化

JVM 内存配置

# 编辑 JVM 配置文件
vim /etc/elasticsearch/jvm.options

# 设置堆内存(不超过系统内存的50%,且不超过32GB)
-Xms16g
-Xmx16g

索引性能优化

# 优化索引设置
PUT _template/performance_template
{
"index_patterns": ["logs-*"],
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "30s",
"translog.flush_threshold_size": "512mb"
}
}
💡 性能优化建议

关键优化要点

  • 💾 内存配置:JVM 堆内存设置为系统内存的50%,但不超过32GB
  • 🗄️ 存储优化:使用 SSD 硬盘提升 I/O 性能
  • 📊 分片规划:合理设置分片数量,避免过多小分片
  • 🔄 刷新频率:根据业务需求调整 refresh_interval
  • 🎯 专机专用:避免与其他应用争抢 CPU 和磁盘资源

5.5 索引生命周期管理

ILM 概述

索引生命周期管理(ILM)可以自动化管理索引的整个生命周期,包括滚动、删除等操作。

ILM 阶段说明

索引生命周期分为四个阶段:

阶段说明典型操作
Hot频繁写入和查询Rollover 滚动更新
Warm不再写入,仍被查询减少副本数,迁移到慢存储
Cold很少查询冻结索引,压缩存储
Delete不再需要删除索引

ILM 策略配置

创建 ILM 策略

PUT _ilm/policy/logs_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_age": "30d",
"max_docs": 100000000
}
}
},
"warm": {
"min_age": "31d",
"actions": {
"allocate": {
"number_of_replicas": 0
}
}
},
"cold": {
"min_age": "90d",
"actions": {
"freeze": {}
}
},
"delete": {
"min_age": "365d",
"actions": {
"delete": {}
}
}
}
}
}

应用 ILM 策略

# 创建索引模板应用 ILM 策略
PUT _template/logs_template
{
"index_patterns": ["logs-*"],
"settings": {
"index.lifecycle.name": "logs_policy",
"index.lifecycle.rollover_alias": "logs"
}
}

# 创建初始索引
PUT logs-000001
{
"aliases": {
"logs": {
"is_write_index": true
}
}
}
💡 ILM 最佳实践

策略设计建议

  • 时间规划:根据业务需求合理设置各阶段时间
  • 💾 存储优化:及时删除过期数据节省存储空间
  • 📊 性能平衡:warm 阶段减少副本数提升写入性能
  • 🔍 监控告警:监控 ILM 执行状态,及时处理异常

5.6 监控与告警

性能监控指标

关键监控指标

# 集群健康状态
GET _cluster/health

# 节点性能统计
GET _nodes/stats

# 索引性能指标
GET _cat/indices?v&s=store.size:desc

# JVM 内存使用
GET _nodes/stats/jvm

告警脚本示例

#!/bin/bash
# ES 性能监控脚本

ES_HOST="localhost:9200"
LOG_FILE="/var/log/es_monitor.log"

# 检查集群健康状态
check_cluster_health() {
status=$(curl -s "$ES_HOST/_cluster/health" | jq -r '.status')
if [ "$status" != "green" ]; then
echo "$(date): 集群状态异常: $status" >> $LOG_FILE
# 发送告警
fi
}

# 检查 JVM 内存使用率
check_jvm_memory() {
memory_percent=$(curl -s "$ES_HOST/_nodes/stats/jvm" | jq '.nodes[].jvm.mem.heap_used_percent')
if [ "$memory_percent" -gt 80 ]; then
echo "$(date): JVM 内存使用率过高: ${memory_percent}%" >> $LOG_FILE
# 发送告警
fi
}

check_cluster_health
check_jvm_memory

5.7 小结

本章学习了 Elasticsearch 的高级企业级功能:

  • 中文分词器:IK 分词器安装配置和热更新词典
  • 数据备份:基于快照的备份恢复机制和共享存储配置
  • 安全认证:X-Pack 安全功能和 SSL/TLS 加密配置
  • 性能优化:系统级和应用级的全面性能优化
  • 生命周期管理:ILM 自动化索引管理策略
  • 监控告警:关键指标监控和自动化告警机制
📖 下节预告

下一章将通过实战案例展示 Elasticsearch 在电商搜索、日志分析等场景中的综合应用。


📝 文档更新时间:2025-01-26
🔄 版本信息:适用于 Elasticsearch 7.x-8.x 系列
🎯 适用场景:企业级生产环境高级功能配置