赞
踩
目录
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 的前端设计比较绚丽,而且操作简单
一个分布式、RESTful风格的搜索和数据分析引擎。它设计用于实时搜索,可以处理大规模数据的存储和分析。Elasticsearch使用Lucene作为底层的搜索引擎,提供了强大的全文搜索、结构化查询和分析能力。
Elasticsearch 使用 Java 语言开发,是建立在全文搜索引擎 Apache Lucene 基础之上的搜索引擎,Apache Lucene - Welcome to Apache Lucene。
Elasticsearch 的特点
实时搜索、实时分析
分布式架构、实时文件存储
文档导向,所有对象都是文档
高可用,易扩展,支持集群,分片与复制
接口友好,支持 json
一个用于日志数据收集、转换和发送的开源工具。Logstash可以从多个来源收集数据,对数据进行处理和转换(如过滤、格式化),然后将数据发送到各种目的地,如Elasticsearch、其他存储系统或者消息队列。
3.Kibana
一个用于数据可视化的开源工具。Kibana提供了一个基于Web的界面,让用户能够搜索、查看和交互存储在Elasticsearch索引中的数据。它支持各种图表、表格、地图等形式的数据可视化,帮助用户更好地理解数据和发现数据中的模式。
分布式日志数据统一收集,实现集中式查询和管理:
Logstash 可以从分布式环境中收集日志数据,支持多种来源的日志收集,如文件、消息队列、数据库等,通过统一格式化和过滤后发送到
Elasticsearch 进行存储和索引。Elasticsearch 作为分布式的搜索和分析引擎,能够存储大规模的日志数据,并支持高效的搜索和聚合查询,实现集中式的数据查询和管理。故障排查:
ELK Stack 提供强大的日志分析和搜索能力,可以帮助运维人员快速定位和解决系统中的故障问题。
通过 Kibana 的实时图表和仪表板功能,运维人员可以可视化地监控系统运行状态、识别异常事件,并进行相关的调查和处理。安全信息和事件管理:
ELK Stack 可以用于集中管理和分析安全相关的日志信息,如入侵检测系统(IDS)、防火墙日志、认证和授权日志等。
Elasticsearch 的强大搜索和分析功能可以用于快速检测和响应安全事件,帮助组织提升安全防护和响应能力。报表功能:
Kibana 提供了丰富的数据可视化功能,可以创建定制化的报表和仪表板,将数据以图表和表格形式展示,支持各种数据分析需求和业务报告的生成。
日志查询和问题排查:
Elasticsearch 作为一个强大的实时搜索和分析引擎,能够快速索引和存储大量日志数据。通过Elasticsearch,可以进行高效的日志查询,帮助运维人员快速定位问题,进行故障排查和日志分析。故障恢复和自愈:
ELK技术栈通过实时的数据索引和分析能力,支持快速响应故障情况。运维团队可以利用实时监控和预警功能,在系统出现异常时迅速发现并采取相应的措施,从而实现故障的快速恢复和自动化处理。应用日志分析和错误报警:
使用Logstash作为日志收集、处理和转发的工具,可以从各种数据源(如应用程序、服务器日志等)中采集数据,并经过处理后发送到Elasticsearch进行存储和分析。通过Kibana提供的数据可视化功能,可以实时监控应用程序的日志信息,快速识别和报警异常情况,及时处理问题。性能分析:
ELK技术栈能够不仅仅分析日志,还可以进行性能分析。通过监控系统和应用程序的指标,如CPU使用率、内存使用情况、网络流量等,可以帮助运维团队发现性能瓶颈和优化机会,提高系统的稳定性和性能。用户行为分析:
借助Elasticsearch强大的分析能力,可以对用户行为数据进行收集、存储和分析。通过分析用户的操作行为、偏好和趋势,可以为产品改进、市场营销和用户体验优化提供数据支持。
部署 Logstash:
Logstash通常部署在需要收集日志的服务器上,也可以集中部署在一个日志服务器上。它负责从各种数据源(如日志文件、消息队列等)收集数据。数据处理和输出:
Logstash接收到原始数据后,会进行数据过滤、解析和格式化。这些步骤包括解析数据、标准化格式、甚至是数据的增强和转换(如IP地址转换为地理位置)等。数据存储与索引:
格式化后的数据被送入Elasticsearch集群进行存储和索引。Elasticsearch是一个分布式搜索和分析引擎,能够快速索引大量数据,并支持复杂的查询。数据可视化:
Kibana作为ELK技术栈中的可视化工具,通过与Elasticsearch集成,可以实时查询和分析存储在Elasticsearch中的数据。Kibana提供了丰富的图表、表格和地图等视觉化组件,用于用户界面的数据展示和交互。实时监控和警报:
ELK技术栈可以配置实时监控和警报机制,使得系统能够在发生关键事件或达到特定阈值时即时通知相关人员。总体来说,ELK技术栈通过Logstash收集、处理和传输数据,Elasticsearch进行存储和索引,Kibana进行数据可视化和交互,使得用户能够实现对日志和其他数据源的集中管理、实时分析和可视化展示,从而帮助企业快速响应问题、优化系统性能和提升运维效率。
EL日志集中管理与分析:
ELK最常见的用途是实时收集、存储和分析大量的日志数据。通过Logstash收集来自各种数据源的日志,经过Elasticsearch的索引和存储,再由Kibana进行可视化展示和分析。这种集中管理和分析日志的能力,使得运维团队能够快速识别和解决系统问题,改善系统稳定性和可靠性。应用性能监控与优化:
通过监控应用程序的日志和性能指标(如CPU使用率、内存占用、请求响应时间等),ELK可以帮助开发团队分析和优化应用程序的性能。这种实时的监控和分析能力,有助于提前发现潜在的性能问题,并迅速采取措施进行优化,从而提升用户体验和系统效率。安全事件监控与分析:
ELK技术栈也被广泛应用于安全信息和事件管理(SIEM)。通过收集和分析安全事件日志(如入侵检测系统、防火墙日志等),可以快速检测潜在的安全威胁和异常行为。Elasticsearch的强大搜索和分析功能,结合Kibana的可视化能力,使安全团队能够及时响应和应对安全事件,加强系统的安全防护。业务智能与数据分析:
ELK不仅限于日志管理和安全监控,还可以用于业务智能和数据分析。企业可以利用Elasticsearch强大的搜索和分析引擎,结合Kibana的可视化功能,分析业务数据趋势、用户行为和市场动态,为决策提供数据支持和见解。IoT数据分析:
随着物联网(IoT)设备的普及,ELK技术栈也被应用于IoT数据的收集、存储和分析。通过Logstash收集IoT设备生成的数据流,经过Elasticsearch进行实时索引和存储,再由Kibana进行数据可视化,帮助企业理解和优化IoT设备的性能、运行状况和用户体验。
节点 | 地址 | 服务 |
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 安装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.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.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.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 建立索引
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}"
- }
-
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。