1、Lucene
Lucene是Apache的开源搜索引擎类库,提供了搜索引擎的核心API,Elasticsearch底层是基于Lucene来实现的。
Lucene是apache软件基金会 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。
2、Elasticsearch
Elasticsearch是一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能。
Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈。Elasticsearch 是索引、搜索和分析魔法发生的地方。
Elasticsearch 为所有类型的数据提供近乎实时的搜索和分析。无论您拥有结构化或非结构化文本、数字数据还是地理空间数据,Elasticsearch 都能以支持快速搜索的方式高效地存储和索引它。您可以超越简单的数据检索和聚合信息来发现数据中的趋势和模式。随着您的数据和查询量的增长,Elasticsearch 的分布式特性使您的部署能够随之无缝增长
需要注意的是,elasticsearch不支持root启动,需要额外创建一个用户例如:es;虚拟内存不能过小,且注意集群名称节点要和实际的集群部署个数一致等。
3、Elastic Stack
Elastic Stack是以Elasticsearch为核心的技术栈,包括Beats、Logstash、Kibana、Elasticsearch。
实际上ELK是三款软件的简称,分别是Elasticsearch、Logstash、Kibana组成,在发展的过程中,又有新成员Beats的加入,所以就形成了Elastic Stack。所以说,ELK是旧的称呼,Elastic Stack是新的名字。
4、Logstash
Logstash是具有实时流水线能力的开源的数据收集引擎。Logstash可以动态统一不同来源的数据,并将数据标准化到您选择的目标输出。它提供了大量插件,可帮助我们解析,丰富,转换和缓冲任何类型的数据。
1、创建网络,用于容器间互联,创建自定义网络的好处
docker network create es-net
2、拉取镜像
docker pull elasticsearch:8.4.0
docker pull kibana:8.4.0
这个地方有坑,如果直接docker pull latest获取到的实际上是6.4的版本,所以最好还是指定一下版本号
docker查询最新版本号命令
curl https://registry.hub.docker.com/v1/repositories/kibana/tags\
| tr -d '[\[\]" ]' | tr '}' '\n'\
| awk -F: -v image='kibana' '{if(NR!=NF && $3 != ""){printf("%s:%s\n",image,$3)}}'
3、部署镜像
部署elasticsearch
docker run -d \
--name es \
--net es-net \
-p 9200:9200 \
-p 9300:9300 \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \ # 非集群模式
-v es-data:/home/es/data \ # 挂载逻辑卷,绑定es的数据目录
-v es-plugins:/home/es/plugins \ # 挂载逻辑卷,绑定es的插件目录
--privileged \ # 授予逻辑卷访问权
elasticsearch:8.1.0
docker run -d --name es --net es-net -p 9200:9200 -p 9300:9300 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -e "discovery.type=single-node" -v /home/plugins:/usr/share/elasticsearch/plugins --privileged elasticsearch:8.4.0
部署kibana
docker run -d \
--name kibana \
--net es-net \ # 与Elasticsearch加入同一个网络
-e ELASTICSEARCH_HOSTS=http://es:9200 \ # 设置Elasticsearch的地址,Kibana可以用容器名直接访问Elasticsearch
-p 5601:5601 \
kibana:8.1.0
问题:这个地方会有一个问题,老版本的可以加-e ELASTICSEARCH_HOSTS=http://es:9200,新版本的如果在配置文件配了,在启动命令再加会一直提示
Kibana server is not ready yet.
网上很多会告诉你地址配错了, 这个地方也有,就是配置文件里要配置docker内部分配的IP地址
但是如果改了还不对,就检查一下启动命令
docker run -d --name kibana --net es-net -e -p 5601:5601 kibana:8.4.0
# Kibana 端口号
#server.port: 5601
# 远程访问kibana地址
#server.host: "localhost"
# 使您能够在运行于代理之后指定挂载Kibana的路径。这只会影响到由Kibana生成的url,
# 您的代理在将请求转发到Kibana之前应该删除basePath值。
# 此设置不能以斜线结束。
#server.basePath: ""
# 传入服务器请求的最大有效负载大小(以字节为单位)。
#server.maxPayloadBytes: 1048576
# Kibana 服务名
#server.name: "your-hostname"
# 要用于所有查询的Elasticsearch实例的URL。
# 也可以配置多个ES
# elasticsearch.hosts: ["http://IP:PORT","http://IP:PORT"]
elasticsearch.url: "http://127.0.0.1:9200"
# 当该设置的值为true时,Kibana使用服务器中指定的主机名设置
# 当这个设置的值为false时,Kibana使用连接到这个Kibana实例的主机的主机名。
#elasticsearch.preserveHost: true
# Kibana在Elasticsearch中使用索引来存储保存的搜索、可视化和仪表板。
# 如果索引不存在,则Kibana创建一个新索引。
#kibana.index: ".kibana"
# 要加载的默认应用程序。
#kibana.defaultAppId: "discover"
#如果ES设置了用户验证,则需要配置可用的用户名密码
#elasticsearch.username: "user"
#elasticsearch.password: "pass"
# 分别启用SSL和到peme格式SSL证书和SSL密钥文件的路径。
# 这些设置为从Kibana服务器发送到浏览器的请求启用SSL。
#server.ssl.enabled: false
#server.ssl.certificate: /path/to/your/server.crt
#server.ssl.key: /path/to/your/server.key
# 提供pemm格式SSL证书和密钥文件路径的可选设置。
# 这些文件将验证您的Elasticsearch后端是否使用了相同的密钥文件。
#elasticsearch.ssl.certificate: /path/to/your/client.crt
#elasticsearch.ssl.key: /path/to/your/client.key
# 可选设置,使您能够为您的Elasticsearch实例的证书颁发机构指定PEM文件的路径。
#elasticsearch.ssl.certificateAuthorities: [ "/path/to/your/CA.pem" ]
# 若要忽略SSL证书的有效性,请将此设置的值更改为“none”。
#elasticsearch.ssl.verificationMode: full
# 等待Elasticsearch响应ping的时间(毫秒)
# 默认使用elasticsearch.requestTimeout 的设置
#elasticsearch.pingTimeout: 1500
# 等待后端或Elasticsearch响应的时间(毫秒)
#elasticsearch.requestTimeout: 30000
问题:启动以后直接访问:ip:9200这个时候提示未发送任何数据
是因为开启了 ssl 认证。
在 ES/config/elasticsearch.yml 文件中把 xpack.security.http.ssl:enabled 设置成 false 即可,或者直接再前边用https协议访问
启动后直接访问IP+5601可直接打开kibana界面,第一次打开会让你输入用户名和密码
生成token
进入镜像
docker exec -it 14bdcb85f7e9 /bin/bash
生成密码
bin/elasticsearch-create-enrollment-token --scope kibana
将生成的token输入到页面token框中
如果忘了密码可以重置
bin/elasticsearch-reset-password -u elastic
有的人习惯设置免密登录就是把
elasticsearch.yml 文件, 把 xpack.security.enabled 属性设置为 false 即可。
这个地方还有一个坑,就是如果改为false当你重置密码时是会失败的,如果忘记密码记得把这里改回true再重置,否则会失败
xpack.security.enabled: false
ERROR: Failed to determine the health of the cluster
1、查看数据卷目录
# docker volume inspect es-plugins
[
{
"CreatedAt": "2022-09-24T15:00:37+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/es-plugins/_data",
"Name": "es-plugins",
"Options": null,
"Scope": "local"
}
]
2、将分词器文件放到ES容器的插件数据卷中
插件数据卷目录:/var/lib/docker/volumes/es-plugins/_data
下载分词器:IK分词器GitHub地址:https://github.com/medcl/elasticsearch-analysis-ik
gitHub地址是分词器的源码地址,这里下载下来的不是分词器的安装文件
分词器的安装文件下载地址:Releases · medcl/elasticsearch-analysis-ik · GitHub
下载分词器要选择和对应es版本相对应的版本下载。
这里可以直接在挂载的时候直接将宿主机准备好的分词器挂载在对应目录,分词器挂载在/usr/share/elasticsearch/plugins即可,这是安装目录
-v /home/plugins:/usr/share/elasticsearch/plugins
这里记得把所要安装的分词器文件放在一个文件夹中。
进入es的 /usr/share/elasticsearch/bin查询安装的分词器
这里遇到的坑是添加了一个数据的挂载,-v /home/data:/usr/share/elasticsearch/data结果es一直起不起来,报错信息如下:
{
"@timestamp":"2022-09-27T07:54:34.056Z",
"log.level":"ERROR",
"message":"fatal exception while booting Elasticsearch",
"ecs.version":"1.2.0",
"service.name":"ES_ECS",
"event.dataset":"elasticsearch.server",
"process.thread.name":"main",
"log.logger":"org.elasticsearch.bootstrap.Elasticsearch",
"elasticsearch.node.name":"0b31a39fa094",
"elasticsearch.cluster.name":"docker-cluster",
"error.type":"java.lang.IllegalStateException",
"error.message":"failed to obtain node locks, tried [/usr/share/elasticsearch/data]; maybe these locations are not writable or multiple nodes were started on the same data path?",
"error.stack_trace":"java.lang.IllegalStateException: failed to obtain node locks, tried [/usr/share/elasticsearch/data]; maybe these locations are not writable or multiple nodes were started on the same data path?\n\tat [email protected]/org.elasticsearch.env.NodeEnvironment.(NodeEnvironment.java:285)\n\tat [email protected]/org.elasticsearch.node.Node.(Node.java:456)\n\tat [email protected]/org.elasticsearch.node.Node.(Node.java:311)\n\tat [email protected]/org.elasticsearch.bootstrap.Elasticsearch$2.(Elasticsearch.java:214)\n\tat [email protected]/org.elasticsearch.bootstrap.Elasticsearch.initPhase3(Elasticsearch.java:214)\n\tat [email protected]/org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:67)\nCaused by: java.io.IOException: failed to obtain lock on /usr/share/elasticsearch/data\n\tat [email protected]/org.elasticsearch.env.NodeEnvironment$NodeLock.(NodeEnvironment.java:230)\n\tat [email protected]/org.elasticsearch.env.NodeEnvironment$NodeLock.(NodeEnvironment.java:198)\n\tat [email protected]/org.elasticsearch.env.NodeEnvironment.(NodeEnvironment.java:277)\n\t... 5 more\nCaused by: java.nio.file.NoSuchFileException: /usr/share/elasticsearch/data/node.lock\n\tat java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)\n\tat java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)\n\tat java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)\n\tat java.base/sun.nio.fs.UnixPath.toRealPath(UnixPath.java:825)\n\tat [email protected]/org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:94)\n\tat [email protected]/org.apache.lucene.store.FSLockFactory.obtainLock(FSLockFactory.java:43)\n\tat [email protected]/org.apache.lucene.store.BaseDirectory.obtainLock(BaseDirectory.java:44)\n\tat [email protected]/org.elasticsearch.env.NodeEnvironment$NodeLock.(NodeEnvironment.java:223)\n\t... 7 more\n\tSuppressed: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/node.lock\n\t\tat java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)\n\t\tat java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)\n\t\tat java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)\n\t\tat java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:218)\n\t\tat java.base/java.nio.file.Files.newByteChannel(Files.java:380)\n\t\tat java.base/java.nio.file.Files.createFile(Files.java:658)\n\t\tat [email protected]/org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:84)\n\t\t... 10 more\n"
}
3、测试分词器
这里的分词器名称不要用自己定义的文件名称,每个分词器都有自己的名称比如ik分词器实际是:ik_smart
1、下载镜像
docker pull mobz/elasticsearch-head:5-alpine
2、启动镜像
docker run -d \
--name=elasticsearch-head \
--restart=always \
-p 9100:9100 \
docker.io/mobz/elasticsearch-head:5-alpine
直接IP+9100,就可访问,这里如果你的elasticsearch配置的有用户名和密码放问的时候在url链接上加“?auth_user=用户名&auth_password=密码”