第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
访问测试:
创建角色管理:
⚠️ 安全配置注意事项
安全配置要求:
- 🔐 证书管理:妥善保管 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 系列
🎯 适用场景:企业级生产环境高级功能配置