ELK
ELK是一套开源的日志分析系统,由elasticsearch+logstash+Kibana组成。
官网说明
:
https://www.elastic.co/cn/products
首先
:
先一句话简单了解
E,L,K
这三个软件
elasticsearch:
分布式搜索引擎
logstash:
日志收集与过滤,输出给
elasticsearch
Kibana:
图形化展示
elasticsearch
elasticsearch简介
Elasticsearch(
简称
ES)
是一个
开源的分布式搜索引擎
,Elasticsearch
还是一个
分布式文档数据库
。所以它
提供了大量数据的
存储
功能
,
快速的
搜索
与
分析
功能。
提到搜索
,
大家肯定就想到了百度
,
谷歌
,
必应等。当然也有如下的搜索场景。
elasticsearch集群部署
集群部署主要注意以下几个方面
1. 集群配置参数:
discovery.zen.ping.unicast.hosts
,
Elasticsearch
默认使用
Zen Discovery
来做节点发现机
制,推荐使用
unicast
来做通信方式,在该配置项中列举出
Master
节点。
discovery.zen.minimum_master_nodes
,该参数表示集群中
Master
节点可工作
Master
的最
小票数,默认值是
1
。为了提高集群的可用性,避免脑裂现象。官方推荐设置为
(N/2)+1
,其中
N
是具有
Master
资格的节点的数量。
discovery.zen.ping_timeout
,表示节点在发现过程中的等待时间,默认值是
30
秒,可以根据
自身网络环境进行调整,一定程度上提供可用性。
2. 集群节点:
节点类型主要包括
Master
节点和
data
节点
(client
节点和
ingest
节点不讨论
)
。通过设置两个配
置项
node.master
和
node.data
为
true
或
false
来决定将一个节点分配为什么类型的节点。
尽量将
Master
节点和
Data
节点分开,通常
Data
节点负载较重,需要考虑单独部署。
3. 内存:
Elasticsearch
默认设置的内存是
1GB
,对于任何一个业务部署来说,这个都太小了。通过指定
ES_HEAP_SIZE
环境变量,可以修改其堆内存大小,服务进程在启动时候会读取这个变量,并
相应的设置堆的大小。建议设置系统内存的一半给
Elasticsearch
,但是不要超过
32GB
。
4. 硬盘空间:
Elasticsearch
默认将数据存储在
/var/lib/elasticsearch
路径下,随着数据的增长,一定会出现
硬盘空间不够用的情形,大环境建议把分布式存储挂载到
/var/lib/elasticsearch
目录下以方便
扩容。
配置参考文档
:
https://www.elastic.co/guide/en/elasticsearch/reference/index.html
首先在
ES
集群所有节点都安装
ES(
步骤省略
)
可以使用两台或两台以上
ES
做集群
,
以下就是两台
ES
做集群的配置
//vm1,vm2搭建集群
//环境准备: vm1.cluster.com 192.168.35.142
// vm2.cluster.com 192.168.35.143
//vm1
//安装java软件包
[root@vm1 ~]# yum -y install java-1.8.0*
//查看java版本
[root@vm1 ~]# java -version
openjdk version "1.8.0_422"
//安装elasticsearch
[root@vm1 ~]# rz -E
rz waiting to receive.
[root@vm1 ~]# ls
anaconda-ks.cfg elasticsearch-6.5.2.rpm
[root@vm1 ~]# rpm -ivh elasticsearch-6.5.2.rpm
//修改配置文件并从重启服务
[root@vm1 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-cluster //可以自定义一个集群名称,不配置的话默认会取名为elasticsearch
node.name: 10.1.1.12 //本机IP或主机名
node.master: true //指定为master节点
path.data: /var/lib/elasticsearch //默认
path.logs: /var/log/elasticsearch 、、默认
network.host: 0.0.0.0 //打开注释,并修改为监听所有
http.port: 9200 //打开注释,监听端口9200
discovery.zen.ping.unicast.hosts: ["192.168.35.142", "192.168.35.143"] //集群所有节点IP
[root@vm1 ~]# systemctl restart elasticsearch.service
[root@vm1 ~]# systemctl enable elasticsearch.service
//验证9200,9300端口
[root@vm1 ~]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 5 127.0.0.1:25151 0.0.0.0:*
LISTEN 0 5 0.0.0.0:873 0.0.0.0:*
LISTEN 0 4096 *:9300 *:*
LISTEN 0 511 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 *:443 *:*
LISTEN 0 5 [::]:873 [::]:*
LISTEN 0 4096 *:9200 *:*
//vm2
//安装java软件包
[root@vm2 ~]# yum -y install java-1.8.0*
//查看java版本
[root@vm2 ~]# java -version
openjdk version "1.8.0_422"
//安装elasticsearch
[root@vm2 ~]# rz -E
rz waiting to receive.
[root@vm2 ~]# ls
anaconda-ks.cfg elasticsearch-6.5.2.rpm
[root@vm2 ~]# rpm -ivh elasticsearch-6.5.2.rpm
//修改配置文件并从重启服务
[root@vm2 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-cluster //可以自定义一个集群名称,不配置的话默认会取名为elasticsearch
node.name: 10.1.1.12 //本机IP或主机名
node.master: true //指定为master节点
path.data: /var/lib/elasticsearch //默认
path.logs: /var/log/elasticsearch 、、默认
network.host: 0.0.0.0 //打开注释,并修改为监听所有
http.port: 9200 //打开注释,监听端口9200
discovery.zen.ping.unicast.hosts: ["192.168.35.142", "192.168.35.143"] //集群所有节点IP
[root@vm2 ~]# systemctl restart elasticsearch.service
[root@vm2 ~]# systemctl enable elasticsearch.service
//验证9200,9300端口,使用curl命令或浏览器访问http:///192.168.35.143:9200/_cluster/health?pretty地址(IP为ES服务器IP),也可以在网页查询
[root@vm2 ~]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 4096 *:9300 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 4096 *:9200 *:*
[root@vm2 ~]# curl http://192.168.35.143:9200/_cluster/health?pretty
{
"cluster_name" : "elk-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2, //2个数据节点
"number_of_data_nodes" : 2, //2个数据节点
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
使用curl命令或浏览器访问http:///192.168.35.143:9200/_cluster/health?pretty地址(IP为ES服务器IP,访问ES集群中任何一个节点IP都可以)
elasticsearch基础概念
主要的基础概念有
:Node, Index,Type,Document,Field,shard
和
replicas.
Node(
节点
)
:运行单个
ES
实例的服务器
Cluster(
集群
)
:一个或多个节点构成集群
Index(
索引
)
:索引是多个文档的集合
Type(
类型
)
:一个
Index
可以定义一种或多种类型,将
Document
逻辑分组
Document(
文档
)
:
Index
里每条记录称为
Document
,若干文档构建一个
Index
Field(
字段
)
:
ES
存储的最小单元
Shards(
分片
)
:
ES
将
Index
分为若干份,每一份就是一个分片
Replicas(
副本
)
:
Index
的一份或多份副本
为了便于理解
,
我们和
mysql
这种关系型数据库做一个对比
:
关系型数据库
(
如
mysql,oracle
等
)
|
elasticsearch
|
database
或
schema
|
index
|
table
|
type
|
row
|
document
|
column
或
field
|
field
|
ES
是分布式搜索引擎,每个索引有一个或多个分片
(shard)
,索引的数据被分配到各个分片上。你可以看
作是一份数据分成了多份给不同的节点。
当
ES
集群增加或删除节点时
,shard
会在多个节点中均衡分配。默认是
5
个
primary shard(
主分片
)
和
1
个
replica shard(
副本
,
用于容错
)
。
elaticsearch基础API操作
什么是API? API(Application Programming Interface)
应用程序编程接口,就是无需访问程序源码或理解内部工 作机制就能实现一些相关功能的接口
。
RestFul API
格式
curl -X<verb> ‘<protocol>://<host>:<port>/<path>?<query_string>’-d ‘<body>’
参数
|
描述
|
verb
|
HTTP
方法,比如
GET
、
POST
、
PUT
、
HEAD
、
DELETE
|
host
|
ES
集群中的任意节点主机名
|
port
|
ES HTTP
服务端口,默认
9200
|
path
|
索引路径
|
query_string
|
可选的查询请求参数。例如
?pretty
参数将返回
JSON
格式数据
|
-d
|
里面放一个
GET
的
JSON
格式请求主体
|
body
|
自己写的
JSON
格式的请求主体
|
更多
API
参考
:
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/index.html
查看节点信息
查看索引信息
通过curl命令或浏览器访问
此时没有索引
新增索引
输入以下代码后刷新网页,索引添加成功
[root@vm2 ~]# curl -X PUT http://192.168.35.143:9200/nginx_access_log
{"acknowledged":true,"shards_acknowledged":true,"index":"nginx_access_log"}[root@vm2 ~]#
health:索引状态(green,yellow,red)
green
:所有的主分片和副本分片都已分配。你的集群是
100%
可用的。
yellow
:所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依 然是完整的。不过,你的高可用性在某种程度上被弱化。如果 更多的 分片消失,你就会丢数据了。把 yellow 想象成一个需要及时调查的警告。
red
:至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。
index:索引名
pri:主分片
rep:副本
docs.count:文档的数量
docs.deleted:已删除文档数量
删除索引
[root@vm2 ~]# curl -X DELETE http://192.168.35.143:9200/nginx_access_log
{"acknowledged":true}
通过curl或浏览器访问192.168.35.143:9200/_cat/indices?v
此时索引被删除了
ES查询语句
ES
提供一种可用于执行查询
JSON
式的语言,被称为
Query DSL
。
查询匹配条件:
match_all
from,size
match
需提前导入数据源
参考地址:
https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/res
ources/accounts.json
//查询确认
[root@vm2 ~]# curl "192.168.35.143:9200/_cat/indices?v"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open bank npsciwz5SNef6pmkTQnvmA 5 1 1000 0 950.4kb 475.2kb
//查询bank索引的数据(使用查询字符串进行查询)
[root@vm2 ~]# curl -X GET "192.168.35.143:9200/bank/_search?q=*&sort=account_number:asc&pretty"
//查询bank索引的数据(使用json格式进行查询)
[root@vm2 ~]# curl-X GET "192.168.35.143:9200/bank/_search" -H 'Content-Type:application/json' -d'
> {
> "query":{"match_all":{} },
> "sort":[
> {"account_number":"asc"}
> ]
> }
> '
//查询bank索引的数据 (使用query格式进行查询)
[root@vm2 ~]# curl -X GET "192.168.35.143:9200/bank/_search" -H 'Content-Type:application/json' -d'
{
"query":{"match_all":{} },
"size":1
> }
> '
//指定位置与查询条数
[root@vm2 ~]# curl -X GET "192.168.35.143:9200/bank/_search" -H 'Content-Type:application/json' -d'
{
"query":{"match_all":{} },
"from": 0,
> "size": 2
> }
> '
//示例: 查询account_number从第501条到510条的数据
[root@vm2 ~]# curl -X GET "192.168.35.143:9200/bank/_search" -H 'Content-Type:application/json' -d'
{
"query":{"match_all":{} },
"from": 500,
"size": 10,
> "sort": [
> {"account_number":"asc"}
> ]
> }
> '
elasticsearch-head
elasticsearch-head
是集群管理、数据可视化、增删改查、查询语句可视化工具。从
ES5
版本后安装方式
和
ES2
以上的版本有很大的不同
,
在
ES2
中可以直接在
bin
目录下执行
plugin install xxxx
来进行安装
,
但是
在
ES5
中这种安装方式变了
,
要想在
ES5
中安装
Elasticsearch Head
必须要安装
NodeJs,
然后通过
NodeJS
来
启动
Head
。
官网地址
:
https://github.com/mobz/elasticsearch-head
elasticsearch-head
安装
第
1
步
:
下载相关软件并上传到服务器
官网有安装说明
,
可以通过
git
安装
,
也可以下载
zip
包解压安装
下载相应的软件包
,
并拷贝到
ES
集群的一个节点上
(
我这里拷贝到
192.168.35.143
这台
,
也就是
vm2
上
)
nodejs下载页面: https://nodejs.org/en/download/
第2步: 安装nodejs
[root@vm2 ~]# unzip elasticsearch-head-master.zip
[root@vm2 ~]# ls
accounts.json elasticsearch-head-master
anaconda-ks.cfg elasticsearch-head-master.zip
elasticsearch-6.5.2.rpm node-v10.24.1-linux-x64.tar.xz
第
3
步
:
安装
es-head
[root@vm2 ~]# cd elasticsearch-head-master/
[root@vm2 elasticsearch-head-master]# npm install --registry=http://registry.npm.taobao.org
//此时安装完成后如果有ERR报错,执行如下命令,再重新安装
[root@vm2 elasticsearch-head-master]# npm install phantomjs-prebuilt@2.1.16 --ignore-script --registry=http://registry.npm.taobao.org
[root@vm2 elasticsearch-head-master]# npm install --registry=http://registry.npm.taobao.org
//放入后台运行,检查端口
[root@vm2 elasticsearch-head-master]# nohup npm run start &
[1] 1286
[root@vm2 elasticsearch-head-master]# nohup: ignoring input and appending output to 'nohup.out
[root@vm2 elasticsearch-head-master]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 0.0.0.0:9100 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 4096 *:9200 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 4096 *:9300 *:*
第
4
步
:
浏览器访问
浏览器访问
http://es
-
head
节点IP:9100,
并在下面的地址里把
localhost
改为
es-head
节点
IP(
浏览器与
es-head
不是同一节点就要做
),此时连接会发现连接不上,需要进一步进行配置
第5步: 修改ES集群配置文件,并重启服务
//在配置文件中discovery.zen.ping.unicast.hosts: ["192.168.35.142", "192.168.35.143"]后加上这两句,再重启服务,vm1,vm2都需要进行此操作
[root@vm1 ~]# vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@vm1 ~]# systemctl restart elasticsearch.service
[root@vm1 ~]# systemctl enable elasticsearch.service
此时刷新网页,进行连接会发现成功连接
logstash
logstash简介
logstash
是一个开源的数据采集工具
,
通过数据源采集数据
.
然后进行过滤
,
并自定义格式输出到目的地。
数据分为
:
1.
结构化数据
如
:mysql
数据库里的表等
2.
半结构化数据
如
: xml,yaml,json
等
3.
非结构化数据 如
:
文档
,
图片
,
音频
,
视频等
logstash
可以采集任何格式的数据
,
当然我们这里主要是讨论采集系统日志
,
服务日志等日志类型数据。
官方产品介绍
:
https://www.elastic.co/cn/products/logstash
input
插件
:
用于导入日志源
(
配置必须
)
https://www.elastic.co/guide/en/logstash/current/input-plugins.html
filter
插件
:
用于过滤
(
不是配置必须的
)
https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
output
插件
:
用于导出
(
配置必须
)
https://www.elastic.co/guide/en/logstash/current/output-plugins.html
logstash部署
//环境准备: vm1.cluster.com 192.168.35.142
// vm2.cluster.com 192.168.35.143
// vm3.cluster.com 192.168.35.144
//安装Java
[root@vm3 ~]# yum -y install java-1.8.0*
//在logstash服务器上安装logstash
[root@vm3 ~]# rz -E
rz waiting to receive.
[root@vm3 ~]# ls
anaconda-ks.cfg logstash-6.5.2.rpm
[root@vm3 ~]# rpm -ivh logstash-6.5.2.rpm
//配置logstash主配置文件
[root@vm3 ~]# vim /etc/logstash/logstash.yml
path.data: /var/lib/logstash
path.config: /etc/logstash/conf.d/ //打开注释,并加上配置目录路径
http.host: "192.168.35.144" //打开注释,并改为本机IP(这是用于xpack监控用,但要收费,所以在这里不配置也可以)
path.logs: /var/log/logstash
//启动测试
[root@vm3 ~]# cd /usr/share/logstash/bin
[root@vm3 bin]# ./logstash -e 'input {stdin {}} output {stdout {}}'
//另一种验证方法
[root@vm3 bin]# vim /etc/logstash/conf.d/test.conf
[root@vm3 bin]# ./logstash --path.settings /etc/logstash -f
/etc/logstash/conf.d/test.conf -t
// --path.settings 指定logstash主配置文件目录
// -f 指定片段配置文件
// -t 测试配置文件是否正确
// codec => rubydebug这句可写可不定,默认就是这种输出方式
日志采集
采集
messages
日志
这里以
/var/log/messages
为例
,
只定义
input
输入和
output
输出
,
不考虑过滤
[root@vm3 ~]# cd /usr/share/logstash/bin/
[root@vm3 bin]# vim /etc/logstash/conf.d/test.conf
input {
file {
path => "/var/log/messages"
start_position => "beginning"
}
}
output {
elasticsearch{
hosts => ["10.1.1.12:9200"]
index => "test-%{+YYYY.MM.dd}"
}
}
[root@vm3 bin]# ./logstash --path.settings /etc/logstash/ -r -f
[root@vm3 bin]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 50 [::ffff:192.168.35.144]:9600 *:*
通过浏览器访问
es-head
验证
[root@vm3 ~]# echo 123 >> /var/log/messages
采集多日志源
[root@vm3 bin]# vim /etc/logstash/conf.d/test.conf
type => "dnf"
}
}
filter {
}
output {
if [type] == "messages" {
elasticsearch{
hosts => ["192.168.35.142:9200","192.168.35.143:9200"]
index => "test-%{+YYYY.MM.dd}"
}
}
if [type] == "dnf" {
elasticsearch{
hosts => ["192.168.35.142:9200","192.168.35.143:9200"]
index => "dnf-%{+YYYY.MM.dd}"
}
}
}
刷新一下网页
kibana
kibana介绍
Kibana
是一个开源的可视化平台
,
可以为
ElasticSearch
集群的管理提供友好的
Web
界面
,
帮助汇总
,
分析和
搜索重要的日志数据。
文档路径
:
https://www.elastic.co/guide/en/kibana/current/setup.html
kibana部署
//第1步: 在kibana服务器(我这里是VM1)上安装kibana
[root@vm1 ~]# rz -E
rz waiting to receive.
[root@vm1 ~]# ls
anaconda-ks.cfg elasticsearch-6.5.2.rpm kibana-6.5.2-x86_64.rpm
[root@vm1 ~]# rpm -ivh kibana-6.5.2-x86_64.rpm
warning: kibana-6.5.2-x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:kibana-6.5.2-1 ################################# [100%]
// 配置kibana
[root@vm1 ~]# vim /etc/kibana/kibana.yml
server.port: 5601 //端口
server.host: "0.0.0.0" //监听所有,允许所有人能访问
elasticsearch.url: "http://10.1.1.12:9200" //ES集群的路径
logging.dest: /var/log/kibana.log //我这里加了kibana日志,方便排错与调试
//日志要自己建立,并修改owner和group属性
[root@vm1 ~]# cd /var/log/
[root@vm1 log]# touch kibana.log
[root@vm1 log]# chown kibana.kibana kibana.log
//重启服务,验证端口
[root@vm1 log]# systemctl restart kibana.service
[root@vm1 log]# systemctl enable kibana.service
Created symlink /etc/systemd/system/multi-user.target.wants/kibana.service → /etc/systemd/system/kibana.service.
[root@vm1 log]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 5 0.0.0.0:873 0.0.0.0:*
LISTEN 0 511 0.0.0.0:5601 0.0.0.0:*
LISTEN 0 5 127.0.0.1:25151 0.0.0.0:*
LISTEN 0 511 *:443 *:*
LISTEN 0 511 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 5 [::]:873 [::]:*
LISTEN 0 4096 *:9200 *:*
LISTEN 0 4096