目录
一.ELK简介
ELK Stack:Elasticsearch、Kibana、Beats 和 Logstash | Elastic
通俗来讲,ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体,ELK 是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案,在这三个软件当中,每个软件用于完成不同的功能,ELK 又称为ELK stack,官方域名为 elastic.co,ELK stack 的主要优点有如下几个:处理方式灵活: elasticsearch 是实时全文索引,具有强大的搜索功能配置相对简单:elasticsearch 的 API 全部使用 JSON 接口,logstash 使用模块配置,kibana 的配置文件部分更简单。检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。集群线性扩展:elasticsearch 和 logstash 都可以灵活线性扩展前端操作绚丽:kibana 的前端设计比较绚丽,而且操作简单
1.Elasticsearch
一个分布式、RESTful风格的搜索和数据分析引擎。它设计用于实时搜索,可以处理大规模数据的存储和分析。Elasticsearch使用Lucene作为底层的搜索引擎,提供了强大的全文搜索、结构化查询和分析能力。
Elasticsearch 使用 Java 语言开发,是建立在全文搜索引擎 Apache Lucene 基础之上的搜索引擎,Apache Lucene - Welcome to Apache Lucene。
Elasticsearch 的特点
实时搜索、实时分析
分布式架构、实时文件存储
文档导向,所有对象都是文档
高可用,易扩展,支持集群,分片与复制
接口友好,支持 json
2.Logstash
一个用于日志数据收集、转换和发送的开源工具。Logstash可以从多个来源收集数据,对数据进行处理和转换(如过滤、格式化),然后将数据发送到各种目的地,如Elasticsearch、其他存储系统或者消息队列。
3.Kibana
一个用于数据可视化的开源工具。Kibana提供了一个基于Web的界面,让用户能够搜索、查看和交互存储在Elasticsearch索引中的数据。它支持各种图表、表格、地图等形式的数据可视化,帮助用户更好地理解数据和发现数据中的模式。
4.ELK 组件解决的主要问题
分布式日志数据统一收集,实现集中式查询和管理:
Logstash 可以从分布式环境中收集日志数据,支持多种来源的日志收集,如文件、消息队列、数据库等,通过统一格式化和过滤后发送到
Elasticsearch 进行存储和索引。Elasticsearch 作为分布式的搜索和分析引擎,能够存储大规模的日志数据,并支持高效的搜索和聚合查询,实现集中式的数据查询和管理。故障排查:
ELK Stack 提供强大的日志分析和搜索能力,可以帮助运维人员快速定位和解决系统中的故障问题。
通过 Kibana 的实时图表和仪表板功能,运维人员可以可视化地监控系统运行状态、识别异常事件,并进行相关的调查和处理。安全信息和事件管理:
ELK Stack 可以用于集中管理和分析安全相关的日志信息,如入侵检测系统(IDS)、防火墙日志、认证和授权日志等。
Elasticsearch 的强大搜索和分析功能可以用于快速检测和响应安全事件,帮助组织提升安全防护和响应能力。报表功能:
Kibana 提供了丰富的数据可视化功能,可以创建定制化的报表和仪表板,将数据以图表和表格形式展示,支持各种数据分析需求和业务报告的生成。
5.ELK应用的好处
日志查询和问题排查:
Elasticsearch 作为一个强大的实时搜索和分析引擎,能够快速索引和存储大量日志数据。通过Elasticsearch,可以进行高效的日志查询,帮助运维人员快速定位问题,进行故障排查和日志分析。故障恢复和自愈:
ELK技术栈通过实时的数据索引和分析能力,支持快速响应故障情况。运维团队可以利用实时监控和预警功能,在系统出现异常时迅速发现并采取相应的措施,从而实现故障的快速恢复和自动化处理。应用日志分析和错误报警:
使用Logstash作为日志收集、处理和转发的工具,可以从各种数据源(如应用程序、服务器日志等)中采集数据,并经过处理后发送到Elasticsearch进行存储和分析。通过Kibana提供的数据可视化功能,可以实时监控应用程序的日志信息,快速识别和报警异常情况,及时处理问题。性能分析:
ELK技术栈能够不仅仅分析日志,还可以进行性能分析。通过监控系统和应用程序的指标,如CPU使用率、内存使用情况、网络流量等,可以帮助运维团队发现性能瓶颈和优化机会,提高系统的稳定性和性能。用户行为分析:
借助Elasticsearch强大的分析能力,可以对用户行为数据进行收集、存储和分析。通过分析用户的操作行为、偏好和趋势,可以为产品改进、市场营销和用户体验优化提供数据支持。
6.ELK的工作原理
部署 Logstash:
Logstash通常部署在需要收集日志的服务器上,也可以集中部署在一个日志服务器上。它负责从各种数据源(如日志文件、消息队列等)收集数据。数据处理和输出:
Logstash接收到原始数据后,会进行数据过滤、解析和格式化。这些步骤包括解析数据、标准化格式、甚至是数据的增强和转换(如IP地址转换为地理位置)等。数据存储与索引:
格式化后的数据被送入Elasticsearch集群进行存储和索引。Elasticsearch是一个分布式搜索和分析引擎,能够快速索引大量数据,并支持复杂的查询。数据可视化:
Kibana作为ELK技术栈中的可视化工具,通过与Elasticsearch集成,可以实时查询和分析存储在Elasticsearch中的数据。Kibana提供了丰富的图表、表格和地图等视觉化组件,用于用户界面的数据展示和交互。实时监控和警报:
ELK技术栈可以配置实时监控和警报机制,使得系统能够在发生关键事件或达到特定阈值时即时通知相关人员。总体来说,ELK技术栈通过Logstash收集、处理和传输数据,Elasticsearch进行存储和索引,Kibana进行数据可视化和交互,使得用户能够实现对日志和其他数据源的集中管理、实时分析和可视化展示,从而帮助企业快速响应问题、优化系统性能和提升运维效率。
7.ELK的主要应用场景
EL日志集中管理与分析:
ELK最常见的用途是实时收集、存储和分析大量的日志数据。通过Logstash收集来自各种数据源的日志,经过Elasticsearch的索引和存储,再由Kibana进行可视化展示和分析。这种集中管理和分析日志的能力,使得运维团队能够快速识别和解决系统问题,改善系统稳定性和可靠性。应用性能监控与优化:
通过监控应用程序的日志和性能指标(如CPU使用率、内存占用、请求响应时间等),ELK可以帮助开发团队分析和优化应用程序的性能。这种实时的监控和分析能力,有助于提前发现潜在的性能问题,并迅速采取措施进行优化,从而提升用户体验和系统效率。安全事件监控与分析:
ELK技术栈也被广泛应用于安全信息和事件管理(SIEM)。通过收集和分析安全事件日志(如入侵检测系统、防火墙日志等),可以快速检测潜在的安全威胁和异常行为。Elasticsearch的强大搜索和分析功能,结合Kibana的可视化能力,使安全团队能够及时响应和应对安全事件,加强系统的安全防护。业务智能与数据分析:
ELK不仅限于日志管理和安全监控,还可以用于业务智能和数据分析。企业可以利用Elasticsearch强大的搜索和分析引擎,结合Kibana的可视化功能,分析业务数据趋势、用户行为和市场动态,为决策提供数据支持和见解。IoT数据分析:
随着物联网(IoT)设备的普及,ELK技术栈也被应用于IoT数据的收集、存储和分析。通过Logstash收集IoT设备生成的数据流,经过Elasticsearch进行实时索引和存储,再由Kibana进行数据可视化,帮助企业理解和优化IoT设备的性能、运行状况和用户体验。
二.安装部署ELK
节点 | 地址 | 服务 |
node1节点(2C/4G) | node1/192.168.240.11 | Elasticsearch |
node2节点(2C/4G) | node2/192.168.240.12 | Elasticsearch |
Apache节点 | apache/192.168.240.13 | Logstash Kibana Apache |
1.前期准备
1.1 安装java环境
java -version #如果没有安装,yum -y install java openjdk version "1.8.0_131" OpenJDK Runtime Environment (build 1.8.0_131-b12) OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
1.2 关闭防火墙和selinux
systemctl disable --now firewalld setenforce 0
2.安装部署ElasticseaErch 软件
2.1 安装ElasticseaErch 软件
[root@localhost data]# ls elasticsearch-6.7.2.rpm elasticsearch-head-master.zip node-v8.2.1.tar.gz phantomjs-2.1.1-linux-x86_64.tar.bz2 [root@localhost data]# rpm -ivh elasticsearch-6.7.2.rpm cd /etc/elasticsearch/ mkdir bak cp -a *.yml bak/ #备份
2.2 修改配置文件
[root@node1 elasticsearch]# vim elasticsearch.yml 17 cluster.name: my-elk-001 #修改集群名字 23 node.name: node1 24 node.master: true 25 node.data: true #设置 节点名称 主从之间不能一致 24作为主节点 25作为数据节点 45 bootstrap.memory_lock: true #内存锁开启 禁止使用 swap 57 network.host: 0.0.0.0 #监听地址 61 http.port: 9200 # 默认使用端口 62 transport.tcp.port: 9300 #内部传输端口 75 discovery.zen.ping.unicast.hosts: ["192.168.240.11:9300", "192.168.240.12:9300"] #自动集群发现,加入主机名 使用单播 类似心跳线 grep -v "^#" elasticsearch.yml
2.3 修改系统配置
两台服务器都需要改
[root@localhost elasticsearch]#vim /etc/security/limits.conf ...... * soft nofile 65536 * hard nofile 65536 * soft nproc 32000 * hard nproc 32000 * soft memlock unlimited * hard memlock unlimited
2.4 修改 systemd 服务管理器
两台服务器都需要改
/etc/systemd/system.conf 文件是用于配置 systemd 的,这是一种用于 Linux 操作系统的系统和服务管理器。通过这个文件,你可以自定义与系统操作、性能和行为相关的各种设置
DefaultTimeoutStartSec=:设置启动服务的默认等待时间
DefaultTimeoutStopSec=:设置停止服务的默认等待时间
DefaultRestartSec=:设置在重新启动服务之前的默认休眠时间
DefaultLimitNOFILE=:设置打开文件数量的默认限制
DefaultLimitNPROC=:设置进程数量的默认限制
DefaultLimitCORE=:设置核心文件大小的默认限制
DefaultEnvironment=:指定服务的默认环境变量
[root@localhost elasticsearch]#vim /etc/systemd/system.conf DefaultLimitNOFILE=65536 DefaultLimitNPROC=32000 DefaultLimitMEMLOCK=infinity
2.5 修改内核参数
两台服务器都需要改
Lucene 是一个高性能、全功能的文本搜索引擎库,用于实现高效的文本索引和搜索。它是用 Java 编写的,可以嵌入到各种应用程序中,以提供强大的全文搜索功能。Lucene 是许多流行搜索平台的核心,如 Apache Solr 和 Elasticsearch。
以下是 Lucene 的一些关键特性和功能:
文本索引:Lucene 提供了强大的文本索引功能,能够处理大规模文本数据并生成高效的索引。
全文搜索:支持复杂的查询语法,包括布尔查询、短语查询、通配符查询、模糊查询等。
可扩展性:Lucene 设计为模块化和可扩展的,允许用户根据需要扩展和定制其功能。
分词和分析:提供了丰富的分词器和分析器,用于将文本分解为可索引和可搜索的词语。
排序和评分:支持对搜索结果进行排序和评分,以提高搜索的准确性和相关性。
多语言支持:支持多种语言的文本处理和搜索。
优化elasticsearch用户拥有的内存权限 由于ES构建基于lucene, 而lucene设计强大之处在于lucene能够很好的利用操作系统内存来缓存索引数据,以提供快速的查询性能。lucene的索引文件segements是存储在单文件中的,并且不可变,对于OS来说,能够很友好地将索引文件保持在cache中,以便快速访问;因此,我们很有必要将一半的物理内存留给lucene ; 另一半的物理内存留给ES(JVM heap )。所以, 在ES内存设置方面,可以遵循以下原则:
当机器内存小于64G时,遵循通用的原则,50%给ES,50%留给操作系统,供lucene使用
当机器内存大于64G时,遵循原则:建议分配给ES分配 4~32G 的内存即可,其它内存留给操作系统,供lucene使用
[root@localhost elasticsearch]#vim /etc/sysctl.conf #一个进程可以拥有的最大内存映射区域数,参考数据(分配 2g/262144,4g/4194304,8g/8388608) vm.max_map_count=262144 sysctl -p sysctl -a | grep vm.max_map_count
将配置文件elasticsearch.yml 传输到另一台服务器
scp -r /etc/elasticsearch/elasticsearch.yml 192.168.240.12:/etc/elasticsearch/ #需要注意的是传输完成后需要将配置文件中的 23 node.name: node1 修改为node2
2.6 重启服务器 启动elasticsearch服务
reboot systemctl start elasticsearch.service systemctl enable elasticsearch.service netstat -antp | grep 9200
2.7 查看节点信息
浏览器访问 http://192.168.240.11:9200 http://192.168.240.12:9200 查看节点 Node1、Node2 的信息。 浏览器访问 http://192.168.240.11:9200/_cluster/health?pretty http://192.168.240.12:9200/_cluster/health?pretty 查看群集的健康情况,可以看到 status 值为 green(绿色), 表示节点健康运行。 浏览器访问 http://192.168.240.11:9200/_cluster/state?pretty 检查群集状态信息
2.8 编译安装 Elasticsearch-head 插件
主从都可以安装
Elasticsearch 在 5.0 版本后,Elasticsearch-head 插件需要作为独立服务进行安装,需要使用npm工具(NodeJS的包管理工具)安装。 安装 Elasticsearch-head 需要提前安装好依赖软件 node
和 phantomjs
。 node:是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 phantomjs:是一个基于 webkit 的JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于 webkit 浏览器做的事情,它都可以做到。
2.8.1 编译安装 node 组件
#上传软件包 node-v8.2.1.tar.gz 到/data yum install gcc gcc-c++ make -y cd /data tar zxvf node-v8.2.1.tar.gz cd node-v8.2.1/ ./configure make && make install
2.8.2 安装phantomjs
#上传软件包 phantomjs-2.1.1-linux-x86_64.tar.bz2 到data cd /data tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 cd /opt/phantomjs-2.1.1-linux-x86_64/bin ln -s /data/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/bin #做软链接
2.8.3 安装Elasticsearch-head 数据可视化工具
#上传软件包 elasticsearch-head-master.zip 到/data cd /data unzip elasticsearch-head-master.zip cd /data/elasticsearch-head/ npm install //安装依赖包
2.8.4 启动 Elasticsearch-head服务
必须在解压后的 elasticsearch-head 目录下启动服务,进程会读取该目录下的 gruntfile.js 文件,否则可能启动失败。
[root@localhost elasticsearch]#cd /data/elasticsearch-head/ [root@localhost elasticsearch-head]# npm run start & #elasticsearch-head 监听的端口是 9100 netstat -natp |grep 9100
2.8.5 测试插件
192.168.240.11:9100 192.168.240.12:9100
2.8.6 插入索引测试
curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
3. 在apache节点上 部署 Logstash
3.1 安装服务
yum -y install java java -version #java 有了不用安装 yum -y install httpd systemctl start httpd
3.2 安装logstash
cd /opt [root@localhost data]# rpm -ivh logstash-6.7.2.rpm #开启服务 systemctl enable --now logstash.service [root@localhost opt]# ln -s /usr/share/logstash/bin/logstash /usr/bin/ # 做软连接
3.3 使用logstash
Logstash 命令常用选项: -f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。 -e:从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。 -t:测试配置文件是否正确,然后退出。
例子:在命令行中收集日志数据
#输入采用标准输入,输出采用标准输出(类似管道),新版本默认使用 rubydebug 格式输出
logstash -e 'input { stdin{} } output { stdout{} }' # 此处输入需要的信息 hello world { "message" => "hello world", "@timestamp" => 2024-07-16T07:50:39.326Z, "host" => "apache", "@version" => "1" }
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }' 结果与上面一样
3.4 使用 Logstash 将信息写入 Elasticsearch 中
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.240.11:9200","192.168.240.12:9200"] } }' # 输入信息 www.cxk.com hello world
3.5 使用配置文件
Logstash 配置文件基本由三部分组成:input、output 以及 filter(可选,根据需要选择使用)
input:表示从数据源采集数据,常见的数据源如Kafka、日志文件等 file beats kafka redis stdin
filter:表示数据处理层,包括对数据进行格式化处理、数据类型转换、数据过滤等,支持正则表达式 grok 对若干个大文本字段进行再分割成一些小字段 (?<字段名>正则表达式) 字段名: 正则表达式匹配到的内容 date 对数据中的时间格式进行统一和格式化 mutate 对一些无用的字段进行剔除,或增加字段 mutiline 对多行数据进行统一编排,多行合并或拆分
output:表示将Logstash收集的数据经由过滤器处理之后输出到Elasticsearch。 elasticsearch stdout
#格式如下: input {...} filter {...} output {...} #在每个部分中,也可以指定多个访问方式。例如,若要指定两个日志来源文件,则格式如下: input { file { path =>"/var/log/messages" type =>"syslog"} file { path =>"/var/log/httpd/access.log" type =>"apache"} vim system.conf input { file{ path =>"/var/log/messages" type =>"system" start_position =>"beginning" # ignore_older => 604800 sincedb_path => "/etc/logstash/sincedb_path/log_progress" add_field => {"log_hostname"=>"${HOSTNAME}"} } } #path表示要收集的日志的文件位置 #type是输入ES时给结果增加一个叫type的属性字段 #start_position可以设置为beginning或者end,beginning表示从头开始读取文件,end表示读取最新的,这个要和ignore_older一起使用 #ignore_older表示了针对多久的文件进行监控,默认一天,单位为秒,可以自己定制,比如默认只读取一天内被修改的文件 #sincedb_path表示文件读取进度的记录,每行表示一个文件,每行有两个数字,第一个表示文件的inode,第二个表示文件读取到的位置(byteoffset)。默认为$HOME/.sincedb* #add_field增加属性。这里使用了${HOSTNAME},即本机的环境变量,如果要使用本机的环境变量,那么需要在启动命令上加--alow-env output { elasticsearch { #输出到 elasticsearch hosts => ["192.168.240.11:9200","192.168.240.12:9200"] #指定 elasticsearch 服务器的地址和端口 index =>"system-%{+YYYY.MM.dd}" #指定输出到 elasticsearch 的索引格式 } }
实际测试:
[root@localhost log]# vim /etc/logstash/conf.d/system-log.conf input { file { path => "/var/log/messages" type => "system" start_position => "beginning" } } output { elasticsearch { hosts => [ "192.168.240.11:9200","192.168.240.12:9200" ] index => "system-%{+YYYY.MM.dd}" } } [root@localhost conf.d]# chmod +r /var/log/messages #添加权限 [root@localhost conf.d]# logstash -f /etc/logstash/conf.d/system-log.conf #启动logstash
4.安装 kibana
4.1 安装
rpm -ivh kibana-6.7.2-x86_64.rpm
4.2 修改配置
[root@localhost data]# cd /etc/kibana/ [root@localhost kibana]# cp kibana.yml kibana.yml.bak -a [root@localhost kibana]# vim kibana.yml 2 server.port: 5601 #打开端口 7 server.host: "0.0.0.0" #监听端口 28 elasticsearch.hosts: ["http://192.168.240.11:9200", "http://192.168.240.12:9200"] #el服务器地址 37 kibana.index: ".kibana" #打开索引 96 logging.dest: /var/log/k.log #指定日志文件, 需要手动建立文件 113 i18n.locale: "zh-CN" #中文设置 touch /var/log/kibana.log [root@localhost kibana]# chown kibana:kibana /var/log/k.log
4.3 启动kibana
[root@localhost kibana]# systemctl enable --now kibana.service [root@localhost kibana]# ss -nap |grep 5601
4.4 访问测试
4.5 建立索引
三.实现nginx日志管理
yum安装nginx,编辑配置文件
需要将原来的日志删除
yum install -y epel-release.noarch yum install -y nginx systemctl start nginx vim /etc/nginx/nginx.conf 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",' '"uri":"$uri",' '"xff":"$http_x_forwarded_for",' '"referer":"$http_referer",' '"tcp_xff":"$proxy_protocol_addr",' '"http_user_agent":"$http_user_agent",' '"status":"$status"}'; nginx -s reload 另一台主机访问curl 192.168.240.13 ,生成成功日志
vim /etc/logstash/conf.d/nginx-log.conf input { file { path => "/var/log/nginx/access.log" type => "nginx" start_position => "beginning" } } output { elasticsearch { hosts => [ "192.168.240.11:9200","192.168.240.12:9200" ] index => "nginx-%{+YYYY.MM.dd}" } }