JavaEE 企业级分布式高级架构师(十七)ElasticSearch全文检索(2)

实操篇

ElasticSearch相关软件安装

ES单机安装

下载安装包
  • 官网地址:https://www.elastic.co/cn/
  • 下载地址:https://www.elastic.co/cn/downloads/elasticsearch
    在这里插入图片描述
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.0-linux-x86_64.tar.gz
解压缩修改配置文件
  • cd 到 ElasticSearch 下载目录,并进行解压缩
cd /usr/tools
tar -zxvf elasticsearch-7.2.0-linux-x86_64.tar.gz -C /usr/apps/elasticsearch/
  • cd 到 ElasticSearch 解压缩目录,并修改配置文件
cd /usr/apps/elasticsearch/elasticsearch-7.2.0
vim config/elasticsearch.yml
  • 注意修改点:
cluster.name: my-application
node.name: node-1
# 设置外网访问,默认配置外网无法访问
network.host: 192.168.254.120
http.port: 9200
# 设置集群master节点
cluster.initial_master_nodes: ["node-1"]
  • 如果不设置集群节点,就会报错:
[1]: 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
启动ElasticSearch
  • 不要以root用户进行启动
    在这里插入图片描述
  • 设置用户名和密码
useradd yangwei 
echo "Password" | passwd yangwei --stdin
  • 修改elasticsearch目录所有者
[root@localhost elasticsearch-7.2.0]# chown -R yangwei:yangwei ./

在这里插入图片描述

  • 修改root权限
vim /etc/sudoers

在这里插入图片描述

  • 启动
su yangwei
bin/elasticsearch

在这里插入图片描述

修改系统环境变量
vim /etc/sysctl.conf
  • 添加如下内容:
[yangwei@localhost elasticsearch-7.2.0]$ sudo vim /etc/sysctl.conf

在这里插入图片描述

  • 修改完后需要重新启动才能生效
[yangwei@localhost elasticsearch-7.2.0]$ sysctl -a | grep vm.max_map_count
[yangwei@localhost elasticsearch-7.2.0]$ sudo sysctl -w vm.max_map_count=262144

在这里插入图片描述

修改JVM分配大小

主要xms和xmx大小要一致

vim config/jvm.options

在这里插入图片描述

修改最大文件描述符数量和用户最大线程数
[yangwei@localhost elasticsearch-7.2.0]$ sudo vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096

在这里插入图片描述

  • 注意:此文件修改后需要重新登录用户,才会生效。
  • 重启查看:
# 查看最大文件描述符
ulimit -Hn 
# 查看用户最大线程数
ulimit -u

在这里插入图片描述

后台启动
bin/elasticsearch &
# 或者
bin/elasticsearch -d
  • 启动成功
    在这里插入图片描述
  • 查看进程
    在这里插入图片描述
  • 访问一下:http://192.168.254.120:9200/
    在这里插入图片描述
    http://192.168.254.120:9200/_cat/health
    在这里插入图片描述

使用Docker容器安装ES

#搜索镜像
docker search elasticsearch
#拉取镜像
docker pull elasticsearch:6.2.4
#创建容器
docker create --name elasticsearch --net host -e "discovery.type=single- node" -e
"network.host=192.168.254.120" elasticsearch:6.2.4
#启动
docker start elasticsearch
#查看日志
docker logs elasticsearch

Head插件安装

head插件主要用途
  • elasticsearch-head是一个用来浏览、与Elastic Search簇进行交互的web前端展示插件。
  • elasticsearch-head是一个用来监控Elastic Search状态的客户端插件。
  • elasticsearch主要有以下三个主要操作:
    • 簇浏览,显示簇的拓扑并允许你执行索引(index)和节点层面的操作。
    • 查询接口,允许你查询簇并以原始json格式或表格的形式显示检索结果。
    • 显示簇状态,有许多快速访问的tabs用来显示簇的状态。
    • 支持Restful API接口,包含了许多选项产生感兴趣的结果,包括:
      • ① 请求方式:get、put、post、delete;json请求数据,节点node,路径path。
      • ② JSON验证器。
      • ③ 定时请求的能力。
      • ④ 用javascript表达式传输结果的能力。
      • ⑤ 统计一段时间的结果或该段时间结果比对的能力。
      • ⑥ 以简单图表的形式绘制传输结果。
安装
  • 下载node,并解压
# 下载nodejs,head插件运行依赖node
wget https://npm.taobao.org/mirrors/node/v14.13.0/node-v14.13.0-linux-x64.tar.xz
# 解压
tar -xf node-v14.13.0-linux-x64.tar.xz -C /usr/apps/
  • 配置profile:
