一、什么是 elasticsearch ?
Elasticsearch 是一个实时的全文搜索,存储库和分析引擎。是一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索搜索、支持分布式可实现高可用、提供 API 接口,可以处理大规模日志数据,比如 Nginx、Tomcat、系统日志等功能。Elasticsearch 使用 Java 语言开发,是建立在全文搜索引擎 Apache Lucene 基础之上的搜索引擎。
elasticsearch的主要优点:
功能强大:Elasticsearch是实时全文索引,具有强大的搜索功能
配置相对简单:Elasticsearch 全部基于 JSON,Logstash使用模块化配置,Kibana的配置都比较简单。
检索性能高效:基于优秀的设计,每次查询可以实时响应,即使百亿级数据的查询也能达到秒级响应。
集群线性扩展:Elasticsearch 和 Logstash都可以灵活线性扩展
前端操作方便:Kibana提供了比较美观UI前端,操作也比较简单
二、部署前的准备
1、安装包的下载
这里的使用的elasticsearch和kibana版本均为最新版 8.15.2,以及jdk-17的环境安装包
elasticsearch:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.15.2-linux-x86_64.tar.gz
kibana:https://artifacts.elastic.co/downloads/kibana/kibana-8.15.2-linux-x86_64.tar.gz
jdk-17安装包:https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
2、jdk环境部署
elasticsearch是一套基于Java语言的服务,需要部署对应的 jdk 运行环境
具体部署,在上一篇Kafka集群部署的时候已经讲过,有需要的可直接跳转
不依赖zookeeper的Kafka集群_kafka下载哪个版本-CSDN博客
3、调整系统参数
为什么要调整系统参数?
性能优化:内存映射是一种允许程序直接访问磁盘文件的技术,就像它们是内存中的数组一样。这可以提高 I/O 性能,因为操作系统可以直接从磁盘读取数据到进程的地址空间,而不需要通过传统的系统调用来复制数据。
减少内存使用:内存映射文件通常由操作系统进行管理,可以根据需要将页面加载到内存中或从内存中卸载,从而更有效地使用物理内存。
Elasticsearch 的具体需求
Elasticsearch 是一个分布式的搜索和分析引擎,它在处理索引时会广泛使用内存映射文件来存储和检索数据。以下是 Elasticsearch 需要较高 vm.max_map_count 值的原因:
索引文件:Elasticsearch 使用 Lucene 库来创建和管理索引。Lucene 将索引文件内存映射到 JVM 的地址空间中,以便快速访问。
多线程和多进程:Elasticsearch 可以配置为多个节点运行在一个主机上,每个节点可能会打开大量的内存映射文件。如果 vm.max_map_count 太低,可能会导致无法打开足够的内存映射文件,从而影响性能甚至导致服务失败。
JVM 和操作系统的限制:Java 虚拟机 (JVM) 和操作系统都有各自的限制。如果 vm.max_map_count 设置得太低,即使 JVM 有足够的堆内存,也可能由于达到最大内存映射数而无法正常工作。
默认值:Linux 系统的 vm.max_map_count 默认值通常是 65530。对于大多数普通用途的应用来说,这个值已经足够了。
Elasticsearch 的推荐值:Elasticsearch 官方文档建议将 vm.max_map_count 设置为至少 262144,这是因为 Elasticsearch 在高负载和大数据量的情况下,可能需要更多的内存映射文件来支持其操作。
(1)调整系统参数:
未修改前,直接启动ES集群,可能会出现下面的报错日志
vim /etc/sysctl.conf
vm.max_map_count=655300
fs.file-max=1000000
启动生效,确保系统重启后,修改仍然有效
sysctl -p
(2)可能需要的其他参数
elasticsearch服务可能需要调整一些系统资源限制,以确保其能够高效且稳定的运行。
vim /etc/security/limits.conf
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
elasticsearch soft nproc 4096
elasticsearch hard nproc 4096
elasticsearch soft memlock 32768
elasticsearch hard memlock 32768
elasticsearch soft core unlimited
elasticsearch hard core unlimited
核心转储文件大小(core)
Elsaticsearch 通常不需要特别大的核心转储文件,除非你需要进行详细的崩溃后调试,默认情况下可将 core 设置为 unlimited 或一个较大的值。以便在发生崩溃时可以生成完整的内存转储。
进程数限制(nproc)
Elasticsearch 可能会启动多个线程和进程来处理请求,如果系统默认的进程数限制太低,可能会导致 Elasticsearch 无法正常启动或运行。通常将nproc 设置为较高的值,例如4096 或更高。
内存锁定(memlock)
Elasticsearch 使用大量的JVM堆内存,并且为了防止JVM将堆内存交换到磁盘(这会导致严重的性能问题),通常建议锁定JVM堆内存,根据你的堆大小配置,可能需要设置的memlock为相应的值,例如,如果你的堆大小是32GB,则需要设置memlock 为 32768 MB (32 * 1024)
消息队列大小(msgqueue)
对于大多数Elasticsearch安装来说,msgqueue 通常不需要特别高的值,默认的系统设置以及足够,但是,如果你的应用有特殊的需求,可以适当的增加这个值。
文件描述符(nofile)
Elasticsearch 需要打开大量的文件描述符,需要增加这个值
虚拟内存(as)
通常是不必要的,但有时候也可能需要增加虚拟内存的限制
修改完/etc/security/limits.conf 文件后,通常是需要重新登录或者重启系统以使更改生效。
三、ES集群部署
1、解压安装包到指定目录
tar -xf elasticsearch-8.15.2-linux-x86_64.tar.gz -C /usr/local/
创建软连接
ln -sv elasticsearch-8.15.2/ elasticsearch
2、修改JVM堆内存
JVM堆内存大小,通常设置为不超过物理内存的一半,并且不要超过32GB,这是因为32GB以上的堆内存中,垃圾收集的效率会显著下降。
单节点:可以将堆内存设置为物理内存的一半或更少
多节点:确保每个节点的堆内存加上操作系统和其他进程所需的内存不超过物理内存的总和
在配置文件目录,修改堆内存的大小
vim config/jvm.options
有的时候,也可启动一些有用的JVM参数来优化性能和调试
XX:+AlwaysPreTouch # 提前分配堆内存
-XX:+DisableExplicitGC # 禁止显式的 System.gc() 调用
-XX:SurvivorRatio=8 # 新生代和幸存者空间的比例
-XX:MaxTenuringThreshold=1 # 对象晋升到老年代的最大年龄
-XX:ParallelGCThreads=4 # 并行 GC 线程数
-XX:ConcGCThreads=4 # 并发 GC 线程数
-XX:G1NewSizePercent=5 # 新生代占堆内存的百分比
-XX:G1MaxNewSizePercent=60 # 新生代最大占堆内存的百分比
-XX:G1HeapRegionSize=16m # G1 区域大小
-XX:G1ReservePercent=15 # G1 保留的空间百分比
-XX:G1HeapWastePercent=5 # G1 允许的浪费空间百分比
-XX:G1MixedGCLiveThresholdPercent=90 # 混合 GC 的存活对象阈值百分比
-XX:G1RSetUpdatingPauseTimePercent=5 # RSet 更新的暂停时间百分比
-XX:G1MixedGCCountTarget=8 # 混合 GC 的目标次数
-XX:InitiatingHeapOccupancyPercent=35 # 触发标记周期的堆占用百分比
-XX:G1MixedGCLIveThresholdPercent=50 # 混合 GC 的存活对象阈值百分比
-XX:G1HeapWastePercent=5 # G1 允许的浪费空间百分比
-XX:G1MixedGCCountTarget=8 # 混合 GC 的目标次数
-XX:G1OldCSetRegionThresholdPercent=10 # 老年代集合区域的阈值百分比
3、修改配置文件
vim config/elasticsearch.yml
node.master: true #主节点,建议至少有3个主节点,以确保高可用性,主节点不需要大量的CPU或内存,但需要稳定的网络连接。
node.data: false #数据节点(data),根据你的数据量和查询负载来决定,需要更多的CPU和内存,以及快速的磁盘I/O
node.ingest: false #预处理节点(ingest),可选,取决于是否使用预处理管道
node.ml: false #机器学习节点(machine learning),可选,取决于是否使用机器学习
#如果全设置为false,协调节点(coordinating),根据你的查询负载来决定,协调节点需要足够的CPU和内存来处理客户端请求。
通过合理地配置这些节点角色,你可以优化 Elasticsearch 集群的性能和稳定性。确保在生产环境中进行充分的测试和监控,以便及时调整配置以适应实际工作负载。
配置粘贴:
#确保所有节点的集群名称相同
cluster.name: my-application
###当设置为false时,ES节点将不允许连接到任何远程集群,这个设置可以增强安全性,防止未经授权的跨集群连接
####cluster.remote.connect: false 老版本的,新版本默认禁止,不定义远程集群就禁止
# 禁止连接到远程集群
# 通过不定义任何远程集群来实现
# cluster.remote.remote_cluster_1.seeds: ["remote_host1:9300", "remote_host2:9300"]
#为每一个节点指定一个唯一的名称
node.name: chen2
node.roles: ["master"]
#node.master: true
#node.data: false
#node.ingest: false
#node.ml: false
#节点属性,不同的节点,设置不同,不同的角色设置不同
node.attr.rack: m1
node.attr.box_type: master
#字段数据缓存大小,字段数据缓存最多可以占用堆内存的 20%
indices.fielddata.cache.size: 20%
#定义了在选举主节点时,需要至少多少个主节点可用,为了防止脑裂情况的发生。
#discovery.zen.minimum_master_nodes: 2
#定义在集群启动或者重启后,需要多少个节点加入集群后才开始恢复过程,通常是用来确保在集群有足够节点加入后才开始恢复过程,以避免部分节点数据丢失的情况
#gateway.recover_after_nodes: 3
#定义了集群启动或者重启后,需要多少个数据节点加入集群后才开始恢复过程
gateway.recover_after_data_nodes: 2
#ES集群数据存储位置,多个目录就使用“,”隔开
path.data: /usr/local/elasticsearch-8.15.2/data
#ES集群日志存储位置
path.logs: /usr/local/elasticsearch-8.15.2/logs
#服务启动的时候立即分配(锁定)足够的内存,防止数据写入swap,提高启动速度,这里将其关闭
bootstrap.memory_lock: false
#监听所有接口,或指定特定IP地址
network.host: 0.0.0.0
#htpp监听端口
http.port: 9200
#tcp端口
transport.port: 9300
#transport.tcp.port: 9300 老版本配置7.0
#Elasticsearch 将在节点间的 TCP 通信中使用压缩来减少数据传输量。启用会增加CPU开销
transport.compress: true
#transport.compress: true 老版本配置7.0
#配置集群节点IP或主机名,使服务发现其他节点并形成集群
discovery.seed_hosts: ["192.168.10.110", "192.168.10.120","192.168.10.130"]
#master节点主机IP或者主机名
cluster.initial_master_nodes: ["192.168.10.110", "192.168.10.120","192.168.10.130"]
xpack.security.enabled: false
#xpack.ml.enabled: false
xpack.security.transport.ssl.enabled: false
xpack.security.http.ssl.enabled: false
#xpack.security.transport.ssl.verification_mode: certificate
#xpack.security.transport.ssl.keystore.path: /app/elasticsearch-7.1.1-master/elasticsearch-server/config/certs/elastic-certificates.p12
#xpack.security.transport.ssl.truststore.path: /app/elasticsearch-7.1.1-master/elasticsearch-server/config/certs/elastic-certificates.p12
http.cors.enabled: true
http.cors.allow-origin: "*"
#Zen Discovery 模块,老版本存在的设置,新版本,会自动处理
#定义单次ping请求的超时时间,默认是30s
#discovery.zen.fd.ping_timeout: 120s
#定义了发布集群状态的时间限制,默认是30s
#discovery.zen.publish_timeout: 120s
#定义了在节点被认可不可达之前,ping请求的最大重试次数,默认是3次
#discovery.zen.fd.ping_retries: 6
#定义两次ping请求之间的间隔时间,默认是1s
#discovery.zen.fd.ping_interval: 30s
#集群加入超时时间,默认是30s
#cluster.join.timeout: 120s
4、启动集群并进行验证
启动服务
./elasticsearch/bin/elasticsearch -d
curl http://192.168.10.120:9200/_cat/nodes?v
使用kibana进行查看如下