前言
Elasticsearch是什么?为什么每次学习一门技术都是英文的呢?真的是脑阔疼。既然它是英文的,我们不妨借助有道来初步的看看Elasticsearch
到底是何方神圣,竟如此多娇。其分为elastic和search两个独立的单词,我们来无脑有道一波看看,得到的解释如下:
从有道的解释来看,我们可以简单的对其理解为:Elasticsearch是及其具有弹性的、灵活的、像松紧带一样的且可供搜寻检索的一款工具。o(*≧▽≦)ツ┏━┓
百度百科对其解释如下:
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache、Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
从如上信息我们可以得知,Elasticsearch是一款实时、分布式存储的搜索引擎,在实际开发过程中,我们常常会把数据放在Elasticsearch搜索引擎中,然后从引擎中去实际需要的数据。而且在实际搜索过程中,我们也会有许多的Api支持来对数据进行检索,比如排序、条件查询等,其中在Elasticsearch中最为强大之处就是他的模糊检索功能。讲到这,可能有些Mysql经验但没接触过Elasticsearch的朋友可能会有个疑问,Mysql大法不是无敌么,其中的like
语句不能模糊查询么?where and
不能条件检索么?orderby
不能对数据进行排序么?我随随便便就信手拈来一个Sql语句不就能实现业务的需求么:
select department_name, count(*) 员工个数
from departments d, employees e
where d.department_id = e.department_id
group by d.department_id
having count(*)>5
order by count(*) desc;
是这样没错,以上SQL代码的确能够实现实际需求,但是当我们的业务逐渐变得复杂、庞大,我们的用户量越来越多,我们就不得不站在用户的角度来想想了。试想一下,假设哪些淘宝er每天打开淘宝搜索自己想要的数据时都要等个几十秒,那会是怎样的一种画面。又比如,在打开我们常见文件来检索我们需要数据的时候,比如txt、word、excel,我们一般都能迅速打开,那是因为这些文件占用实际空间都太小,这些文件大多就几kb,假设我们打开一个以G为单位的日志文件,此时的系统还能像以往那样正常么?换言之,Elasticsearch采用的是索引搜索,能够具有强大的搜索能力,能够达到实时搜索,稳定,可靠,快速,安装的效用。
另外,Elasticsearch在处理日志的过程中,其常常与数据收集和日志解析引擎Logstash以及名为Kibana的分析和可视化平台配合使用,也就是常说的ELK
系统。文本将主要介绍以下几个方面的内容
- 基于Docker容器来搭建ELK
- Elasticsearch集群的搭建
- 在Elasticsearch中引入IK分词器插件
- 基于Logstash对Elasticsearch索引库中数据的导入和导出
一、ELK系统的搭建
Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
1
Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据
总结就是Elasticsearch用于搜索,Kibana用于可视化,Logstash用于搜集。下面我们来基于Docker来搭建一下ELK系统,关于Docker的安装及基本使用,前面的文章已经有过记录了,此处不再过多的介绍。另外,值得注意的是这三者之间的版本关系,(如果使用其他版本的工具,则按照如下方式搭建可能会产生其他问题):
- Elasticsearch:5.6.8
- Kibana:5.6.8
- Logstash:lastest
Elasticsearch的安装
- Docker拉取Elasticsearch镜像
docker pull elasticsearch:5.6.8
- 在本地创建elasticsearch容器所映射的配置文件以及data目录
这里需要将http.host配置成0.0.0.0的授权对象,并将配置写入config目录下的elasticsearch.yml配置文件中
# 在centos本地创建配置文件,并配置
mkdir -p /resources/elasticsearch/config # 创建config目录
mkdir -p /resources/elasticsearch/data # 创建data目录
# 将http.host配置为0.0.0.0的授权对象,将配置写入config目录下的elasticsearch.yml配置文件中
echo "http.host: 0.0.0.0" >> /resources/elasticsearch/config/elasticsearch.yml
- 创建一个elasticsearch容器,并开机自运行
首先需要创建容器并开机运行(single-node表示单节点模式,后面会介绍集群方式下elasticsearch的搭建),然后将elasticsearch容器设置为开机自启动。穿件es容器时的参数介绍如下:
- --name:为容器起一个别名
- -p:将容器的运行端口映射到本地端口
- "discovery.type=single-node":表示单节点模式下创建,后文将介绍集群模式的搭建
- -v:表示将容器中的配置文件和data文件映射到上文本地所创建的文件,方便后面的配置
# 创建容器并开机运行(single-node表示单节点模式,后面会介绍集群方式下elasticsearch的搭建)
# 注意:在docker中\表示换行
docker run --name elasticsearch -p 9200:9200 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
-v /resources/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /resources/elasticsearch/data:/usr/share/elasticsearch/data -d elasticsearch:5.6.8
# 参数介绍:
# --name:为容器起一个别名
# -p:将容器的运行端口映射到本地端口
# -e "discovery.type=single-node":表示单节点模式下创建,后文将介绍集群模式的搭建
# -v:表示将容器中的配置文件和data文件映射到上文本地所创建的文件,方便后面的配置
# 将elasticsearch容器设置为开机自启动
docker update new-elasticsearch --restart=always
这样一来,我们便安装好elasticsearch了,我们可以使用curl
命令来测试一下:
# 使用curl来访问elasticsearch的运行端口
curl localhost:9200
# 运行输出结果如下则成功安装
{
"name" : "XwmNOpR",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "yB3VNHxmQzevk1vXUQTkcg",
"version" : {
&nb