[root@centos102 apps]# vim /etc/profile
# 将node的路径添加到path中
export NODE_HOME=/usr/apps/node-v14.13.0-linux-x64
export PATH=$PATH:${NODE_HOME}/bin
# 刷新配置
[root@centos102 apps]# source /etc/profile
[root@centos102 apps]# node -v
v14.13.0
  • 下载 head 插件
# 下载
wget https://github.com/mobz/elasticsearch-head/archive/master.zip
# 解压
unzip master.zip
  • 配置淘宝镜像加速
npm install -g cnpm --registry=https://registry.npm.taobao.org
# 进入head插件解压目录,执行安装命令
[root@centos102 elasticsearch-head-master]# npm start

> elasticsearch-head@0.0.0 start /usr/apps/elasticsearch-head-master
> grunt server

Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
运行
# 启动head插件
npm start
  • 访问:

在这里插入图片描述

  • 启用cors跨域支持:当head插件访问es时,必须在elasticsearch中启用CORS,否则您的浏览器将拒绝跨域。
# 在elasticsearch配置中增加:
http.cors.enabled: true
# 还必须设置,http.cors.allow-origin因为默认情况下不允许跨域。http.cors.allow-origin: "*" 是允许配置的,但由于这样配置的任何地方都可以访问,所以有安全风险。
http.cors.allow-origin: "*"
  • 再次访问head插件:

在这里插入图片描述

LogStash安装

LogStash介绍
  • Logstash是一个具有实时管道的开源数据收集引擎。可以动态地统一不同来源的数据,并将数据归到不同目的地。也是一个管理事件和日志工具。你可以用它来收集日志,分析它们,并将它们储存起来以供以后使用。
  • Logstash 通常都是和 Kibana 以及 Elasticsearch 一起使用。
  • 文档:https://www.elastic.co/guide/en/logstash/current/index.html
LogStash安装
  • 下载并解压
# 注意版本和elasticsearch,kibana 必须保持一致
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.2.0.tar.gz 
# 解压
tar -zxvf logstash-7.2.0.tar.gz -C /usr/apps
  • 启动与使用:
# 基本的 intput output
# stdin stdout 输入输出插件
./logstash -e 'input{ stdin{} } output{ stdout{} }'
# codec
./logstash -e 'input{ stdin{} } output{ stdout{ codec => json } }'
# 日志内容写入elasticsearch
./logstash -e 'input{ stdin{} } output{ elasticsearch{hosts => ["192.168.254.120:9200"]} }'
# 日志内容写入elasticsearch,同时输出
# 注意elasticsearch插件的语法格式:hosts 对应数组
./logstash -e 'input{ stdin{} } output{ elasticsearch{hosts => ["192.168.254.120:9200"]} stdout{} }'

-e:设置启动参数
input、output:是logstash的插件
stdin{}:等待输入插件
stdout{}:输出日志插件
codec:编码创建

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

LogStash相关插件
input插件
  • 输入比较常见的几个插件:stdin、file、http、tcp
PluginDescriptionGithub repository
stdinReads events from standard inputlogstash-input-stdin
fileStreams events from fileslogstash-input-file
httpReceives events over HTTP or HTTPSlogstash-input-http
tcpReads events from a TCP socketlogstash-input-tcp
output插件
  • 输入比较常见的几个插件:stdin、file、http、tcp
PluginDescriptionGithub repository
stdoutPrints events to the standard outputlogstash-output-stdout
fileWrites events to files on disklogstash-output-file
httpSends events to a generic HTTP or HTTPS endpointlogstash-output-http
tcpWrites events over a TCP sockettlogstash-output-tcp
  • 把日志内容输出到elasticsearch插件:
PluginDescriptionGithub repository
elasticsearchStores logs in Elasticsearchlogstash-output-elasticsearch
codec插件
  • Codec(Code Decode)Plugin作用于input和output plugin,负责将数据在原始与Logstash之间转换,常见的codec有:
    • plain:读取原始内容
    • dots:将内容简化为点进行输出
    • rubydebug:将内容按照ruby格式输出,方便调试 line 处理带有换行符的内容
    • json:处理json格式的内容
    • multiline:处理多行数据的内容
LogStash配置
创建配置
  • 在config目录下创建 logstash.conf 配置文件:

在这里插入图片描述

配置语法
  • logstash.conf 配置:
input { stdin {} }
output {
  elasticsearch { hosts => ["192.168.254.120:9200"] }
  stdout { codec => rubydebug }
}
  • 启动:
bin/logstash -f config/logstash.conf
File日志收集
  • file.conf配置:
# 建立新的配置文件
mv logstash.conf file.conf
# 详细配置如下:
input {  
  file {
    path => "/var/log/messages"  # 收集messages文件日志
    type => "system"
    start_position => "beginning"  # 记录上次收集的位置
  }
}
output {
  elasticsearch { 
    hosts => ["192.168.254.120:9200"]  # 写入elasticsearch的地址
    index => "system-%{+YYYY.MM.dd}"  # 定义索引的名称
  }
  stdout { codec => rubydebug }
}
  • 启动:
