Centos部署Es集群实战指南
在当今数据驱动的时代,对海量数据进行快速检索、实时分析和高效管理已成为企业成功的基石。Elasticsearch (ES) 作为一款高度可扩展的开源全文搜索和分析引擎,凭借其卓越的分布式特性、RESTful API 以及对多种数据类型的支持,使您能够轻松实现对PB级数据的实时存储、搜索和分析。它广泛应用于日志与事件数据分析、实时应用监控、全文搜索、业务智能(BI)等多种场景,是现代后端架构中不可或缺的一环。
本教程将作为您的向导,一步步带领您在Linux环境下部署一个基础但功能完备的Elasticsearch集群(以7.6.2版本为例)。我们将深入探讨从环境准备、软件下载安装,到核心配置文件(如jvm.options
和elasticsearch.yml
)的精细调校,再到集群的启动、验证及状态监控。此外,我们还将涵盖Kibana的可视化部署以及IK中文分词器的集成,为您提供一个端到端的解决方案。
无论您是初探Elasticsearch的新手,还是寻求优化现有部署的有经验的开发者或系统管理员,本教程都将为您提供实用且深入的指导,助您构建稳定、高效的Elasticsearch集群,以满足您的企业级或个人项目需求。
让我们开始构建您的专属Elasticsearch集群之旅!
环境准备
一个稳定高效的Elasticsearch集群离不开精心准备的运行环境。以下是部署前务必完成的基础环境配置:
- 关闭防火墙:Firewalld防火墙常用命令手册
- 创建普通用户:CentOS系统用户管理入门指南
- 时钟同步:CentOS7与RockyLinux系统时间同步指南
- 配置免密登录:Linux多台服务器之间免密登录
- 关闭SELinux、关闭Swap分区、调整文件句柄数和进程数限制、调整虚拟内存区域限制:优化Centos关闭SELinux/Swap及资源限制调整
- 配置
xsync
、xcall
同步脚本:Linux编写xcall命令执行与xsync文件同步脚本 - 配置JDK 8环境:Linux安装Jdk8
重要提示:环境准备是集群稳定运行的基石,请务必仔细按照参考博文完成每一项配置。
集群规划
清晰的集群规划有助于后续的部署与维护。
操作约定:
- 除特别说明外,本文所有操作均在主操作节点
node-1
上、使用非root
用户lbs
执行。 - 命令中出现的IP地址(
10.0.0.X
),必须替换为您自己集群中节点的实际IP地址。 - 命令中出现的路径
/home/lbs/software
,可根据您的实际情况替换为自定义路径,但需确保后续所有相关路径一致。
节点规划示例:
节点名称 (Node Name) | IP 地址 | 角色说明 |
---|---|---|
node-1 |
10.0.0.87 |
Master-eligible, Data, Ingest |
node-2 |
10.0.0.81 |
Master-eligible, Data, Ingest |
node-3 |
10.0.0.82 |
Master-eligible, Data, Ingest |
Для生产环境,建议至少3个Master-eligible节点以保证高可用性。节点角色可以根据需求精细配置。
Elasticsearch 安装与配置
下载与解压
在 node-1
节点上执行以下操作:
1 | # 创建软件存放目录 (如果尚不存在) |
配置JVM参数 (jvm.options
)
Elasticsearch的性能与JVM堆内存大小密切相关。
编辑 jvm.options
文件:
1 | vim /home/lbs/software/elasticsearch/config/jvm.options |
修改JVM初始堆大小 (-Xms
) 和最大堆大小 (-Xmx
)。建议将两者设置为相同的值,以避免运行时JVM堆调整带来的性能开销。
根据服务器可用内存进行配置,但不应超过物理内存的50%,且最大不超过30-31GB(具体取决于JVM是否开启指针压缩)。
1 | # 修改内容如下(示例为4GB,默认值为1g,根据服务器资源设置即可): |
注意:Elasticsearch 7.x自带了JDK,但如果系统中配置了
JAVA_HOME
,ES会优先使用系统JDK。确保您使用的JDK与ES版本兼容。此版本(7.6.2)自带的JDK是Java 13,但它也支持您系统已安装的Java 8 或 Java 11。
配置ES核心参数 (elasticsearch.yml
)
这是Elasticsearch的核心配置文件,决定了集群的行为。
编辑 /home/lbs/software/elasticsearch/config/elasticsearch.yml
文件:
1 | vim /home/lbs/software/elasticsearch/config/elasticsearch.yml |
根据以下说明修改或添加配置项:
1 | # 集群名称,同一集群下所有节点的此名称必须一致。 |
配置解读:
cluster.name
: 逻辑上组织节点的关键。node.name
: 节点的唯一标识符。path.data
&path.logs
: 分离数据和日志,便于管理和备份。network.host
: 控制ES服务的可访问性。0.0.0.0
表示监听所有可用网络接口。http.port
: RESTful API 端口。discovery.seed_hosts
: 节点如何找到彼此形成集群。cluster.initial_master_nodes
: 帮助集群在首次启动时安全地选举出第一个主节点。此配置仅在集群首次形成时使用,一旦集群形成,后续添加或重启节点时应将其注释掉或忽略,或者确保其列表与实际主节点候选者一致。 对于本教程,保持即可。
创建数据与日志目录
根据elasticsearch.yml
中的配置,在 node-1
上创建相应的目录:
1 | mkdir -p /home/lbs/software/elasticsearch/data |
确保lbs
用户对这些目录有读写权限。
分发到集群其他节点
使用之前配置的xsync
脚本,将整个elasticsearch
安装目录从node-1
分发到node-2
和node-3
:
1 | # 确保xsync脚本在$PATH中,或者使用其绝对路径 |
此命令会将
/home/lbs/software/elasticsearch
目录完整地复制到node-2
和node-3
上的相同路径。
配置各节点特定参数
分别登录到 node-2
和 node-3
,修改各自的 elasticsearch.yml
文件。唯一需要修改的是 node.name
。
在 node-2
上:
1 | ssh lbs@10.0.0.81 # 替换为node-2的IP和lbs用户名 |
修改 node.name
为:
1 | node.name: node-2 |
保存并退出。
在 node-3
上:
1 | ssh lbs@10.0.0.82 # 替换为node-3的IP和lbs用户名 |
修改 node.name
为:
1 | node.name: node-3 |
保存并退出。
所有其他配置(如
cluster.name
,discovery.seed_hosts
,cluster.initial_master_nodes
等)在所有节点上应保持一致。
集群管理脚本
为了方便地启停和查看集群中所有ES节点的状态,我们在 node-1
上创建一个管理脚本。
1 | # 在 node-1 上执行 |
脚本改进说明:
- 使用 PID 文件 (
-p $ES_HOME/es.pid
) 进行更精确的进程管理。- 启动时检查是否已运行。
- 停止时首先尝试优雅关闭 (SIGTERM),超时后才使用 SIGKILL。
- 状态检查优先使用 PID 文件,失败则尝试通过进程名查找。
- 确保远程执行命令时加载了用户的环境变量 (
source /etc/profile; source ~/.bash_profile;
)。- 增加了
restart
命令。NODES
和ES_USER
变量方便修改。
集群启停与验证
启动集群
在 node-1
上执行启动脚本:
1 | /home/lbs/software/elasticsearch/bin/elasticsearch-cluster.sh start |
Java版本提示:您可能会看到类似
future versions of Elasticsearch will require Java 11; your Java version from [/home/lbs/software/jdk/jre] does not meet this requirement
的提示(如果使用JDK 8)。对于ES 7.6.2,JDK 8是支持的,此提示可暂时忽略,不影响当前版本使用。但计划未来升级时,需要注意JDK版本的兼容性。
启动后,请耐心等待几十秒到一两分钟,以便各节点启动完成并组成集群。
停止集群
在 node-1
上执行停止脚本:
1 | /home/lbs/software/elasticsearch/bin/elasticsearch-cluster.sh stop |
集群健康检查与验证
查看各节点日志 (在每个节点上或通过
xcall
在node-1
上统一执行):
重点关注日志末尾部分,检查是否有错误信息(ERROR
)、异常堆栈(Exception
)或启动失败的指示。1
2
3
4
5# 在任一节点上执行 (或使用 xcall 批量查看)
tail -fn 200 /home/lbs/software/elasticsearch/logs/my-es-application.log # 注意日志文件名是基于cluster.name
# 例如在 node-1 上使用 xcall:
# xcall "tail -n 100 /home/lbs/software/elasticsearch/logs/my-es-application.log"通过REST API检查节点信息 (可在任一节点或有权限访问ES HTTP端口的机器上执行):
1
2
3curl -X GET "http://10.0.0.87:9200"
curl -X GET "http://10.0.0.81:9200"
curl -X GET "http://10.0.0.82:9200"如果成功,将返回类似以下格式的JSON响应,包含节点和集群信息:
1
2
3
4
5
6
7{
"name" : "node-1",
"cluster_name" : "my-es-application",
"cluster_uuid" : "some_uuid",
"version" : { ... },
"tagline" : "You Know, for Search"
}查看集群健康状态:
1
2# 在 node-1 (master) 或任一节点上执行:
curl -X GET "http://10.0.0.87:9200/_cluster/health?pretty"预期输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17{
"cluster_name" : "my-es-application",
"status" : "green", оптимально "green"
"timed_out" : false,
"number_of_nodes" : 3, // 节点数量
"number_of_data_nodes" : 3, // 数据节点数量
"active_primary_shards" : 0, // 初始状态无索引则为0
"active_shards" : 0, // 初始状态无索引则为0
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}集群状态解读:
green
: 所有主分片和副本分片都已成功分配。集群健康。yellow
: 所有主分片已分配,但至少有一个副本分片未分配。集群功能正常,但数据冗余性不足。red
: 至少有一个主分片(及其所有副本)未分配。集群部分功能不可用,可能存在数据丢失风险。初始空集群状态为
green
是正常的。
查看集群节点列表及角色:
1
2# 在 node-1 (master) 或任一节点上执行:
curl -X GET "http://10.0.0.87:9200/_cat/nodes?v&pretty"预期输出 (列名和顺序可能略有差异,IP和name会根据您的配置变化):
1
2
3
4ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.0.0.82 9 58 0 0.29 0.22 0.17 dilm - node-3
10.0.0.81 10 58 0 0.02 0.11 0.16 dilm - node-2
10.0.0.87 13 64 0 0.19 0.28 0.30 dilm * node-1*
表示当前的主节点 (master)。node.role
中的d
=data,i
=ingest,l
=machine learning(若启用),m
=master-eligible。
Kibana 安装与配置
Kibana 是 Elasticsearch 的官方可视化工具,提供数据探索、仪表盘、管理等功能。我们将其安装在 node-1
节点上。
下载与解压 (Kibana)
在 node-1
上执行:
1 | cd /home/lbs/software # 进入软件存放目录 |
配置Kibana (kibana.yml
)
编辑 Kibana 配置文件:
1 | vim /home/lbs/software/kibana/config/kibana.yml |
修改或添加以下配置:
1 | # Kibana服务端口号 |
Kibana管理脚本
在 node-1
上为Kibana创建一个简单的管理脚本:
1 | # 在 node-1 上执行 |
Kibana脚本说明:
pgrep
用于查找Kibana的Node.js进程。Kibana是用Node.js编写的。- 启动时nohup后台运行,并将日志输出到
logs/kibana-YYYY-MM-DD.log
。- 停止时先尝试优雅关闭,失败则强制关闭。
启动与访问Kibana
启动Kibana (在
node-1
上):1
/home/lbs/software/kibana/bin/kibana-manage.sh start
查看Kibana状态 (在
node-1
上):1
2
3/home/lbs/software/kibana/bin/kibana-manage.sh status
# 查看日志
tail -f /home/lbs/software/kibana/logs/kibana-$(date +%Y-%m-%d).log当日志中出现类似
{"type":"log","@timestamp":"...","tags":["listening","info"],"pid":...,"message":"Server running at http://0.0.0.0:5601"}
的信息时,表示Kibana已成功启动并连接到Elasticsearch。浏览器访问Kibana:
打开浏览器,访问http://10.0.0.87:5601
(将IP替换为node-1
的实际IP,或您配置了server.host
的任何可访问IP)。
您应该能看到Kibana的欢迎界面。
(示例图片,实际界面可能因版本略有不同)停止Kibana (可选,在
node-1
上):1
/home/lbs/software/kibana/bin/kibana-manage.sh stop
IK中文分词器安装与验证
对于中文内容搜索,默认的Standard Analyzer分词效果不佳。IK Analyzer是一款广泛使用的Elasticsearch中文分词插件。
下载与安装 (IK)
下载IK分词器 (版本需与Elasticsearch版本完全对应,此处为7.6.2):
访问IK GitHub Releases页面: https://github.com/infinilabs/analysis-ik/releases
找到elasticsearch-analysis-ik-7.6.2.zip
并下载。1
2
3# 在 node-1 上执行
cd /home/lbs/software # 或其他临时下载目录
wget https://github.com/infinilabs/analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip在每个Elasticsearch节点上安装IK插件:
IK分词器插件需要在集群中的每一个Elasticsearch节点上安装。在
node-1
上操作:1
2
3
4
5# 创建IK插件目录 (如果用elasticsearch-plugin工具安装则会自动创建,手动解压需先创建)
mkdir -p /home/lbs/software/elasticsearch/plugins/ik
# 解压到ik目录
unzip elasticsearch-analysis-ik-7.6.2.zip -d /home/lbs/software/elasticsearch/plugins/ik分发到其他节点 (或在每个节点重复下载解压步骤):
如果您的xsync
配置正确,可以在node-1
上执行(确保plugins/ik
目录已创建并在elasticsearch
主目录下):1
2
3
4# (1) 确保node-2, node-3上 /home/lbs/software/elasticsearch/plugins/ 目录存在
xcall "mkdir -p /home/lbs/software/elasticsearch/plugins/"
# (2) 分发ik插件目录
xsync /home/lbs/software/elasticsearch/plugins/ik或者,分别登录
node-2
和node-3
,重复下载和解压IK分词器的步骤,确保路径为各自节点的/home/lbs/software/elasticsearch/plugins/ik
。另一种安装方式 (推荐): Elasticsearch提供了
elasticsearch-plugin
工具来管理插件。1
2
3
4# 在每个ES节点上执行 (替换为zip包的URL或本地文件路径)
# sudo -u lbs /home/lbs/software/elasticsearch/bin/elasticsearch-plugin install file:///path/to/elasticsearch-analysis-ik-7.6.2.zip
# 或直接从URL安装 (需要节点联网)
# sudo -u lbs /home/lbs/software/elasticsearch/bin/elasticsearch-plugin install https://github.com/infinilabs/analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip使用
elasticsearch-plugin
工具可以更好地处理权限和路径问题。这里我们沿用原文的手动解压方式。
重启ES集群使分词器生效
安装(或卸载)插件后,必须重启Elasticsearch集群中的所有节点。
1 | # 在 node-1 上执行 |
等待集群重启完成,并再次通过 _cluster/health
确认集群状态为 green
。
验证分词效果
通过Kibana的Dev Tools (开发工具) 或 curl
命令来测试IK分词器的效果。
打开Kibana -> Dev Tools,执行以下命令:
智能分词 (
ik_smart
): 它会做最粗粒度的拆分。1
2
3
4
5GET /_analyze
{
"text": "中华人民共和国国歌",
"analyzer": "ik_smart"
}预期结果 (tokens可能略有不同):
1
2
3
4
5
6{
"tokens" : [
{ "token" : "中华人民共和国", "start_offset" : 0, "end_offset" : 7, "type" : "CN_WORD", "position" : 0 },
{ "token" : "国歌", "start_offset" : 7, "end_offset" : 9, "type" : "CN_WORD", "position" : 1 }
]
}最细粒度分词 (
ik_max_word
): 它会将文本做最细粒度的拆分,适合搜索。1
2
3
4
5GET /_analyze
{
"text": "中华人民共和国国歌",
"analyzer": "ik_max_word"
}预期结果 (tokens可能略有不同):
1
2
3
4
5
6
7
8
9
10{
"tokens" : [
{ "token" : "中华人民共和国", "start_offset" : 0, "end_offset" : 7, "type" : "CN_WORD", "position" : 0 },
{ "token" : "中华人民", "start_offset" : 0, "end_offset" : 4, "type" : "CN_WORD", "position" : 1 },
{ "token" : "中华", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 2 },
{ "token" : "华人", "start_offset" : 1, "end_offset" : 3, "type" : "CN_WORD", "position" : 3 },
// ... 更多细分的词 ...
{ "token" : "国歌", "start_offset" : 7, "end_offset" : 9, "type" : "CN_WORD", "position" : 10 } // position可能变化
]
}
如果能看到类似上述的分词结果,则表明IK分词器已成功安装并工作。
重要注意事项与优化建议
安全性:
- 网络层面:切勿将Elasticsearch的9200/9300端口直接暴露于公网,除非有严格的防火墙规则和安全措施。使用VPC、安全组或防火墙限制访问来源。
- X-Pack Security:对于生产环境,强烈建议启用Elasticsearch的X-Pack安全特性(7.x版本中基础版免费),配置用户认证、授权 (RBAC)、HTTPS加密通信 (TLS/SSL) 等。
- Kibana安全:同样为Kibana配置HTTPS,并考虑启用登录认证。
资源调优:
- JVM堆内存:
jvm.options
中的-Xms
和-Xmx
设置至关重要。监控JVM堆使用情况,避免OOM。 - 文件句柄:确保
ulimit -n
(打开文件数)足够大(如65536或更高)。 - mmap计数:如日志中提示
max virtual memory areas vm.max_map_count [xxxxx] is too low, increase to at least [262144]
,则需调整/etc/sysctl.conf
中的vm.max_map_count
。 - 磁盘:使用高性能磁盘 (SSD优先),监控磁盘I/O和可用空间。Elasticsearch对磁盘性能敏感。
- JVM堆内存:
数据备份与恢复:
- 定期使用Snapshot API进行数据备份到共享文件系统 (NFS) 或对象存储 (S3, OSS等)。制定并测试恢复策略。
监控:
- 使用Kibana自带的Stack Monitoring功能监控集群健康、性能指标、资源使用情况。
- 可集成Prometheus、Grafana等第三方监控系统进行更全面的监控和告警。
集群规模与分片设计:
- 根据数据量、写入/查询并发量合理规划节点数量和硬件配置。
- 索引的分片数 (number_of_shards) 一旦设定后通常不可更改 (除非reindex)。副本数 (number_of_replicas) 可动态调整。合理设计分片策略对性能和扩展性至关重要。
升级:
- 关注Elastic官方的发布和升级指南。小版本升级通常较平滑,大版本升级需仔细规划和测试。
日志管理:
- 定期检查ES和Kibana的日志,及时发现和处理问题。
- 配置日志滚动策略,避免日志文件过大。
总结
恭喜您!通过本教程,您已经成功部署了一个包含3个节点的Elasticsearch 7.6.2集群,并配置了Kibana作为可视化管理工具,以及IK中文分词器以支持中文搜索。您还掌握了集群的基本管理(启停、状态检查)和验证方法。
这仅仅是Elasticsearch强大功能的冰山一角。作为一名后端开发者,您现在可以基于这个集群,进一步探索索引创建、数据导入、复杂查询、聚合分析、以及与Spring Boot等后端框架的集成。将Elasticsearch应用于日志分析、应用性能监控(APM)、全文搜索等场景,无疑将极大提升您的Web应用能力和用户体验。
请记住,持续学习和实践是精通任何技术的关键。建议您深入阅读Elasticsearch官方文档,并根据您的实际需求不断优化和调整集群配置。
祝您在Elasticsearch的探索之旅中一切顺利!
Centos部署Es集群实战指南