ELK
第一部分:基本概念
1.elk三个软件的介绍
通俗来讲,ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体,这三个软件当中,每个软件用于完成不同的功能,ELK 又称为 ELK stack,官方域名为 stactic.co,ELK stack 的主要优点有如下几个:
处理方式灵活:elasticsearch是实时全文索引,具有强大的搜索功能
配置相对简单:elasticsearch全部使用 JSON 接口,logstash 使用模块配置,kibana 的配置文件部分更简单。
检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。
集群线性扩展:elasticsearch 和 logstash 都可以灵活线性扩展
前端操作绚丽:kibana的前端设计比较绚丽,而且操作简单
2.elk使用场景
ELK使用场景:
日志平台:利用elasticsearch的快速检索功能,在大量的数据当中可以快速查询需要的日志。
订单平台:利用elasticsearch的快速检索功能,在大量的订单当中检索我们所需要的订单。
搜索平台:利用elasticsearch的快速检索功能,在大量的数据中检索出我们所需要的数据。
第二部分:Elasticsearch
1.elasticsearch基本概念(突出重点:搜索、实时、全文)
Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索、支持分布式可实现高可用、提供 API 接口,可以处理大规模日志数据,比如 Nginx、Tomcat、系统日志等功能。
2.elasticsearch部署方式
1.rpm包部署
2.源码包部署
3.docker部署
3.elasticsearch下载链接
官网下载地址:https://www.elastic.co/cn/downloads/elasticsearch
官网其他版本安装包下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
4.rpm包安装
1.集群规划
主机名 | 外网IP | 内外IP |
---|---|---|
es-01 | 192.168.15.60 | 172.16.1.60 |
es-02 | 192.168.15.61 | 172.16.1.61 |
2.集群配置
官方推荐集群配置30G。本地虚拟机使用2核2G(实际 我用了4核)
3.系统优化
# 关闭selinux
# 关闭防火墙
# 设置一下时区
# 同步时间
[root@gitlab01 ~]# date
2021年 05月 08日 星期六 16:11:16 CST
[root@jenkins01 ~]# date
2021年 05月 08日 星期六 16:11:23 CST
# 设置程序可以打开的文件数
[root@gitlab01 ~]# vim /etc/security/limits.conf
* soft memlock unlimited
* hard memlock unlimited
* soft nofile 131072
* hard nofile 131072
[root@jenkins01 ~]# vim /etc/security/limits.conf
* soft memlock unlimited
* hard memlock unlimited
* soft nofile 131072
* hard nofile 131072
系统优化完了机子重启一下,reboot
4.两台机子分别安装jara
# elasticsearch是依赖于Java它的核心就是jara写的好像叫lucache
[root@gitlab01 opt]# yum install java-1.8.0* -y
[root@jenkins01 opt]# yum install java-1.8.0* -y
##验证jara安装成功与否
[root@gitlab01 opt]# java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)
[root@jenkins01 opt]# java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)
5.分别在两台机子上下载elasticsearch的rpm包
[root@gitlab01 opt]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.1-x86_64.rpm
[root@jenkins01 opt]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.1-x86_64.rpm
6.安装elasticsearch的rpm包
[root@gitlab01 opt]# yum install elasticsearch-7.12.1-x86_64.rpm -y
[root@jenkins01 opt]# yum install elasticsearch-7.12.1-x86_64.rpm -y
7.分别在两台机子上修改
###elastcsearch设置内存锁定
vim /usr/lib/systemd/system/elasticsearch.service
#在[service]下面增加
LimitMEMLOCK=infinity
###修改elasticsearch锁定内存大小
vim /etc/elasticsearch/jvm.options
-Xms1g
-Xmx1g
8.在es-01单台上修改
修改elasticsearch的配置文件
[root@es-01 ~]# vim /etc/elasticsearch/elasticsearch.yml
[root@es-01 ~]# grep -E '^[^#]' /etc/elasticsearch/elasticsearch.yml
# 设置集群名称
cluster.name:daxingxing-by-es
# 设置集群节点名称(节点名称在集群中唯一)
node.name: daxingxing-node-01
# 设置数据存放目录
path.data: /var/lib/elasticsearch
# 设置日志存放目录
path.logs: /var/log/elasticsearch
# 设置内存锁定
bootstrap.memory_lock: true
# 设置监听的IP
network.host: 0.0.0.0
# 设置监听的端口
http.port: 9200
# 设置主节点
cluster.initial_master_nodes: ["172.16.1.60"]
9.启动
[root@gitlab01 ~]# systemctl start elasticsearch.service
10.验证启动:出现9200和9300代表elasticsearch启动成功
9300内部集群间通信端口
9200是设置的elasticsearch监听的ip的端口
11.出现下面的代表可以对外提供服务了:192.168.16.60:9200(lucene是elasticsearch的核心 )
第三部分:源码包安装
# 下载源码包
[root@es-01 ~]# wget https://github.com/elastic/elasticsearch/archive/refs/tags/v7.12.1.tar.gz
# 解压
[root@es-01 ~]# tar -xf v7.12.1.tar.gz -C /usr/local
# elasticsearch是依赖于Java
[root@es-01 /opt]# yum install java-1.8.0* -y
[root@es-01 ~]# java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)
[root@es-01 /opt]# yum install elasticsearch-7.12.1-x86_64.rpm -y
第四部分:docker安装
docker run -p 9200:9200 -p 9300:9300 -e "cluster.name=xxx" docker.elastic.co/elasticsearch/elasticsearch:7.12.1
第五部分:安装集群head插件
head插件主要是图形化elasticsearch
1.先安装docker
###卸载旧版本:(如果安装过旧版本的话)Docker 的早期版本称为 docker 或 docker-engine 。如果安装了这些版本,请卸载它们及关联的依赖资源。
yum remove docker docker-common docker-selinux docker-engine
###安装所需的软件包
yum-utils 提供了 yum-config-manager 实用程序,并且 devicemapper 存储驱动需要 device-mapper-persistent-data 和 lvm2
yum install -y yum-utils device-mapper-persistent-data lvm2
###设置Docker的镜像仓库(推荐使用阿里云的)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
上面处可能会报错 (原因是国内访问不到docker官方镜像的缘故)
Could not fetch/save url https://download.docker.com/linux/centos/docker-ce.repo to file /etc/yum.repos.d/docker-ce.repo:
解决:使用以下方式:阿里源访问
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
###安装最新版本的 Docker CE
yum install docker-ce
如果安装不成功,则按以下卸载再按上面重新安装
1.卸载 Docker 软件包
yum remove docker-ce
2.删除镜像/容器等
rm -rf /var/lib/docker
###查看当前安装的 Docker 版本
docker version
2.利用镜像生成服务:alvinos/elasticsearch-head后台启动
[root@gitlab01 ~]# docker run -d -p 9800:9100 alvinos/elasticsearch-head
(9100端口已经被占用了无奈就用了9800宿主机端口)
02bc68c2aef7cd62c75aea7de4feac06aa5183f5b968ed44f46c42992505a5e8
[root@gitlab01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
02bc68c2aef7 alvinos/elasticsearch-head "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:9800->9100/tcp, :::9800->9100/tcp laughing_pasteur
3.登录http://192.168.15.60:9800/
4.设置elasticsearch跨域访问
[root@gitlab01 ~]# vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@gitlab01 ~]# systemctl restart elasticsearch.service
###最好设置成开机自启elasticsearch.service
[root@gitlab01 ~]# systemctl enable --now elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
接着再去访问
###这里设置elasticsearch跨域访问然后重启elasticsearch就不报错 了
第六部分:部署elasticsearch主从
###
elasticsearch是主从数据节点分离的,按照节点还可以分为热数据节点和冷数据节点。
###
部署主节点
###
部署从节点
###
系统优化
# 关闭selinux
# 关闭防火墙
# 设置一下时区
# 同步时间
# 设置程序可以打开的文件数
[root@es-01 /opt]# vim /etc/security/limits.conf
* soft memlock unlimited
* hard memlock unlimited
* soft nofile 131072
* hard nofile 131072
2.修改配置文件在重启
[root@gitlab01 ~]# vim /etc/elasticsearch/elasticsearch.yml
# 设置选举策略
discovery.zen.minimum_master_nodes: 2
# # 设置节点
discovery.zen.ping.unicast.hosts: ["172.16.1.60","172.16.1.61"]
# # 设置是否的主节点
node.master: true
##设置集群节点名称,上面已经设置,注意要唯一
#node.name: daxingxing-node-01
[root@gitlab01 ~]# systemctl daemon-reload
[root@gitlab01 ~]# systemctl start elasticsearch
[root@jenkins01 ~]# vim /etc/elasticsearch/elasticsearch.yml
# 设置选举策略
# discovery.zen.minimum_master_nodes: 2
# # 设置节点
# discovery.zen.ping.unicast.hosts: ["172.16.1.60","172.16.1.61"]
# # 设置是否的主节点
# node.master: false
# # 集群节点名称.上面已经设置了.注意名字要唯一
# node.name: daxingxing-node-02
[root@jenkins01 ~]# systemctl daemon-reload
[root@jenkins01 ~]# systemctl restart elasticsearch
总结一句,这里修改配置文件容易犯格式的错误,即在:后面空一格再写配置内容
3.主从部署节点成功出现
###出现第一个节点成功
###出现第二个节点成功
###多查看一下集群日志,会发现node节点真正启动起来没有。
总结故障:
##做到这一步极其容易出现数据不一致的问题,反应到登录网页上就上明明好像能正常访问,其实它的的UUID是错误的。为此可以先删除/var/lib/elasticsearch/*下面的东西,然后再重启elasticsearch。这样就可以了。下面有图有真相
[root@jenkins01 ~]# systemctl stop elasticsearch.service
[root@jenkins01 ~]# rm -rf /var/lib/elasticsearch/*
###实时监控集群日志发现问题
[root@jenkins01 ~]# tail -f /var/log/elasticsearch/daxingxing-by-es.log
[root@jenkins01 ~]# systemctl start elasticsearch.service
集群性能检测
第七部分:LogStach
1.基本概念
Logstash 是一个开源的数据收集引擎,可以水平伸缩,而且 logstash 整个 ELK 当中拥有最多插件的一个组件,其可以接收来自不同来源的数据并统一输出到指定的且可以是多个不同目的地。
如果等于green(绿色)就是运行在正常,等于yellow(黄色)表示副本分片丢失,red(红色)表示主分片丢失。
2.部署LogStach
部署logstach分别有三种方式:
1、rpm包安装
2、源码包安装
3、docker安装
3.分别在两台机子上选择rpm安装
##安装logstash的rpm包
[root@gitlab01 opt]# wget https://artifacts.elastic.co/downloads/logstash/logstash-7.12.1-x86_64.rpm
# 安装
[root@gitlab01 opt]# yum install logstash-7.12.1-x86_64.rpm -y
# 对数据目录设置权限
[root@gitlab01 opt]# chown -R logstash.logstash /usr/share/logstash/
[root@jenkins01 opt]# 省略同上
。。。。
。。。。
4.使用logstach
###输入
1.输出到shell控制台( codec是编码器,直白的说就是控制输出类型,默认是json)
/usr/share/logstash/bin/logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug }}'
案例:[INFO ] 2021-05-10 00:13:52.433 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
你好
{
"host" => "gitlab01",
"message" => "你好",
"@timestamp" => 2021-05-09T16:14:45.040Z,
"@version" => "1"
}
我是中国人
{
"host" => "gitlab01",
"message" => "我是中国人",
"@timestamp" => 2021-05-09T16:15:02.821Z,
"@version" => "1"
2.logstach输出到文件当中
[root@gitlab01 ]# /usr/share/logstash/bin/logstash -e 'input { stdin{} } output { file { path => "/tmp/log-%{+YYYY.MM.dd}-messages.log"}}'
案例:
[INFO ] 2021-05-10 00:21:39.726 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
我在上海欢迎你
[root@gitlab01 ]# cd /tmp
[root@gitlab01 tmp]# ll
总用量 4
-rw-r--r-- 1 root root 109 5月 10 00:23 log-2021.05.09-messages.log
[root@gitlab01 tmp]# cat log-2021.05.09-messages.log
{"message":"我在上海欢迎你","@version":"1","host":"gitlab01","@timestamp":"2021-05-09T16:23:46.118Z"}
3.logstach输出到elasticsearch当中
[root@gitlab01 opt]# /usr/share/logstash/bin/logstash -e 'input { stdin{} } output { elasticsearch {hosts => ["172.16.1.60:9200"] index => "mytest-%{+YYYY.MM.dd}" }}'
Using bundled JDK: /usr/share/logstash/jdk
案例:
The stdin plugin is now waiting for input:
[INFO ] 2021-05-10 00:30:56.206 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
w zai guangzhou
我爱大陆和大海
4.logstach输出到redis当中
###注意将[root@jenkins01 opt]# vim /usr/local/redis/conf/redis.conf
中的bind 改为0.0.0.0
[root@gitlab01 opt]# /usr/share/logstash/bin/logstash -e 'input { stdin{} } output {redis { host => "172.16.1.61" port => "6379" data_type => "list" key => "logstash-%{type}" }}'
Using bundled JDK: /usr/share/logstash/jdk
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
[INFO ] 2021-05-10 01:07:04.205 [[main]-pipeline-manager] javapipeline - Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[INFO ] 2021-05-10 01:07:04.477 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
你好,彦陈陈
###然后去redis里去验证
[root@jenkins01 opt]# redis-cli --raw
127.0.0.1:6379> lrange logstash-%{type} 0 -1
{"host":"gitlab01","message":"你好,黑羊666","@version":"1","@timestamp":"2021-05-09T16:59:32.598Z"}
{"message":"你好,彦陈陈","@version":"1","host":"gitlab01","@timestamp":"2021-05-09T17:07:45.312Z"}
读取
- logstach读取日志文件
[root@gitlab01 ~]# /usr/share/logstash/bin/logstash -e 'input { file { path => "/var/log/messages" } } output { elasticsearch {hosts => ["172.16.1.60:9800"] index => "system-log-%{+YYYY.MM.dd}" }}'
Using bundled JDK: /usr/share/logstash/jdk
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
- 在标准输出中读取
[root@es-01 /opt]# /usr/share/logstash/bin/logstash -e 'input { stdin{} } output { elasticsearch {hosts => ["172.16.1.70:9200"] index => "system-stdin-%{+YYYY.MM.dd}" }}'
sudo /usr/share/logstash/bin/system-install /etc/logstash/s tartup.options systemd
分类
- 从多个文件中读取文件
path => "/var/log/messages" #日志路径
type => "systemlog" #事件的唯一类型
start_position => "beginning" #第一次收集日志的位置
stat_interval => "3" #日志收集的间隔时间
[root@es-01 /opt]# /usr/share/logstash/bin/logstash -e 'input { file{ path => "/var/log/messages" type => "systemlog" start_position => "beginning" stat_interval => "3" } file{ path => "/var/log/cron" type => "systemcron" start_position => "beginning" stat_interval => "3" } } output { elasticsearch {hosts => ["172.16.1.70:9200"] index => "system-stdin-%{+YYYY.MM.dd}" }}'
- 分类输出多个数据仓库
[root@es-01 /opt]# /usr/share/logstash/bin/logstash -e 'input { file{ path => "/var/log/messages" type => "systemlog" start_position => "beginning" stat_interval => "3" } file{ path => "/var/log/cron" type => "systemcron" start_position => "beginning" stat_interval => "3" } } output { if [type] == "systemlog" { elasticsearch {hosts => ["172.16.1.70:9200"] index => "system-systemlog-%{+YYYY.MM.dd}" }} if [type] == "systemcron" { elasticsearch {hosts => ["172.16.1.70:9200"] index => "system-systemcron-%{+YYYY.MM.dd}" } } }'
- 使用配置文件
# 测试配置文件 下面显示ok就代表配置文件没问题
[root@es-01 ~]# touch test.conf
[root@es-01 ~]# /usr/share/logstash/bin/logstash -f test.conf -t (-t代表测试)
# 使用配置文件
[root@es-01 ~]# /usr/share/logstash/bin/logstash -f test.conf
kibana
Kibana 是一个通过调用 elasticsearch 服务器进行图形化展示搜索结果的开源项目。
部署kibana
# 下载安装包
[root@es-02 /opt]# wget https://artifacts.elastic.co/downloads/kibana/kibana-7.12.1-x86_64.rpm
记得要打开logstash这样kibana才有数据出来