bin/logstash -f config/file.conf
Java日志收集
  • 在原来file文件的基础上进行编辑
input {
  file {
    path => "/var/log/messages"
    type => "system"
    start_position => "beginning"
  }
  # 加一个file文件收集日志插件,收集elasticsearch日志、es就是java语言开发的。
  file {
    path => "/usr/apps/elasticsearch-7.2.0/logs/yw-es.log"
    type => "es-info"
    start_position => "beginning"
  }
}
output {
  if [type] == "system" {
    elasticsearch {
      hosts => ["192.168.254.120:9200"]
      index => "system-%{+YYYY.MM.dd}"
    }
  }
  # 判断,导入到不同的索引库,否则会放入同一个索引库中
  if [type] == "es-info" {
    elasticsearch {
      hosts => ["192.168.254.120:9200"]
      index => "es-info-%{+YYYY.MM.dd}"
    }
  }
  stdout { codec => rubydebug }
}
  • 问题:目前导入日志都是按照行导入的、但是有些日志多行是一句话,如果分开的话,就不太容查看日志的完整的意思了。

在这里插入图片描述

  • 解决方案:可以使用codec来进行解决,codec把多行日志:
input {
  file {
    path => "/var/log/messages"
    type => "system"
    start_position => "beginning"
  }
  file {
    path => "/usr/apps/elasticsearch-7.2.0/logs/yw-es.log"
    type => "es-info"
    start_position => "beginning"
    # 使用正则表达式,合并多行日志
    codec => multiline {
      pattern => "^\["    # 发现中括号,就合并日志
      negate => true
      what => "previous"
    }
  }
}
output {
  if [type] == "system" {
    elasticsearch {
      hosts => ["192.168.254.120:9200"]
      index => "system-%{+YYYY.MM.dd}"
    }
  }
  if [type] == "es-info" {
    elasticsearch {
      hosts => ["192.168.254.120:9200"]
      index => "es-info-%{+YYYY.MM.dd}"
    }
  }
  stdout { codec => rubydebug }
}
项目日志
  • 配置如下:
