Elastic stack 俗称 ELK stack,是一组包括 Elasticsearch、Logstash 和 Kibana 在内的开源产品。Elastic Stack 由 Elastic 公司开发和维护。使用 Elastic stack,可以将系统日志发送到 Logstash,它是一个数据收集引擎,接受来自可能任何来源的日志或数据,并对日志进行归一化,然后将日志转发到 Elasticsearch,用于分析、索引、搜索和存储,最后使用 Kibana 表示为可视化数据,使用 Kibana,我们还可以基于用户的查询创建交互式图表。
官网介绍:https://www.elastic.co/cn/elastic-stack/
Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。
Beats是轻量级数据采集工具,包括:
(1)Packetbeat(搜集网络流量数据);
(2)Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据);
(3)Filebeat(搜集文件数据);
(4)Winlogbeat(搜集 Windows 事件日志数据)
(5)Metricbeat(收集系统级的 CPU 使用率、内存、文件系统、磁盘 IO 和网络 IO 统计数据);
(6)Auditbeat(采集linux审计日志);
优点是搭建简单,易于上手。缺点是Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。建议小规模集群使用。此架构首先由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web Portal方便的对日志查询,并根据数据生成报表。
引入了消息队列机制,位于各个节点上的Logstash Agent先将数据/日志传递给Kafka(或者Redis),并将队列中消息或数据间接传递给Logstash,Logstash过滤、分析后将数据传递给Elasticsearch存储。最后由Kibana将日志和数据呈现给用户。因为引入了Kafka(或者Redis),所以即使远端Logstash server因故障停止运行,数据将会先被存储下来,从而避免数据丢失。这种架构适合于较大集群的解决方案,但由于Logstash中心节点和Elasticsearch的负荷会比较重,可将他们配置为集群模式,以分担负荷,这种架构的优点在于引入了消息队列机制,均衡了网络传输,从而降低了网络闭塞尤其是丢失数据的可能性,但依然存在Logstash占用系统资源过多的问题。
引入了Logstash-forwarder。首先,Logstash-forwarder将日志数据搜集并统一发送给主节点上的Logstash,Logstash分析、过滤日志数据后发送至Elasticsearch存储,并由Kibana最终将数据呈现给用户。这种架构解决了Logstash在各计算机点上占用系统资源较高的问题。经测试得出,相比Logstash,Logstash-forwarder所占用系统CPU和MEM几乎可以忽略不计。另外,Logstash-forwarder和Logstash间的通信是通过SSL加密传输,起到了安全保障。如果是较大集群,用户亦可以如结构三那样配置logstash集群和Elasticsearch集群,引入High Available机制,提高数据传输和存储安全。更主要的配置多个Elasticsearch服务,有助于搜索和数据存储效率。但在此种架构下发现Logstash-forwarder和Logstash间通信必须由SSL加密传输,这样便有了一定的限制性。
将Logstash-forwarder替换为Beats。经测试,Beats满负荷状态所耗系统资源和Logstash-forwarder相当,但其扩展性和灵活性有很大提高。Beats platform目前包含有Packagebeat、Topbeat和Filebeat三个产品,均为Apache 2.0 License。同时用户可根据需要进行二次开发。这种架构原理基于第三种架构,但是更灵活,扩展性更强。同时可配置Logstash 和Elasticsearch 集群用于支持大集群系统的运维日志数据监控和查询。
【注】X代表5,6,7三个节点配置相同。
(1)Elasticsearch YUM仓库配置
[root@X ~]# vim /etc/yum.repos.d/elastic.repo # 配置YUM仓库
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
[root@X ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch # 导入 Elastic 公共签名密钥
(2)安装java环境
[root@X ~]# yum install java-openjdk -y
(3)安装 Elasticsearch
[root@X ~]# yum install elasticsearch -y
(4)修改主机名
[root@192-168-0-5 ~]# hostnamectl set-hostname es1.starcto.com
[root@192-168-0-6 ~]# hostnamectl set-hostname es2.starcto.com
[root@192-168-0-7 ~]# hostnamectl set-hostname es3.starcto.com
(5)自定义hosts
[root@X ~]# hostnamectl set-hostname es1.starcto.com
192.168.0.5 es1.starcto.com
192.168.0.6 es2.starcto.com
192.168.0.7 es3.starcto.com
192.168.0.8 kibana.starcto.com
192.168.0.9 logstash1.starcto.com
192.168.0.10 logstash2.starcto.com
(6)修改Elasticsearch节点配置
[root@X ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: starcto-cluster
node.name: es1.starcto.com
network.host: 192.168.0.5
http.port: 9200
discovery.seed_hosts: ["es1.starcto.com", "es2.starcto.com", "es3.starcto.com"]
cluster.initial_master_nodes: ["es1.starcto.com", "es2.starcto.com", "es3.starcto.com"]
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
【注】node.name和network.host根据每个节点真实情况填写即可。
(7)启动elasticsearch 节点
[root@X ~]# systemctl daemon-reload
[root@X ~]# systemctl enable elasticsearch.service
[root@X ~]# systemctl start elasticsearch.service
(8)Elasticsearch 群集状态检测
[root@es1 ~]# curl http://es1.starcto.com:9200
{
"name" : "es1.starcto.com",
"cluster_name" : "starcto-cluster",
"cluster_uuid" : "SigqjwnRR4GzkZd5FrstWA",
"version" : {
"number" : "7.14.0",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "dd5a0a2acaa2045ff9624f3729fc8a6f40835aa1",
"build_date" : "2021-07-29T20:49:32.864135063Z",
"build_snapshot" : false,
"lucene_version" : "8.9.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
[root@es1 ~]# curl -X GET http://es1.starcto.com:9200/_cluster/health?pretty
{
"cluster_name" : "starcto-cluster",
"status" : "green", # 集群状态为green即为正常
"timed_out" : false,
"number_of_nodes" : 3, # 三个node节点
"number_of_data_nodes" : 3, # 三个数据节点
"active_primary_shards" : 1,
"active_shards" : 2,
"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
}
注意: 如果你想修改 JVM 堆大小,那么你可以编辑了文件/etc/elasticsearch/jvm.options,并根据你的环境更改以下参数:
[root@X ~]# vim /etc/elasticsearch/jvm.options
-Xms1g
-Xmx1g
【注】X代表logstash1和2两个节点都需要配置。
(1)修改主机名称
[root@192-168-0-9 ~]# hostnamectl set-hostname logstash1.starcto.com
[root@192-168-0-10 ~]# hostnamectl set-hostname logstash2.starcto.com
(2)修改自定义hosts
[root@logstashX ~]# vim /etc/hosts
192.168.0.5 es1.starcto.com
192.168.0.6 es2.starcto.com
192.168.0.7 es3.starcto.com
192.168.0.8 kibana.starcto.com
192.168.0.9 logstash1.starcto.com
192.168.0.10 logstash2.starcto.com
(3)logstash YUM仓库配置
[root@logstashX ~]# vim /etc/yum.repos.d/logstash.repo
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
[root@logstashX ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch # 导入签名
(4)安装java环境
[root@logstashX ~]# yum install java-openjdk -y
(5)部署logstash
[root@logstashX ~]# yum install logstash -y
(6)修改logstash配置文件
[root@logstashX ~]# cd /etc/logstash
[root@logstashX logstash]# cp logstash-sample.conf conf.d/logstash.conf
[root@logstashX logstash]# vim conf.d/logstash.conf
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://es1.starcto.com:9200", "http://es2.starcto.com:9200", "http://es3.starcto.com:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
(7)启动logstash
[root@logstashX ~]# systemctl enable logstash
[root@logstashX ~]# systemctl start logstash
(8)服务启动验证
[root@logstashX ~]# ss -tunlp | grep 5044
tcp LISTEN 0 128 *:5044 *:* users:(("java",pid=34360,fd=110))
[root@logstashX ~]# netstat -antulp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 998/sshd
tcp 0 0 192.168.0.9:22 10.25.25.25:50180 ESTABLISHED 33455/sshd: root [p
tcp6 0 0 :::5044 :::* LISTEN 34360/java
tcp6 0 0 :::22 :::* LISTEN 998/sshd
tcp6 0 0 127.0.0.1:9600 :::* LISTEN 34360/java
(1)修改主机名称
[root@192-168-0-8 ~]# hostnamectl set-hostname kibana.starcto.com
(2)修改自定义hosts
[root@kibana ~]# vim /etc/hosts
192.168.0.5 es1.starcto.com
192.168.0.6 es2.starcto.com
192.168.0.7 es3.starcto.com
192.168.0.8 kibana.starcto.com
192.168.0.9 logstash1.starcto.com
192.168.0.10 logstash2.starcto.com
(3)Kibana YUM仓库配置
[root@kibana ~]# vim /etc/yum.repos.d/kibana.repo
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
[root@logstashX ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch # 导入签名
(4)部署Kibana
[root@kibana ~]# yum install kibana -y
(5)修改Kibana配置文件
[root@kibana ~]# vim /etc/kibana/kibana.yml
server.host: "kibana.starcto.com"
server.name: "kibana.starcto.com"
elasticsearch.hosts: ["http://es1.starcto.com:9200", "http://es2.starcto.com:9200", "http://es3.starcto.com:9200"]
[root@kibana ~]# netstat -antulp |grep 5601
tcp 0 0 192.168.0.8:5601 0.0.0.0:* LISTEN 2439/node
(6)访问Kibana
http://kibana.starcto.com:5601/app/home#/
http://kibana.starcto.com:5601/app/monitoring
【注】由截图可见,已经成功部署了三个Elasticearch节点,节点健康状态正常,一个kibana节点,节点状态正常。
通过filebeat将业务服务器日志推送到logstash节点。
(1)客户端安装filebeat采集器
[root@ansible ~]# rpm -ivh https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
Retrieving https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
warning: /var/tmp/rpm-tmp.rNEwdp: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:filebeat-7.3.1-1 ################################# [100%]
(2)修改自定义hosts
[root@ansible ~]# vim /etc/hosts
192.168.0.9 logstash1.starcto.com
192.168.0.10 logstash2.starcto.com
(3)修改filebeat配置文件
[root@ansible ~]# vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
- /var/log/messages
- /var/log/sa/sa*
- /var/log/dmesg
#output.elasticsearch:
# hosts: ["localhost:9200"]
output.logstash:
hosts: ["logstash1.starcto.com:5044","logstash2.starcto.com:5044"]
loadbalance: true #开启负载均衡
【注】在 filebeat.inputs: 部分将 enabled: false 更改为 enabled: true,并在 paths 参数下指定我们可以发送到 logstash 的日志文件的位置;注释掉 output.elasticsearch 和 host 参数;删除 output.logstash: 和 hosts: 的注释,并在 hosts 参数添加两个 logstash 节点,以及设置 loadbalance: true。
(4)启动filebeat采集器
[root@ansible ~]# systemctl enable filebeat
Created symlink from /etc/systemd/system/multi-user.target.wants/filebeat.service to /usr/lib/systemd/system/filebeat.service.
[root@ansible ~]# systemctl start filebeat
(5)验证日志采集效果
访问 Kibana 用户界面,验证新索引是否可见。从左侧栏中选择管理选项,然后单击 Elasticsearch 下的索引管理:
创建索引模型:点击 Kibana 部分的 “Index Patterns”,它将提示我们创建一个新模型,点击 “Create Index Pattern” ,并将模式名称指定为 “filebeat”:
点击下一步,选择 “Timestamp” 作为索引模型的时间过滤器,然后单击 “Create index pattern”:
Analytics下点击Discover单击查看实时 filebeat 索引模型:
这表明 Filebeat 代理已配置成功,我们能够在 Kibana 仪表盘上看到实时日志。
MySQL日志审计系统,采用percona audit插件审计MySQL的访问情况,结果记录到指定文件中。通过Rsyslog将每个MySQL审计日志集中到Rsyslog Server的指定目录中,使用filebeat监控文件变化,上报到kafka。使用Logstash消费数据,把数据过滤切割后,写入ES中,用户通过kibana查询相关数据。
文章推荐:MySQL安全插件-数据库审计
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。