分布式专题——44 ElasticSearch安装
1 ElasticSearch安装和简单配置
1.1 Windows安装
-
安装文档:[Installing Elasticsearch | Elasticsearch Guide 8.14] | Elastic;
-
下载ElasticSearch并解压
-
下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-windows-x86_64.zip;
-
ElasticSearch目录结构如下:
目录 描述 bin 脚本文件,包括启动elasticsearch,安装插件,运行统计数据等 config 配置文件目录,如elasticsearch配置、角色配置、jvm配置等 jdk 7.x以后特有,自带的java 环境 data 默认的数据存放目录,包含节点、分片、索引、文档的所有数据,生产环境需要修改 lib elasticsearch依赖的Java类库 logs 默认的日志文件存储路径,生产环境需要修改。 modules 包含所有的Elasticsearch模块,如Cluster、Discovery、Indices等 plugins 已安装插件目录
-
-
配置JDK环境
-
ES比较耗内存,建议虚拟机4G或以上内存,JVM1g以上的内存分配;
-
运行Elasticsearch,需安装并配置JDK。各个版本对Java的依赖可查看:Support Matrix | Elastic;
-
7.0开始,内置了Java环境。ES的JDK环境变量生效的优先级配置顺序:
ES_JAVA_HOME
>ES_HOME
; -
ES_JAVA_HOME
:用于指定Elasticsearch使用的Java运行时环境的路径,启动时会检查该环境变量并使用其中的Java路径; -
ES_HOME
:指定Elasticsearch的安装路径,用于定位配置文件、插件和其他相关资源,方便在命令行中访问目录结构和文件; -
可参考ES的环境文件
elasticsearch-env.bat
;
-
-
Windows下,需设置
ES_JAVA_HOME
和ES_HOME
的环境变量;
-
-
配置ElasticSearch
-
编辑
config/elasticsearch.yml
文件,关闭security安全认证(ES 8默认开启Security,初学者为快速上手可关闭)
-
-
启动ElasticSearch服务
-
解决启动日志乱码问题:
# 打开config/jvm.options文件,末尾添加: -Dfile.encoding=GBK
-
进入
bin
目录,点击elasticsearch.bat
文件启动ES服务-
注意:9300端口为Elasticsearch集群间组件的通信端口,9200端口为浏览器访问的HTTP协议RESTful端口;
-
打开浏览器(推荐谷歌浏览器),输入地址
http://localhost:9200
,若显示以下结果则启动成功
-
-
1.2 Linux安装
-
环境准备
-
准备Linux安装环境:以CentOS7系统为例,IP为
192.168.65.47
,操作用户为shisan
; -
注意:ES不允许使用root账号启动服务,若当前账号是root,需创建专有账户,命令如下:
#为Elasticsearch创建用户 adduser shisan passwd shisan
-
-
通过shisan用户登录,下载ElasticSearch并解压
-
执行以下命令下载并解压:
#centos7 通过shisan用户进入 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-linux-x86_64.tar.gz tar -xzf elasticsearch-8.14.3-linux-x86_64.tar.gz cd elasticsearch-8.14.3/
-
注意:若在root用户下解压了ES安装包,需将所有者和组改为shisan用户,命令:
# 在root用户下操作 chown -R shisan:shisan elasticsearch-8.14.3
-
-
配置JDK环境(可选):进入shisan用户主目录(如
/home/shisan
),设置用户级别的环境变量vim .bash_profile #设置ES_JAVA_HOME和ES_HOME的路径 export ES_JAVA_HOME=/home/shisan/elasticsearch-8.14.3/jdk/ export ES_HOME=/home/shisan/elasticsearch-8.14.3 #执行以下命令使配置生效 source .bash_profile
-
配置ElasticSearch
-
修改
config/elasticsearch.yml
配置文件,命令vim elasticsearch.yml
,添加以下配置:# 配置节点对外提供服务的地址以及集群内通信的ip地址,开启远程访问支持 network.host: 0.0.0.0 # 指定节点为单节点,绕过引导检查(开发模式) discovery.type: single-node # 初学者建议关闭security安全认证 xpack.security.enabled: false
-
开发模式:默认配置(未配置集群发现设置),通过
discovery.type=single-node
指定单节点,可绕过引导检查,适合学习目的; -
生产模式:修改集群相关配置会触发,服务启动前会进行引导检查(如JVM大小、内存锁、虚拟内存、最大线程数、集群发现配置等),若配置不合理ES会拒绝启动,避免后期性能问题;
-
-
ElasticSearch常用配置参数:
参考文档:[Important Elasticsearch configuration | Elasticsearch Guide 8.14] | Elastic;
cluster.name
:当前节点所属集群名称,多节点组成同一集群时需配置相同名称,默认elasticsearch
,生产环境建议修改,避免不同环境重用导致节点加入错误集群;node.name
:当前节点名称,默认部署机器的主机名,一台机器起多个ES节点时需明确指定不同名称;path.data
:数据存储目录,默认$ES_HOME/data
,生产环境建议部署到安全目录,防止ES升级误删数据;path.logs
:日志存储目录,默认$ES_HOME/logs
,生产环境建议部署到安全目录;bootstrap.memory_lock
:ES启动时是否进行内存锁定检查,默认true
。生产环境建议大内存,否则内存不足易导致内存交换到磁盘影响性能;非生产环境内存小的话可改为false
;network.host
:节点对外提供服务和集群内通信的IP地址,默认回环地址127.0.0.1
和[::1]
,默认仅能本机访问;http.port
:ES节点对外提供服务的HTTP端口,默认9200
;transport.port
:节点通信端口号,默认9300
;discovery.seed_hosts
:参与集群节点发现的主机列表,可是IP地址或可解析域名;cluster.initial_master_nodes
:ES集群初始化时参与master选举的节点名称列表,必须与node.name
一致。集群首次构建完成后需移除该配置项;
-
配置JVM参数(可选)
-
修改
config/jvm.options
配置文件调整JVM堆内存大小,命令vim jvm.options
,示例配置:-Xms4g -Xmx4g
-
配置建议:
Xms
(JVM启动时分配的最小堆内存)和Xmx
(JVM运行过程中能分配的最大堆内存)设置成一样;Xmx
不要超过机器内存的50%;- 不要超过30GB,参考文档:A Heap of Trouble: Managing Elasticsearch’s Managed Heap | Elastic Blog;
-
-
启动ElasticSearch服务
-
以shisan用户启动,命令:
#前台启动 bin/elasticsearch # -d 后台启动 bin/elasticsearch -d
-
测试:打开本地浏览器(推荐谷歌浏览器),输入地址
http://192.168.65.47:9200
(替换为linux环境对应IP),若显示以下结果则启动成功
-
1.3 生产模式启动 ES 服务常见错误总结
-
如果不配置
discovery.type: single-node
绕过引导检查,ES服务启动可能抛出以下异常: -
错误[1]:
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
-
原因:ES需要大量创建索引文件,需大量打开系统文件,Linux系统打开文件最大数目的限制过低会导致启动报错
-
解决:切换到root用户,编辑
/etc/security/limits.conf
文件,末尾添加配置:* soft nofile 65536 * hard nofile 65536 * soft nproc 4096 * hard nproc 4096
-
-
错误[2]:
max number of threads [1024] for user [es] is too low, increase to at least [4096]
-
原因:用户最大可创建线程数太小,无法创建本地线程
-
解决:编辑
/etc/security/limits.d/20-nproc.conf
文件,改为配置:* soft nproc 4096
-
-
错误[3]:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
-
原因:最大虚拟内存太小
-
解决:编辑
/etc/sysctl.conf
文件,追加内容:vm.max_map_count=262144
- 保存退出后执行命令
sysctl -p
使配置生效
- 保存退出后执行命令
-
-
错误[4]:
the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
-
原因:缺少默认发现配置,生产环境需配置集群发现相关参数
-
相关参数说明:
discovery.seed_hosts
:集群主机列表discovery.seed_providers
:基于配置文件配置集群主机列表cluster.initial_master_nodes
:启动时初始化的参与选主的node,生产环境必填
-
解决:编辑
config/elasticsearch.yml
文件,添加配置(二选一即可):- 配置集群发现参数:
discovery.seed_hosts: ["127.0.0.1"] cluster.initial_master_nodes: ["node-1"]
- 配置单节点(开发模式,绕过引导检查):
discovery.type: single-node
- 配置集群发现参数:
-
2 安装ES浏览器插件
插件名称 | 功能介绍 | 下载地址 |
---|---|---|
Elasticsearch Head | 方便查看集群节点数据,方便管理和索引、分片,支持同时连接多集群 | Chrome下载 GitHub下载 |
Elasticsearch Tools | 方便查看节点资源占用,可执行查询语句 | Chrome下载 |
Elasticvue | 功能强大,对国人友好 | Chrome下载 [Edge下载](Microsoft Edge 加载项 - elasticvue) |
-
Elasticvue界面如下:
3 可视化Kibana安装
-
Kibana是一个开源分析和可视化平台,旨在与Elasticsearch协同工作
-
参考文档:[Quick start | Kibana Guide 8.14] | Elastic;
-
下载地址:Past Releases | Elastic;
-
-
下载并解压缩Kibana
-
Windows:下载地址
https://artifacts.elastic.co/downloads/kibana/kibana-8.14.3-windows-x86_64.zip
,解压后使用; -
Linux:执行以下命令下载并解压:
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.14.3-linux-x86_64.tar.gz tar -zxvf kibana-8.14.3-linux-x86_64.tar.gz cd kibana-8.14.3
-
-
修改
Kibana.yml
配置文件。编辑config/kibana.yml
文件,添加以下配置:# 指定Kibana服务器监听的端口号 server.port: 5601 # 指定Kibana服务器绑定的主机地址 server.host: "0.0.0.0" # 指定Kibana连接到的Elasticsearch实例的访问地址 elasticsearch.hosts: ["http://localhost:9200"] # 将 Kibana 的界面语言设置为简体中文 i18n.locale: "zh-CN"
-
运行Kibana
-
Windows:直接执行
kibana.bat
-
Linux:注意需用非root用户启动,执行以下命令:
# 启动kibana服务 bin/kibana # 后台启动,并将日志写入到logs/kibana.log nohup bin/kibana > logs/kibana.log 2>&1 & # 查询kibana进程 netstat -tunlp | grep 5601
-
-
访问Kibana。访问地址:
http://localhost:5601
,可进入Kibana界面,利用其开发工具(如控制台)进行操作 -
Kibana提供丰富的cat API用于查看Elasticsearch集群信息,部分常用API及功能如下:
API 路径 功能说明 /_cat/allocation
查看单节点的shard分配整体情况 /_cat/shards
查看各shard的详细情况 /_cat/shards/{index}
查看指定分片的详细情况 /_cat/master
查看master节点信息 /_cat/nodes
查看所有节点信息 /_cat/indices
查看集群中所有index的详细信息 /_cat/indices/{index}
查看集群中指定index的详细信息 /_cat/segments
查看各index的segment详细信息,包括segment名、所属shard、内存(磁盘)占用大小等 /_cat/segments/{index}
查看指定index的segment详细信息 /_cat/count
查看当前集群的doc数量 /_cat/count/{index}
查看指定索引的doc数量 /_cat/recovery
查看集群内每个shard的recovery过程,调整replica /_cat/recovery/{index}
查看指定索引shard的recovery过程 /_cat/health
查看集群当前状态(红、黄、绿) /_cat/pending_tasks
查看当前集群的pending task /_cat/aliases
查看集群中所有alias信息、路由配置等 /_cat/aliases/{alias}
查看指定索引的alias信息 /_cat/thread_pool
查看集群各节点内部不同类型的threadpool的统计信息 /_cat/plugins
查看集群各个节点上的plugin信息 /_cat/fielddata
查看当前集群各个节点的fielddata内存使用情况 /_cat/fielddata/{fields}
查看指定field的内存使用情况,包含field属性对应的值 /_cat/nodeattrs
查看单节点的自定义属性 /_cat/repositories
输出集群中注册快照存储库 /_cat/templates
输出当前正存在的模板信息
4 安装中文分词插件
4.1 在线安装
-
以analysis-icu分词插件为例;
-
analysis-icu功能:
- 基于ICU(International Components for Unicode)库,提供高级的文本分析和处理功能
- 支持多语言和复杂的Unicode文本处理
- 包含ICU分词器(ICU Tokenizer)和ICU标准化过滤器(ICU Normalizer)
-
analysis-icu应用场景:
- 多语言文本分析,适用于处理各种语言的文本
- 支持Unicode标准化和处理复杂字符
- 提供高级的文本处理功能,如正则表达式替换、文本转换等
-
操作命令:
# 查看已安装插件 bin/elasticsearch-plugin list # 安装插件 bin/elasticsearch-plugin install analysis-icu # 删除插件 bin/elasticsearch-plugin remove analysis-icu
-
注意:安装和删除完插件后,需要重启ES服务才能生效;
-
测试分词效果:
POST _analyze {"analyzer":"icu_analyzer","text":"中华人民共和国" }
4.2 离线安装
-
本地下载相应的插件,解压,然后手动上传到elasticsearch的plugins目录,然后重启ES实例就可以了;
-
IK中文分词插件:GitHub - infinilabs/analysis-ik: 🚌 The IK Analysis plugin integrates Lucene IK analyzer into Elasticsearch and OpenSearch, support customized dictionary.;
-
注意:
- IK分词器插件和ES版本必须一一对应,否则会出现兼容性问题导致ES启动失败;
- 当前我们使用的ES版本是8.14.3,可以从Index of: analysis-ik/stable/下载ES8.14.3对应版本的分词器;
-
测试分词效果:
- ES默认分词(standard):会单字拆分,执行请求:
POST _analyze {"analyzer":"standard","text":"中华人民共和国" }
- ik_smart(最粗粒度拆分):
POST _analyze {"analyzer": "ik_smart","text": "中华人民共和国" }
- ik_max_word(最细粒度拆分):
POST _analyze {"analyzer":"ik_max_word","text":"中华人民共和国" }
- ES默认分词(standard):会单字拆分,执行请求:
-
创建索引时指定IK分词器为默认分词器:
# 创建索引,指定默认分词器 PUT /employee {"settings" : {"index" : {"analysis.analyzer.default.type": "ik_max_word"}} } # 查看索引setting信息 GET /employee/_settings
-
针对字段配置IK分词器:
# 创建索引并指定content字段的分词器 PUT /index POST /index/_mapping {"properties": {"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"}} }# 索引文档(插入文档) POST /index/_create/1 {"content":"美国留给伊拉克的是个烂摊子吗"} POST /index/_create/2 {"content":"公安部:各地校车将享最高路权"} POST /index/_create/3 {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"} POST /index/_create/4 {"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}# 带高亮的查询 POST /index/_search {"query": {"match": {"content": "中国"}},"highlight": {"pre_tags": ["<tag1>","<tag2>"],"post_tags": ["</tag1>","</tag2>"],"fields": {"content": {}}} }
-
/index/_mapping 映射属性解释:
"properties"
:包含字段定义的JSON对象,此处仅含content
字段"content"
:索引中定义的字段名"type": "text"
:指定content
字段数据类型为text
,用于全文搜索,可被分词器处理为词条用于索引和搜索"analyzer": "ik_max_word"
:索引(写入)content
字段时使用ik_max_word
分词器,对文本最细粒度切分,提高搜索召回率"search_analyzer": "ik_smart"
:搜索(查询)content
字段时使用ik_smart
分词器,更智能切分,提高搜索准确率。通过索引和搜索使用不同分词器,可在提高召回率的同时保持搜索精度