input {
  tcp {
    port => 9600
    codec => json
  }
}
output {
  elasticsearch {
    hosts => ["192.168.254.120:9200"]
    index => "yw-log-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }
}

Kibana安装

Kibana插件介绍
  • kibana 插件提供了Marvel监控的UI界面。
  • kibana是一个与elasticsearch一起工作的开源的分析和可视化的平台。使用kibana可以查询、查看并与存储在elasticsearch索引的数据进行交互操作。使用kibana能执行高级的数据分析,并能以图表、表格和地图的形式查看数据。 kibana使得理解大容量的数据变得非常容易。它非常简单,基于浏览器的接口使我们能够快速的创建和分享显示elasticsearch查询结果实时变化的仪表盘。
Kibana下载安装
  • 下载并解压:
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.2.0-linux-x86_64.tar.gz
tar -zxvf kibana-7.2.0-linux-x86_64.tar.gz -C /usr/apps/elasticsearch/
cd /usr/apps/elasticsearch/kibana-7.2.0-linux-x86_64/
vim config/kibana.yml

在这里插入图片描述

  • 启动:注意,kibana同样不能在 root 下启动
[root@localhost kibana-7.2.0-linux-x86_64]# chown -R yangwei:yangwei ./
# 启动
./bin/kibana
# 后台启动
./bin/kibana &

在这里插入图片描述

  • 访问一下:http://192.168.254.120:5601
    在这里插入图片描述
日志视图
  • 创建日志:
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 日志展示:

在这里插入图片描述

可视化数据
  • 在Visualize应用程序中,你可以使用各种图表、表格和地图等来塑造数据,你将创建可视化效果:饼图、柱状图、坐标图和Markdown小部件等。

在这里插入图片描述

  • 创建好了后保存

在这里插入图片描述

  • 在Dashboard添加视图模块

在这里插入图片描述

在这里插入图片描述

分词器

下载分词器,并解压到 ElasticSearch 安装目录下的 plugins 目录

ik分词器
  • 下载
[root@localhost ik]# pwd
/usr/apps/elasticsearch/elasticsearch-7.2.0/plugins/ik
[root@localhost ik]# wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.2.0/elasticsearch-analysis-ik-7.2.0.zip
拼音分词器
  • 下载
[root@localhost pinyin]# pwd
/usr/apps/elasticsearch/elasticsearch-7.2.0/plugins/pinyin
[root@localhost pinyin]# wget https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v7.2.0/elasticsearch-analysis-pinyin-7.2.0.zip
测试
  • 重启 ElasticSearch,利用 kibana 可视化界面的开发者工具进行测试
  • simple分词器,测试语句
POST /_analyze 
{ 
  "analyzer": "simple", 
  "text": "我是一个程序员,咿呀咿呀哟!" 
}

在这里插入图片描述

  • ik 分词器,测试语句
POST /_analyze 
{"analyzer": "ik_smart", "text": "我是一个程序员,咿呀咿呀哟!"}

在这里插入图片描述

  • pinyin 分词器,测试语句
# 先创建索引
PUT py_test
{
  "settings": {
    "index": {
  		"analysis": {
  			"analyzer": {
  				"pinyin_analyzer": {
  					"tokenizer": "my_pinyin",
  					"filter": "word_delimiter"
  				}
  			},
  			"tokenizer": {
  				"my_pinyin": {
  					"type": "pinyin",
  					"first_letter": "none",
  					"padding_char": " "
  				}
  			}
  		}
  	}
  }
}
# 测试
GET /py_test/_analyze 
{"text": ["刘德华"], "analyzer": "pinyin_analyzer"}

在这里插入图片描述
在这里插入图片描述

集群搭建

  • 安装的版本:elasticsearch-7.2.0
  • 该版本不用安装 JDK,其自带了 OpenJDK12.0.1
  • 配置文件中,集群发现有改动
  • 配置:
192.168.254.120    	node-0
192.168.254.102		node-1
192.168.254.104		node-2
集群配置
  • 修改配置文件 elasticsearch.yml
# ES集群名称
cluster.name: yw-es
# 当前ES节点名称,每个节点的名称不能相同
node.name: node-0
# 设置外网访问,默认配置外网无法访问
network.host: 192.168.254.120
# 端口
http.port: 9200
# 集群节点列表
discovery.seed_hosts: ["192.168.254.120", "192.168.254.102", "192.168.254.104"]
# 设置集群可以选举的主节点
cluster.initial_master_nodes: ["node-0", "node-1", "node-2"]
# ES集群名称
cluster.name: yw-es
# 当前ES节点名称,每个节点的名称不能相同
node.name: node-1
# 设置外网访问,默认配置外网无法访问
network.host: 192.168.254.102
# 端口
http.port: 9200
# 集群节点列表
discovery.seed_hosts: ["192.168.254.120", "192.168.254.102", "192.168.254.104"]
# 设置集群可以选举的主节点
cluster.initial_master_nodes: ["node-0", "node-1", "node-2"]
# ES集群名称
cluster.name: yw-es
# 当前ES节点名称,每个节点的名称不能相同
node.name: node-2
# 设置外网访问,默认配置外网无法访问
network.host: 192.168.254.104
# 端口
http.port: 9200
# 集群节点列表
discovery.seed_hosts: ["192.168.254.120", "192.168.254.102", "192.168.254.104"]
# 设置集群可以选举的主节点
cluster.initial_master_nodes: ["node-0", "node-1", "node-2"]
  • 启动集群:启动各个ES结点
集群状态检查
http://192.168.254.120:9200/_cat/health?v

在这里插入图片描述

  • 或者在kibana上查看
    在这里插入图片描述

ElasticStack

在这里插入图片描述

  • ElasticStack(ELK) = elasticsearch+Logstash+kibana
  • elasticsearch:后台分布式存储以及全文检索;logstash:日志加工、“搬运工”;kibana:数据可视化展示。
  • ELK架构为数据分布式存储、可视化查询和日志解析创建了一个功能强大的管理链。 三者相互配合,取长补短,共同完成分布式大数据处理工作。
创建项目
  • 定义SpringBoot工程logstash-demo
  • 引入依赖:
<dependency>
  <groupId>net.logstash.logback</groupId>
  <artifactId>logstash-logback-encoder</artifactId>
  <version>5.2</version>
</dependency>
代码实现
  • 控制器:
@Slf4j
@RestController
public class LogController {

    @RequestMapping("/hello")
    public Object sayHello(String name) {
        log.debug("开始执行sayHello方法");
        log.info("hello:" + name);
        log.debug("sayHello方法执行完毕");
        return "OK";
    }
}
  • 配置文件:
server:
  port: 8080
# 加载日志文件
logging:
  config: classpath:logback-spring.xml
  • 日志配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <include resource="org/springframework/boot/logging/logback/base.xml"/>

  <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>192.168.254.104:9600</destination>
    <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
  </appender>

  <root level="INFO">
    <appender-ref ref="LOGSTASH"/>
    <appender-ref ref="CONSOLE"/>
  </root>
</configuration>
测试
  • logstash配置文件:
input {
  tcp {
    port => 9600
    codec => json
  }
}
output {
  elasticsearch {
    hosts => ["192.168.254.120:9200"]
    index => "server-log-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }
}
  • 访问:http://localhost:8080/hello?name=zhangsan

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讲文明的喜羊羊拒绝pua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值