目录
一、ELK介绍
1.1 ELK是什么
通俗来讲,ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体,ELK 是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案,在这三个软件当中,每个软件用于完成不同的功能,ELK 又称为ELK stack,官方域名为 elastic.co,ELK stack 的主要优点有如下几个:处理方式灵活: elasticsearch 是实时全文索引,具有强大的搜索功能配置相对简单:elasticsearch 的 API 全部使用 JSON 接口,logstash 使用模块配置,kibana 的配置文件部分更简单。检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。集群线性扩展:elasticsearch 和 logstash 都可以灵活线性扩展前端操作绚丽:kibana 的前端设计比较绚丽,而且操作简单。
1.2 Elasticsearch
一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索。
搜索、支持分布式可实现高可用、提供 API 接口,可以处理大规模日志数据,比如 Nginx、Tomcat、系统日志等功能。
Elasticsearch 使用 Java 语言开发,是建立在全文搜索引擎 Apache Lucene 基础之上的搜索引擎,Apache Lucene - Welcome to Apache Lucene。
Elasticsearch 的特点:
实时搜索、实时分析
分布式架构、实时文件存储
文档导向,所有对象都是文档
高可用,易扩展,支持集群,分片与复制
接口友好,支持 json
1.3 Logstash
Logstash 是一个具有实时传输能力的数据收集引擎,其可以通过插件实现日志收集和转发,支持日志过滤,支持普通 log、自定义 json 格式的日志解析,最终把经过处理的日志发送给 elasticsearch。
1.4 Kibana
Kibana 为 elasticsearch 提 供 一 个 查 看 数 据 的 web 界 面 , 其 主 要 是 通 过elasticsearch 的 API 接口进行数据查找,并进行前端数据可视化的展现,另外还可以针对特定格式的数据生成相应的表格、柱状图、饼图等。
1.5 为什么使用ELK
ELK 组件在海量日志系统的运维中,可用于解决以下主要问题:
分布式日志数据统一收集,实现集中式查询和管理
故障排查
安全信息和事件管理
报表功能
二、ELK原理
2.1 工作原理
(1)在所有需要收集日志的服务器上部署Logstash;或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash。
(2)Logstash 收集日志,将日志格式化并输出到 Elasticsearch 群集中。
(3)Elasticsearch 对格式化后的数据进行索引和存储。
(4)Kibana 从 ES 群集中查询数据生成图表,并进行前端数据的展示。
总结:logstash作为日志搜集器,从数据源采集数据,并对数据进行过滤,格式化处理,然后交由Elasticsearch存储,kibana对日志进行可视化处理。
2.2 ELK的应用架构图
三、ELK的安装部署
3.1 环境部署
Elasticsearch集群: node1节点1:192.168.254.10 #内存4G及以上 node2节点2:192.168.254.20 #内存4G及以上 Logstash、Kibana节点: 应用程序节点3:192.168.254.100
3.2 前期环境
#java环境 yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel #关闭防火墙 systemctl stop firewalld setenforce 0
3.3 安装Elasticsearch
#得到一个安装包,此链接可能无效,请自行获取 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.7.2.rpm rpm -ivh elasticsearch-6.7.2.rpm #为配置文件做备份 cd /etc/elasticsearch/ mkdir bak cp -a *.yml bak
3.3.1 修改配置
节点一:
vim elasticsearch.yml #修改集群名字 cluster.name: my-elk-cluster node.name: node1 node.master: true node.data: true #设置 节点名称 主从之间不能一致 master作为主节点 data作为数据节点 bootstrap.memory_lock: true #内存锁开启 禁止使用 swap network.host: 0.0.0.0 #监听地址 http.port: 9200 # 默认使用端口 transport.tcp.port: 9300 #内部传输端口 discovery.zen.ping.unicast.hosts: ["192.168.254.10:9300", "192.168.254.20:9300"] #自动集群发现,加入主机名 使用单播 类似心跳线
节点二:
vim elasticsearch.yml #修改集群名字 cluster.name: my-elk-cluster node.name: node2 node.master: true node.data: true #设置 节点名称 主从之间不能一致 master作为主节点 data作为数据节点 bootstrap.memory_lock: true #内存锁开启 禁止使用 swap network.host: 0.0.0.0 #监听地址 http.port: 9200 # 默认使用端口 transport.tcp.port: 9300 #内部传输端口 discovery.zen.ping.unicast.hosts: ["192.168.254.10:9300", "192.168.254.20:9300"] #自动集群发现,加入主机名 使用单播 类似心跳线
节点一与节点二:
#性能调优参数 vim /etc/security/limits.conf ...... * soft nofile 65536 * hard nofile 65536 * soft nproc 32000 * hard nproc 32000 * soft memlock unlimited * hard memlock unlimited #修改systemd服务管理器 vim /etc/systemd/system.conf DefaultLimitNOFILE=65536 #设置打开文件数量的默认限制 DefaultLimitNPROC=32000 #设置进程数量的默认限制 DefaultLimitMEMLOCK=infinity #取消内存锁定限制:将内存锁定限制设置为无限制(infinity),允许服务或进程锁定尽可能多的内存。 vim /etc/sysctl.conf #一个进程可以拥有的最大内存映射区域数,参考数据(分配 2g/262144,4g/4194304,8g/8388608) vm.max_map_count=262144 sysctl -p #重启 reboot systemctl start elasticsearch.service systemctl status elasticsearch.service
3.3.2 查看节点信息
浏览器访问 http://192.168.254.10:9200 http://192.168.254.20:9200 查看节点 Node1、Node2 的信息
谷歌插件下载:去谷歌商店,搜索elasticsearch head,下载后可以在此插件页面添加节点IP即可可视化查看
3.4 安装Logstash
节点3:
3.4.1 安装服务
#此处自行去网上获取安装rpm包 rpm -ivh logstash-6.7.2.rpm #开启服务 systemctl start logstash.service ln -s /usr/share/logstash/bin/logstash /usr/bin/ # 做软连接
3.4.2 使用Logstash
Logstash 命令常用选项: -f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。 -e:从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。 -t:测试配置文件是否正确,然后退出。 #先在本地测试一下 logstash -e 'input { stdin{} } output { stdout{} }' # 等待时间较长,要耐心 # 当出现[INFO ] 2024-07-16 00:42:10.635 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600},代表成功 #随便输入你想输入的信息后回车,软件会返回给你一些值
3.4.3 对接elasticsearch
方式一:命令 logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.254.10:9200"] } }' //结果不在标准输出显示,而是发送至 Elasticsearch 中,可浏览器访问 方式二:配置文件 cd /etc/logstash/conf.d vim system-log.conf input { file { path => "/var/log/messages" type => "system" start_position => "beginning" } } output { elasticsearch { hosts => [ "192.168.254.10:9200","192.168.254.20:9200" ] index => "system-%{+YYYY.MM.dd}" } } chmod +r /var/log/messages #添加权限 logstash -f system-log.conf #读取配置文件 #进入浏览器即可查看
3.5 安装kibana
rpm -ivh kibana-6.7.2-x86_64.rpm cd /etc/kibana/ cp kibana.yml kibana.yml.bak -a vim kibana.yml 2 server.port: 5601 #打开端口 7 server.host: "0.0.0.0" #监听端口 28 elasticsearch.hosts: ["http://192.168.254.10:9200", "http://192.168.254.20:9200"] #elasticsearch服务器地址 37 kibana.index: ".kibana" #打开索引,默认.kibana 96 logging.dest: /var/log/k.log #指定日志文件, 需要手动建立文件 114 i18n.locale: "zh-CN" #中文设置 chown kibana:kibana /var/log/k.log systemctl start kibana ss -nap |grep 5601 #浏览器测试 访问192.168.254.100:5601
四、Logstash配合其他软件
4.1 收集nginx日志
4.1.1 环境介绍
logstash、nginx节点:192.168.254.20 elasticsearch: node1:192.168.254.100 node2:192.168.254.120
4.1.2 配置
logstash、nginx节点:
vim /etc/nginx/nginx.conf http { # 添加在 http 语句块中 log_format access_json '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"upstreamtime":"$upstream_response_time",' '"upstreamhost":"$upstream_addr",' '"http_host":"$host",' '"url":"$uri",' '"domain":"$host",' '"xff":"$http_x_forwarded_for",' '"referer":"$http_referer",' '"status":"$status"}'; #修改默认日志格式 access_log /var/log/nginx/access.log access_json; systemctl stop firewalld setenforce 0 systemctl start nginx vim /etc/logstash/conf.d/nginx-log.conf input { file { path => "/var/log/nginx/access.log" type => "nginx" start_position => "beginning" codec => "json" #转换格式为json stat_interval => 3 #自动检测,3秒间隔 } } output { elasticsearch { hosts => [ "192.168.254.100:9200", "192.168.254.120:9200"] index => "nginx-%{+YYYY.MM.dd}" } } logstash -f nginx-log.conf
4.2 收集tomcat日志
4.2.1 环境介绍
tomcat节点、logstash节点:192.168.254.20 elasticsearch: node1:192.168.254.100 node2:192.168.254.120
4.2.2 配置
logstash、tomcat节点:
vim /usr/local/tomcat/conf/server.xml # 最后一行 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="tomcat_access_log" suffix=".log" pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/> chmod +r /usr/local/tomcat/logs/* #修改权限
vim /etc/logstash/conf.d/tomcat-log.conf input { file { path => "/usr/local/tomcat/logs/tomcat_access_log.*.log" type => "tomcat-acceslog" start_position => "beginning" stat_interval => "3" } } output { if [type] == "tomcat-acceslog" { elasticsearch { hosts => ["192.168.254.100:9200","192.168.254.120:9200"] index => "logstash-tomcat-accesslog-%{+YYYY.MM.dd}" }} } logstash -f tomcat-log.conf
4.3 使用Redis接收tomcat日志
4.3.1 环境介绍
tomcat、logstash节点:192.168.254.20 elasticsearch: node1:192.168.254.100 node2:192.168.254.120 redis:192.168.254.50
4.3.2 配置
logstash节点:
vim /etc/logstash/conf.d/redis_tomcat-log.conf input { file { path => "/usr/local/tomcat/logs/tomcat_access_log.*.log" type => "tomcat-acceslog" start_position => "beginning" stat_interval => "3" } } output { if [type] == "tomcat-acceslog" { redis { data_type => list key => "tomcat-accesslog-50" host => "192.168.254.50" port => "6379" db => "0" } } }
redis节点:
redis-cli keys* 1) "tomcat-accesslog-50"
4.3.3 其他logstash服务器从redis读取数据
vim /etc/logstash/conf.d/redis.conf input { redis { data_type => "list" key => "tomcat-accesslog-50" host => "192.168.254.50" port => "6379" db => "0" } } output { elasticsearch { hosts => ["192.168.254.100:9200", "192.168.254.120:9200"] index => "logstash-tomcat50-accesslog-%{+YYYY.MM.dd}" } }
读取后,redis中的数据就会消失