栏目头部广告

Elastic stack日志分析集群部署

一、Elastic stack介绍

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审计日志);

1.1 ELK小型架构

Elastic stack日志分析集群部署(图1)

优点是搭建简单,易于上手。缺点是Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。建议小规模集群使用。此架构首先由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web Portal方便的对日志查询,并根据数据生成报表。

1.2 引入消息队列机制架构

Elastic stack日志分析集群部署(图2)

引入了消息队列机制,位于各个节点上的Logstash Agent先将数据/日志传递给Kafka(或者Redis),并将队列中消息或数据间接传递给Logstash,Logstash过滤、分析后将数据传递给Elasticsearch存储。最后由Kibana将日志和数据呈现给用户。因为引入了Kafka(或者Redis),所以即使远端Logstash server因故障停止运行,数据将会先被存储下来,从而避免数据丢失。这种架构适合于较大集群的解决方案,但由于Logstash中心节点和Elasticsearch的负荷会比较重,可将他们配置为集群模式,以分担负荷,这种架构的优点在于引入了消息队列机制,均衡了网络传输,从而降低了网络闭塞尤其是丢失数据的可能性,但依然存在Logstash占用系统资源过多的问题。

1.3 引入Logstash-forwarder架构

引入了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加密传输,这样便有了一定的限制性。

1.4 引入Beats架构图

Elastic stack日志分析集群部署(图3)

将Logstash-forwarder替换为Beats。经测试,Beats满负荷状态所耗系统资源和Logstash-forwarder相当,但其扩展性和灵活性有很大提高。Beats platform目前包含有Packagebeat、Topbeat和Filebeat三个产品,均为Apache 2.0 License。同时用户可根据需要进行二次开发。这种架构原理基于第三种架构,但是更灵活,扩展性更强。同时可配置Logstash 和Elasticsearch 集群用于支持大集群系统的运维日志数据监控和查询。

二、ELK集群部署

2.1 节点准备

Elastic stack日志分析集群部署(图2)

2.2 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

2.3 logstash节点部署

【注】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

2.4 Kibana节点部署

(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#/

Elastic stack日志分析集群部署(图3)

http://kibana.starcto.com:5601/app/monitoring

Elastic stack日志分析集群部署(图4)

【注】由截图可见,已经成功部署了三个Elasticearch节点,节点健康状态正常,一个kibana节点,节点状态正常。

2.5 部署filebeat采集日志

通过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 下的索引管理:

Elastic stack日志分析集群部署(图5)

创建索引模型:点击 Kibana 部分的 “Index Patterns”,它将提示我们创建一个新模型,点击 “Create Index Pattern” ,并将模式名称指定为 “filebeat”:

Elastic stack日志分析集群部署(图6)

点击下一步,选择 “Timestamp” 作为索引模型的时间过滤器,然后单击 “Create index pattern”:

Elastic stack日志分析集群部署(图7)

Elastic stack日志分析集群部署(图8)

Analytics下点击Discover单击查看实时 filebeat 索引模型:

Elastic stack日志分析集群部署(图9)

这表明 Filebeat 代理已配置成功,我们能够在 Kibana 仪表盘上看到实时日志。

三、解决方案概述

3.1 MySQL日志审计系统

MySQL日志审计系统,采用percona audit插件审计MySQL的访问情况,结果记录到指定文件中。通过Rsyslog将每个MySQL审计日志集中到Rsyslog Server的指定目录中,使用filebeat监控文件变化,上报到kafka。使用Logstash消费数据,把数据过滤切割后,写入ES中,用户通过kibana查询相关数据。

文章推荐:MySQL安全插件-数据库审计

Elastic stack日志分析集群部署(图12)

作者:UStarGao
链接:https://www.starcto.com/Cloud-BigData-AI/196.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

UCloud云平台推荐


UCloud新用户专属注册连接

UCloud CDN超值特惠专场

UCloud全球云主机(UHost/VPS)大促页面

UCloud快杰云主机大促页面

文章页广告

随便看看

栏目底部广告
`