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 |
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 格式的请求主体 |
查看索引信息
通过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 [email protected] --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.htmllogstash部署
//环境准备: 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.htmlkibana部署
//第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
标签:vm2,ELK,0.0,系统,192.168,elasticsearch,日志,root,logstash
From: https://blog.csdn.net/2201_75912662/article/details/141368586