Elasticsearch简介
Elasticsearch 是一个分布式的、RESTful 风格
的搜索和分析引擎。它能够解决从简单到复杂的各种搜索问题,并且由于其分布式特性,可以扩展到数百台服务器,处理 PB 级结构化或非结构化数据。Elasticsearch 基于 Lucene
构建,但它的目标是使全文搜索及其后端功能(如自动完成)变得简单易用。
主要特点
- 分布式:Elasticsearch 是一个分布式系统,这意味着它可以管理多个节点,每个节点都是运行 Elasticsearch 的服务器。这些节点一起形成一个集群,数据被分片存储在不同的节点上,从而实现水平扩展。
- 实时分析:Elasticsearch 能够
实时地对数据进行索引和搜索
,非常适合需要快速响应的应用场景。 - 高可用性:通过复制机制,Elasticsearch 可以保证即使某个节点失败,数据仍然是安全的并且可被检索。
- 多租户:可以在同一集群中支持多个用户或应用程序,每个用户或应用程序可以拥有自己的索引。
- 插件化:可以通过各种插件来增强功能,比如支持额外的数据类型、提供额外的聚合等。
- RESTful 接口:所有的功能都可以通过
HTTP 请求
与JSON 数据格式
来访问,这使得与其他系统集成变得非常容易。
使用场景
Elasticsearch 广泛应用于多种领域,包括但不限于:
- 日志分析:收集、分析和可视化日志数据。
- 搜索引擎:为网站或应用提供强大的搜索能力。
- 监控系统:用于监控系统性能指标、错误日志等。
- 推荐系统:基于用户的搜索历史或其他行为提供个性化推荐。
生态系统
Elasticsearch 是 Elastic Stack
的一部分,这个栈还包括 Kibana
(用于数据可视化)、Logstash
(用于数据摄入管道)和 Beats
(一组轻量级的发送器,用于发送数据到 Elasticsearch 或 Logstash)。这些工具共同工作,形成了一个完整的解决方案,用于搜索、分析和可视化大规模数据集。
安装准备
- 运行环境:
Ubuntu 22.04.3 LTS
- Elasticsearch版本:
7.17.14
- Elasticsearch官方文档
Easticsearch的运行环境依赖Java
,而且要满足版本应该是Java 7
或者更高版本,所以先检查系统是否有安装Java以及对应版本是否符合要求。
开始安装
第一步:安装Java (如已安装,请忽略此步骤)
安装openjdk-8-jdk
命令如下:
root@prajna_sea:/# apt update
root@prajna_sea:/# apt install openjdk-8-jdk
查看Java版本:
#输出以下信息表示已成功安装Java运行环境
root@prajna_sea:/# java -version
openjdk version "1.8.0_422"
OpenJDK Runtime Environment (build 1.8.0_422-8u422-b05-1~22.04-b05)
OpenJDK 64-Bit Server VM (build 25.422-b05, mixed mode)
第二步:安装Elasticsearch
安装有多种方式:
- 1.可以通过官网下载对应系统的tar压缩包进行安装【❌不推荐,官网国内访问比较慢】
- 2.通过
Docker
镜像安装【✅推荐使用Docker镜像安装,安装和使用简单快捷】 - 3.使用
apt
命令和yum
命令安装【✅推荐,安装速度快、管理更便捷】
使用apt
命令安装如下:
root@prajna_sea:/# wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
root@prajna_sea:/# echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
root@prajna_sea:/# apt update
root@prajna_sea:/# apt install elasticsearch=7.17.14
- 使用
apt install
如果不指定版本将会下载7.x的最新版
等待安装成功后,显示如下:
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
sudo systemctl start elasticsearch.service
Created elasticsearch keystore in /etc/elasticsearch/elasticsearch.keystore
启动Elasticsearch:
sudo systemctl daemon-reload
重新加载 systemd 的配置文件。当对系统中的服务单元文件进行了任何修改或添加了新的服务单元文件时,这个命令用来确保 systemd 重新读取最新的配置信息。这一步是必要的,因为 systemd 在启动时会缓存服务配置信息,如果不重新加载,它将不会意识到新的或更新过的服务配置。sudo systemctl enable elasticsearch
如果希望 Elasticsearch 服务在每次系统启动时自动运行,那么就需要执行这个命令。sudo systemctl start elasticsearch
启动 Elasticsearch 服务- 服务启动时要占用很大的内存空间,所以如果服务器配置较低,可以修改
/etc/elasticsearch/jvm.options
文件里面的-Xms1g
、
-Xmx1g
-Xms
最小暂用内存,例如500Mb:-Xms500m
-Xmx
最大暂用内存,例如1Gb:-Xmx1g
启动成功后可以查看状态:
root@prajna_sea:/# systemctl start elasticsearch
root@prajna_sea:/# systemctl status elasticsearch
● elasticsearch.service - Elasticsearch
Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2024-09-04 17:12:00 CST; 2s ago
Main PID: 1234 (java)
CGroup: /system.slice/elasticsearch.service
└─1234 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Xms512m -Xmx512m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:MaxHeapFreeRatio=70 -XX:MinHeapFreeR...
启动成功后访问9200端口
,将会输出以下信息:
root@prajna_sea:/# curl http://127.0.0.1:9200
{
"name" : "prajna_sea",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "bnfSshxnQbGUQZOP6q4kaQ",
"version" : {
"number" : "7.17.14",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "774e3bfa4d52e2834e4d9d8d669d77e4e5c1017f",
"build_date" : "2023-10-05T22:17:33.780167078Z",
"build_snapshot" : false,
"lucene_version" : "8.11.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
设置允许跨域访问,这样才能接入可视化工具,例如:kibana
、elasticsearch-head
:
- 修改
/etc/elasticsearch/elasticsearch.yml
配置文件,增加以下内容:
http.cors.enabled: true
http.cors.allow-origin: "*"
设置允许外网或指定ip访问,防火墙和安全组还需要放行9200端口
:
- 修改
/etc/elasticsearch/elasticsearch.yml
配置文件,network.host
配置修改为以下内容:
network.host: 0.0.0.0 #0.0.0.0 就是配置允许所有ip地址访问,也可以指定其它ip访问
其他平台安装
在Windows10系统里面安装
Windows10
系统里面安装我用到了wsl
(适用于 Linux 的 Windows 子系统 (WSL) 可让开发人员直接在 Windows 上按原样运行 GNU/Linux 环境(包括大多数命令行工具、实用工具和应用程序),且不会产生传统虚拟机或双启动设置开销。),有了wsl
可以在Windows中使用linux
环境,不需要安装其它虚拟机软件!而且Vscode
里面也有对应wsl插件
,所以使用起来比较方便。如果有需要在linux
开发的项目,并且没有对应的环境,推荐使用此项功能。
- wsl配置以及使用官方文档
- 我所使用的是
wsl1
版本,所以如果是wsl2
版本可能存在一些差别
在wsl
的Ubuntu
虚拟机里面进行安装步骤和前面相同,但是在启动Elasticsearch时会存在一些坑,首先是不支持systemctl
这个命令,如果直接运行sudo systemctl start elasticsearch
,会提示错误信息:
root@prajna_sea:~# systemctl start elasticsearch
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
可以使用/etc/init.d/elasticsearch
这个脚本来启动、停止、重启、查看服务
root@prajna_sea:~# /etc/init.d/elasticsearch
* Usage: /etc/init.d/elasticsearch {start|stop|restart|force-reload|status}
/etc/init.d/elasticsearch start
启动服务,在启动时会提示如下错误:
root@prajna_sea:~# /etc/init.d/elasticsearch start
* Starting Elasticsearch Server
* start-stop-daemon: matching on world-writable pidfile /var/run/elasticsearch/elasticsearch.pid is insecure
[fail]
这个错误是因为/var/run/elasticsearch/elasticsearch.pid
这个文件的权限是不安全的,可以将这个文件权限设置为700,然后就能启动成功:
root@prajna_sea:~# chmod 700 /var/run/elasticsearch/elasticsearch.pid
root@prajna_sea:~# /etc/init.d/elasticsearch start
* Starting Elasticsearch Server
* Sep 05, 2024 4:46:15 PM sun.util.locale.provider.LocaleProviderAdapter <clinit>
WARNING: COMPAT locale provider will be removed in a future release
[ OK ]
还有坑的地方是,如果运行/etc/init.d/elasticsearch stop
或者/etc/init.d/elasticsearch restart
命令后再次start都要重新修改/var/run/elasticsearch/elasticsearch.pid
文件的权限,否则启动会报错。
我的解决方法先删除/var/run/elasticsearch/elasticsearch.pid
这个文件,然后编辑vi /etc/init.d/elasticsearch
脚本,修改其中start逻辑,这样后面启动就不会提示权限错误了。改动部分如下:
if [ -n "$PID_FILE" ] && [ ! -e "$PID_FILE" ]; then
touch "$PID_FILE" && chown elasticsearch:elasticsearch "$PID_FILE"
#这里加上修改文件权限的命令
chmod 700 "$PID_FILE"
fi
wsl环境下的其他小技巧
在~/.bashrc
文件里面增加启动Elasticsearch的命令别名,这样就不用每次输入/etc/init.d/elasticsearch start
命令来启动:
root@prajna_sea:~# vi ~/.bashrc
#在.bashrc文件里加入以下配置
alias startelastic='sudo /etc/init.d/elasticsearch start'
alias stopelastic='sudo /etc/init.d/elasticsearch stop'
配置好后关掉命令窗口,再打开一个新的命令窗口,输入命令:startelastic
、stopelastic
,就能启动、停止服务了:
root@prajna_sea:~# startelastic
* Starting Elasticsearch Server
* * Already running. [ OK ]
安装ik中文分词器
安装分词器步骤比较简单,但是由于国内访问速度太慢,要下载很久,所有这里使用下载的地址是:https://get.infini.cloud/elasticsearch/analysis-ik/7.17.14,后面的 7.17.14
这个版本要和安装的Elasticsearch版本对应:
root@prajna_sea:~# cd /usr/share/elasticsearch
root@prajna_sea:/usr/share/elasticsearch# bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/7.17.14
-> Installing https://get.infini.cloud/elasticsearch/analysis-ik/7.17.14
-> Downloading https://get.infini.cloud/elasticsearch/analysis-ik/7.17.14
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: plugin requires additional permissions @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.net.SocketPermission * connect,resolve
See https://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.
Continue with installation? [y/N]y
-> Installed analysis-ik
-> Please restart Elasticsearch to activate any plugins installe
root@prajna_sea:~# /etc/init.d/elasticsearch restart
安装后重启Elasticsearch服务,如果是wsl环境下用任务管理器kill掉服务再重新启动,安装成功测试分词将输出如下信息:
root@prajna_sea:~# curl -X GET http://127.0.0.1:9200/_analyze -H "Content-Type: application/json" -d '{ "analyzer": "ik_smart","text": ["Ubuntu系统使用apt命令工具安装Elasticsearch和ik分词器"]}'
{
"tokens": [{
"token": "ubuntu",
"start_offset": 0,
"end_offset": 6,
"type": "ENGLISH",
"position": 0
}, {
"token": "系统",
"start_offset": 6,
"end_offset": 8,
"type": "CN_WORD",
"position": 1
}, {
"token": "使用",
"start_offset": 8,
"end_offset": 10,
"type": "CN_WORD",
"position": 2
}, {
"token": "apt",
"start_offset": 10,
"end_offset": 13,
"type": "ENGLISH",
"position": 3
}, {
"token": "命令",
"start_offset": 13,
"end_offset": 15,
"type": "CN_WORD",
"position": 4
}, {
"token": "工具",
"start_offset": 15,
"end_offset": 17,
"type": "CN_WORD",
"position": 5
}, {
"token": "安装",
"start_offset": 17,
"end_offset": 19,
"type": "CN_WORD",
"position": 6
}, {
"token": "elasticsearch",
"start_offset": 19,
"end_offset": 32,
"type": "ENGLISH",
"position": 7
}, {
"token": "和",
"start_offset": 32,
"end_offset": 33,
"type": "CN_CHAR",
"position": 8
}, {
"token": "ik",
"start_offset": 33,
"end_offset": 35,
"type": "ENGLISH",
"position": 9
}, {
"token": "分词器",
"start_offset": 35,
"end_offset": 38,
"type": "CN_WORD",
"position": 10
}]
}