elasticsearch实战
elasticsearch简介
Elasticsearch 是一个开源的分布式搜索分析引擎,建立在一个全文搜索引擎库 Apache Lucene基础之上。
Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎:
一个分布式的实时文档存储,每个字段 可以被索引与搜索
一个分布式实时分析搜索引擎
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
基础模块
cluster:管理集群状态,维护集群层面的配置信息。
alloction:封装了分片分配相关的功能和策略。
discovery:发现集群中的节点,以及选举主节点。
gateway:对收到master广播下来的集群状态数据的持久化存储。
indices:管理全局级的索引设置。
http:允许通过JSON over HTTP的方式访问ES的API。
transport:用于集群内节点之间的内部通信。
engine:封装了对Lucene的操作及translog的调用。
elasticsearch应用场景:
信息检索
日志分析
业务数据分析
数据库加速
运维指标监控
官网:https://www.elastic.co/cn/
elasticsearch安装与配置
软件下载:
https://elasticsearch.cn/download/
安装软件
#rpm -ivh jdk-8u171-linux-x64.rpm
#rpm -ivh elasticsearch-7.6.1.rpm //7.6版本自带jdk
设置服务自启:
#systemctl daemon-reload
#systemctl enable elasticsearch
修改配置文件:
#vim /etc/elasticsearch/elasticsearch.yml
cluster.name: my-es #集群名称
node.name: server7 #主机名需要解析
path.data: /var/lib/elasticsearch #数据目录
path.logs: /var/log/elasticsearch #日志目录
bootstrap.memory_lock: true #锁定内存分配
network.host: 172.25.0.7 #主机ip
http.port: 9200 #http服务端口
cluster.initial_master_nodes: ["server3"]
修改系统限制
#vim /etc/security/limits.conf
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch - nofile 65536
elasticsearch - nproc 4096
#vim jvm.options
-Xms1g
-Xmx1g
Xmx设置不超过物理RAM的50%,以确保有足够的物理RAM留给内核文件系统缓存。但不要超过32G。
修改systemd启动文件
#vim /usr/lib/systemd/system/elasticsearch.service
[Service] #在service语句块下添加
LimitMEMLOCK=infinity
#systemctl daemon-reload
#systemctl start elasticsearch
测试
elasticsearch插件安装
下载elasticsearch-head插件
#wget https://github.com/mobz/elasticsearch-head/archive/master.zip
#unzip elasticsearch-head-master.zip
head插件本质上是一个nodejs的工程,因此需要安装node:
#wget https://mirrors.tuna.tsinghua.edu.cn/nodesource/rpm_9.x/el/7/x86_64/nodejs-9.11.2-1nodesource.x86_64.rpm
#rpm -ivh nodejs-9.11.2-1nodesource.x86_64.rpm
#node -v
#npm -v
更换npm源安装
#cd elasticsearch-head-master/
#npm install --registry=https://registry.npm.taobao.org
修改ES主机ip和端口
#vim _site/app.js
“http://172.25.0.7:9200”
启动head插件
#npm run start &
修改ES跨域主持
#vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true # 是否支持跨域
http.cors.allow-origin: "*" # *表示支持所有域名
重启ES服务
#systemctl restart elasticsearch.service
访问head插件服务
修改elasticsearch-head下Gruntfile.js文件,默认监听在9100端口:
创建索引
查看ES状态
elasticsearch分布式部署
以相同的方法再安装两个ES节点,配置如下:
节点1:
#grep -v ^# /etc/elasticsearch/elasticsearch.yml
cluster.name: my-es
node.name: server13
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 172.25.0.13
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["server13", "server14", "server15"]
节点2:
#grep -v ^# /etc/elasticsearch/elasticsearch.yml
cluster.name: my-es
node.name: server14
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 172.25.0.14
http.port: 9200
discovery.seed_hosts: ["server13", "server14", "server15"]
节点3:
#grep -v ^# /etc/elasticsearch/elasticsearch.yml
cluster.name: my-es
node.name: server15
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 172.25.0.15
http.port: 9200
discovery.seed_hosts: ["server13", "server14", "server15"]
查看ES集群状态
elasticsearch节点角色
Master:
主要负责集群中索引的创建、删除以及数据的Rebalance等操作。Master不负责数据的索引和检索,所以负载较轻。当Master节点失联或者挂掉的时候,ES集群会自动从其他Master节点选举出一个Leader。
Data Node:
主要负责集群中数据的索引和检索,一般压力比较大。
Coordinating Node:
原来的Client node的,主要功能是来分发请求和合并结果的。所有节点默认就是Coordinating node,且不能关闭该属性。
Ingest Node:
专门对索引的文档做预处理
elasticsearch节点优化
在生产环境下,如果不修改elasticsearch节点的角色信息,在高数据量,高并发的场景下集群容易出现脑裂等问题。
默认情况下,elasticsearch集群中每个节点都有成为主节点的资格,也都存储数据,还可以提供查询服务。
节点角色是由以下属性控制:
node.master: false|true
node.data: true|false
node.ingest: true|false
search.remote.connect: true|false
默认情况下这些属性的值都是true。
node.master:这个属性表示节点是否具有成为主节点的资格
注意:此属性的值为true,并不意味着这个节点就是主节点。
因为真正的主节点,是由多个具有主节点资格的节点进行选举产生的。
node.data:这个属性表示节点是否存储数据。
node.ingest: 是否对文档进行预处理。
search.remote.connect:是否禁用跨集群查询
第一种组合:(默认)
node.master: true
node.data: true
node.ingest: true
search.remote.connect: true
这种组合表示这个节点即有成为主节点的资格,又存储数据。
如果某个节点被选举成为了真正的主节点,那么他还要存储数据,这样对于这个节点的压力就比较大了。
测试环境下这样做没问题,但实际工作中不建议这样设置。
第二种组合:(Data node)
node.master: false
node.data: true
node.ingest: false
search.remote.connect: false
这种组合表示这个节点没有成为主节点的资格,也就不参与选举,只会存储数据。
这个节点称为data(数据)节点。在集群中需要单独设置几个这样的节点负责存储数据。后期提供存储和查询服务。
第三种组合:(master node)
node.master: true
node.data: false
node.ingest: false
search.remote.connect: false
这种组合表示这个节点不会存储数据,有成为主节点的资格,可以参与选举,有可能成为真正的主节点。
这个节点我们称为master节点。
第四种组合:(Coordinating Node)
node.master: false
node.data: false
node.ingest: false
search.remote.connect: false
这种组合表示这个节点即不会成为主节点,也不会存储数据,
这个节点的意义是作为一个协调节点,主要是针对海量请求的时候可以进行负载均衡。
第五种组合:(Ingest Node)
node.master: false
node.data: false
node.ingest: true
search.remote.connect: false
这种组合表示这个节点即不会成为主节点,也不会存储数据,
这个节点的意义是ingest节点,对索引的文档做预处理。
节点优化总结
生产集群中可以对这些节点的职责进行划分
建议集群中设置3台以上的节点作为master节点,这些节点只负责成为主节点,维护整个集群的状态。
再根据数据量设置一批data节点,这些节点只负责存储数据,后期提供建立索引和查询索引的服务,这样的话如果用户请求比较频繁,这些节点的压力也会比较大。
所以在集群中建议再设置一批协调节点,这些节点只负责处理用户请求,实现请求转发,负载均衡等功能。
节点需求
master节点:普通服务器即可(CPU、内存 消耗一般)
data节点:主要消耗磁盘、内存。
path.data: data1,data2,data3
这样的配置可能会导致数据写入不均匀,建议只指定一个数据路径,磁盘可以使用raid0阵列,而不需要成本高的ssd。
Coordinating节点:对cpu、memory要求较高。
调整后的ES集群状态
logstash数据采集
logstash简介(续)
Logstash是一个开源的服务器端数据处理管道。
logstash拥有200多个插件,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的 “存储库” 中。(大多都是 Elasticsearch。)
Logstash管道有两个必需的元素,输入和输出,以及一个可选元素过滤器。
输入:
采集各种样式、大小和来源的数据
Logstash 支持各种输入选择 ,同时从众多常用来源捕捉事件。
能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。
Logstash安装与配置
软件下载
https://elasticsearch.cn/download/
logstash安装
#rpm -ivh jdk-8u171-linux-x64.rpm
#rpm -ivh logstash-7.6.1.rpm
标准输入到标准输出
/usr/share/logstash/bin/logstash -e ‘input { stdin { } } output { stdout {} }’
file输出插件
标准输入到文件
#vim /etc/logstash/conf.d/file.conf
input {
stdin { }
}
output {
file {
path => "/tmp/logstash.txt" #输出的文件路径
codec => line { format => "custom format: %{message}"} #定制数据格式
}
}
file输出插件(续)
指定配置文件运行
#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/file.conf
在标准输入中键入"hello world"后可以查看:
#cat /tmp/logstash.txt
custom format: hello world
elasticsearch输出插件
标准输入到es主机:
#vim /etc/logstash/conf.d/es.conf
input {
stdin { }
}
output {
elasticsearch {
hosts => "172.25.0.13:9200" #输出到的ES主机与端口
index => "logstash-%{+YYYY.MM.dd}" #定制索引名称
}
}
指定配置文件运行
#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf
查看ES主机
file输入插件
把文件内容输出到es主机
#vim /etc/logstash/conf.d/es.conf
input {
file {
path => “/var/log/messages”
start_position => “beginning”
}
}
output {
elasticsearch {
hosts => “172.25.0.13:9200”
index => “syslog-%{+YYYY.MM.dd}”
template_name => “system_template”
}
}
指定配置文件运行
#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf
查看ES主机
logstash如何区分设备、文件名、文件的不同版本
logstash会把进度保存到sincedb文件中
#find / -name .sincedb*
/usr/share/logstash/data/plugins/inputs/file/.sincedb_452905a167cf4509fd08acb964fdb20c
#cd /usr/share/logstash/data/plugins/inputs/file/
#cat .sincedb_452905a167cf4509fd08acb964fdb20c
20297 0 64768 119226 1551859343.6468308 /var/log/messages
#ls -i /var/log/messages
20297 /var/log/messages
sincedb文件内容解释
#cat .sincedb_452905a167cf4509fd08acb964fdb20c
20297 0 64768 119226 1551859343.6468308 /var/log/messages
sincedb文件一共6个字段
inode编号
文件系统的主要设备号
文件系统的次要设备号
文件中的当前字节偏移量
最后一个活动时间戳(浮点数)
与此记录匹配的最后一个已知路径
Syslog输入插件
logstash可以伪装成日志服务器,直接接受远程日志。
#vim /etc/logstash/conf.d/syslog.conf
input {
syslog {
type => "rsyslog"
port => 514 #日志收集端口
}
}
output {
stdout { }
}
指定配置文件运行
#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/syslog.conf
#netstat -antulp |grep :514
tcp6 0 0 :::514 :::* LISTEN 3171/java
udp 0 0 0.0.0.0:514 0.0.0.0:* 3171/java
配置客户端传入日志
#vim /etc/rsyslog.conf
*.* @@172.25.0.13:514
#systemctl restart rsyslog
查看logstash上的标准输出
多行过滤插件
多行过滤可以把多行日志记录合并为一行事件
#vim /etc/logstash/conf.d/multiline.conf
input {
stdin {
codec => multiline {
pattern => “^EOF”
negate => true
what => previous
}
}
}
output {
stdout {}
}
多行过滤插件(续)
指定配置文件运行
#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/filter.conf
查看输出
grok过滤插件
grok过滤
#vim /etc/logstash/conf.d/grok.conf
input {
stdin {}
}
filter {
grok {
match => { “message” => “%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}” }
}
}
output {
stdout {}
}
指定配置文件运行
#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/grok.conf
查看输出
55.3.244.1 GET /index.html 15824 0.043
apache服务日志过滤实战
#vim /etc/logstash/conf.d/apache.conf
input {
file {
path => “/var/log/httpd/access_log”
start_position => “beginning”
}
}
filter{
grok {
match => { “message” => “%{HTTPD_COMBINEDLOG}” }
}
}
output {
elasticsearch {
hosts => “172.25.0.13:9200”
index => “apachelog-%{+YYYY.MM.dd}”
}
}
指定配置文件运行
#/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/apache.conf
查看输出
kibana数据可视化
kibana简介
Kibana 核心产品搭载了一批经典功能:柱状图、线状图、饼图、旭日图,等等。
将地理数据融入任何地图
利用 Graph 功能分析数据间的关系
Kibana 开发工具为开发人员提供了多种强大方法来帮助其与 Elastic Stack 进行交互。
kibana安装与配置
kibana下载
https://elasticsearch.cn/download/
#rpm -ivh kibana-7.6.1-x86_64.rpm
kibana配置:
#vim /etc/kibana/kibana.yml
server.port: 5601 #服务端口
server.host: “172.25.0.17” #服务监听地址
elasticsearch.hosts: [“http://172.25.0.13:9200”] #ES集群地址
kibana.index: “.kibana” #kibana在ES中创建的索引
i18n.locale: “zh-CN”
启动kibana服务
#systemctl enable kibana
#systemctl start kibana
#netstat -antlp|grep :5601
tcp 0 0 172.25.0.17:5601 0.0.0.0:* LISTEN 1159/node
访问kibana
kibana使用
创建索引匹配
基于ES索引创建可视化
生成访问量可视化
创建柱状图(访问量排行榜)
创建dashboard
启用xpack安全验证
集群模式需要先创建证书:
#cd /usr/share/elasticsearch/
#bin/elasticsearch-certutil ca
#bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
#cp elastic-certificates.p12 elastic-stack-ca.p12 /etc/elasticsearch
#cd /etc/elasticsearch
#chown elasticsearch elastic-certificates.p12 elastic-stack-ca.p12
配置所有的elasticsearch集群节点:
#vim /etc/elasticsearch/elasticsearch.yml
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/elastic-certificates.p12
ES集群重启正常后,设置用户密码:
设置kibana连接ES的用户密码:
#vim /etc/kibana/kibana.yml
elasticsearch.username: "kibana"
elasticsearch.password: "westos"
设置Logstash连接ES用户密码:
output {
elasticsearch {
hosts => "172.25.0.13:9200"
index => "apachelog-%{+YYYY.MM.dd}"
user => "elastic"
password => "westos"
}
}
head访问
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type //添加参数到es配置
http://172.25.0.13:9100/?auth_user=elastic&auth_password=westos