Linux云计算架构-部署ELK集群实现海量日志集中分析处理

Linux云计算架构-部署ELK集群实现海量日志集中分析处理

1. EKL介绍

ELK 是三个开源软件的缩写,分别为:Elasticsearch(弹性搜索) 、Logstash 以及 Kibana。它们都是开源软件。现在还新增了一个 Beats,它是一个轻量级的日志收集处理工具(Agent),Beats 占用资源少,适合于在各个服务器上搜集日志后传输给 Logstash,官方也推荐此工具,目前由于原本的 ELK Stack 成员中加入了 Beats 工具所以已改名为 Elastic Stack

各开源软件介绍:

  • Elasticsearch:开源分布式搜索引擎,提供搜集、分析、存储数据三大功能,是基于 lucene的搜索服务器。它的特点有:分布式、零配置、自动发现、索引自动分片、索引副本机制、restful 风格接口、多数据源、自动搜索负载等。

  • Logstash:主要是用来进行搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为 c/s 架构,client 端安装在需要收集日志的主机上,server 端负责将收到的各节点日志进行过滤、修改等操作,再一并发往 elasticsearch 上去。

  • Kibana:是一个开源和免费的工具,Kibana 可以为 Logstash和ElasticSearch 提供的日志,分析成友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

  • Beats:轻量级日志采集器,之前是Logstash负责收集日志。

  • Lucene:是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎、部分文本分析引擎。Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。【全文检索引擎的半成品】

ELK使用场景:适用于日志较多且复杂的场景。对于简单的通过grep、awk、more、less命令查看和过滤日志的方法,对于上述场景,会出现如下问题:

  • 日志量太大如何归档?
  • 文本搜索太慢怎么办?
  • 如何进行多维度查询?
  • 如何进行集中化日志管理?
  • 如何进行日志收集汇总管理?

对于上述问题,常见的解决方案是:建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。

大型系统通常都是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

一个完整的集中式日志系统,需要包括以下几个主要特点:

  • 收集:能够采集多种来源的日志数据
  • 传输:能够稳定的把日志数据传输到中央系统
  • 存储:如何存储日志数据
  • 分析:可以支持 UI 分析
  • 警告:能够提供错误报告,监控机制

而 ELK 则提供了一整套解决方案,并且都是开源软件,各组件之间互相配合使用,完美衔接,高效的满足了很多场合的应用。是目前主流的一种日志系统。

ELK基本拓扑图

在这里插入图片描述

各软件包下载地址https://www.elastic.co/cn/downloads/
https://elasticsearch.cn/download/

2. 部署elasticsearch集群

2.1 环境介绍

主机名 IP地址 备注
master
8核CPU
4G以上内存
192.168.80.136 elasticsearch master data节点
kibana可视化工具
node
8核CPU
4G以上内存
192.168.80.133 elasticsearch master data节点
logstash beats 收集日志

2.2 部署master

①安装JDK1.8,并关闭防火墙和selinux。(所有节点都要操作)

JDK1.8下载地址https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

在这里插入图片描述

# 卸载掉原来的openjdk,用oracel的jdk1.8
[root@master ~]# yum remove -y java-*
[root@master ~]# ll jdk-8u271-linux-x64.rpm 
-rw-r--r--. 1 root root 112994496 1月  14 13:58 jdk-8u271-linux-x64.rpm
[root@master ~]# rpm -ivh jdk-8u271-linux-x64.rpm 
[root@master ~]# java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)

[root@master ~]# systemctl stop firewalld && systemctl disable firewalld
[root@master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@master ~]# setenforce 0
[root@master ~]# vim /etc/hosts
192.168.80.136 master
192.168.80.133 node

②安装elasticsearch(所有节点都要操作)

elasticsearch下载地址https://www.elastic.co/cn/downloads/
https://elasticsearch.cn/download/

离线安装下载rpm包

在线安装https://www.elastic.co/guide/en/elasticsearch/reference/7.10/rpm.html#rpm-repo

# 这里使用离线安装
[root@master ~]# ll elasticsearch-7.10.1-x86_64.rpm 
-rw-r--r--. 1 root root 318860379 1月  14 14:16 elasticsearch-7.10.1-x86_64.rpm
[root@master ~]# rpm -ivh elasticsearch-7.10.1-x86_64.rpm 

# 创建日志目录、数据和索引文件目录
[root@master ~]# mkdir -p /data/elasticsearch/log /data/elasticsearch/data
[root@master ~]# chown -R elasticsearch:elasticsearch /data/elasticsearch/
[root@master ~]# chown -R elasticsearch:elasticsearch /etc/elasticsearch/

③调整JVM内存和elasticsearch集群参数(所有节点都要操作)

# JVM内存调整
[root@master ~]# ls /etc/elasticsearch/
elasticsearch.keystore  jvm.options    log4j2.properties  roles.yml  users_roles
elasticsearch.yml       jvm.options.d  role_mapping.yml   users

[root@master ~]# vim /etc/elasticsearch/jvm.options
 22 -Xms2g   # JVM初始分配的堆内存
 23 -Xmx2g   # JVM最大可以使用的内存

# 修改elasticsearch集群参数
# 修改数据和索引存放路径
# 修改日志存放路径
[root@master ~]# vim /etc/elasticsearch/elasticsearch.yml
 33 path.data: /data/elasticsearch/data
 37 path.logs: /data/elasticsearch/log

# 在yml最后一行后添加elasticsearch集群信息
cluster.name: ELK_GZ   # 集群名
node.name: master   # master节点名
node.master: true  # 是否可以作为主节点
node.data: true    # 是否存储数据
network.host: 192.168.80.136  # 监听IP
http.port: 9200  # elasticsearch服务的端口号
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["192.168.80.136", "192.168.80.133"]  # 配置自动发现
discovery.zen.minimum_master_nodes: 2  # 设置集群的节点数
gateway.recover_after_nodes: 2    # 集群内达到该节点数量才会开始数据分片和 master枚举
cluster.initial_master_nodes: ["master","node"]  # 初始化master,以防elasticsearch集群找不到master节点

2.3 部署node节点

整体配置和master相同,变化如下:

# 在yml最后一行后添加elasticsearch集群信息
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/log

cluster.name: ELK_GZ
node.name: node
node.master: true
node.data: true
network.host: 192.168.80.133
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["192.168.80.136","192.168.80.133"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 2
cluster.initial_master_nodes: ["master","node"]

2.4 启动elasticsearch集群

先启动master,等master完全启动了再启动node。

可以看到,占用的是92009300端口号。

# 启动master,正常监听9200和9300端口号
[root@master ~]# systemctl start elasticsearch.service 
[root@master ~]# systemctl enable elasticsearch.service
[root@master ~]# systemctl status elasticsearch.service
[root@master ~]# netstat -lntp | grep java


# 启动node,正常监听9200和9300端口号
[root@node ~]# systemctl start elasticsearch.service
[root@node ~]# systemctl enable elasticsearch.service
[root@node ~]# systemctl status elasticsearch.service
[root@node ~]# netstat -lntp | grep java

在这里插入图片描述

2.5 查看elasticsearch集群状态

浏览器查看集群健康状态http://192.168.80.136:9200/_cluster/health?pretty

在这里插入图片描述

查看单台机器http://192.168.80.136:9200/
在这里插入图片描述

查看单台机器http://192.168.80.133:9200/

在这里插入图片描述

2.6 使用curl管理elasticsearch集群

①_cat操作:查看集群状态

[root@master ~]# curl -XGET 192.168.80.136:9200/_cat
=^.^=
/_cat/allocation
/_cat/shards
/_cat/shards/{
    
    index}
/_cat/master
/_cat/nodes
/_cat/tasks
/_cat/indices
/_cat/indices/{
    
    index}
/_cat/segments
/_cat/segments/{
    
    index}
/_cat/count
/_cat/count/{
    
    index}
/_cat/recovery
/_cat/recovery/{
    
    index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{
    
    alias}
/_cat/thread_pool
/_cat/thread_pool/{
    
    thread_pools}
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{
    
    fields}
/_cat/nodeattrs
/_cat/repositories
/_cat/snapshots/{
    
    repository}
/_cat/templates
/_cat/ml/anomaly_detectors
/_cat/ml/anomaly_detectors/{
    
    job_id}
/_cat/ml/trained_models
/_cat/ml/trained_models/{
    
    model_id}
/_cat/ml/datafeeds
/_cat/ml/datafeeds/{
    
    datafeed_id}
/_cat/ml/data_frame/analytics
/_cat/ml/data_frame/analytics/{
    
    id}
/_cat/transforms
/_cat/transforms/{
    
    transform_id}

②_cluster操作

# 查看集群的健康状态
[root@master ~]# curl -XGET 192.168.80.136:9200/_cluster/health?pretty

# 查看集群系统信息,包括CPU、JVM等
[root@master ~]# curl -XGET 192.168.80.136:9200/_cluster/stats?pretty

# 查看集群的详细信息,包括节点、分片等
[root@master ~]# curl -XGET 192.168.80.136:9200/_cluster/state?pretty

# 获取集群堆积的任务
[root@master ~]# curl -XGET 192.168.80.136:9200/_cluster/pending_tasks?pretty

# 修改集群配置
# 格式: curl -XPUT IP:9200/{index}/{type} -d '{text}'
[root@master ~]# curl -XPUT 192.168.80.136:9200/_cluster/settings -d '{键值对}'

# 对share的手动控制
curl -XPOST 'localhost:9200/_cluster/reroute’ -d ‘xxxxxx'

# 关闭节点
curl -XPOST 'http://192.168.80.133:9200/_cluster/nodes/_local/_shutdown'
curl -XPOST 'http://192.168.80.133:9200/_cluster/nodes/192.168.80.133/_shutdown'

# 关闭主节点
curl -XPOST 'http://localhost:9200/_cluster/nodes/_master/_shutdown'

# 关闭整个集群
curl -XPOST 'http://localhost:9200/_shutdown?delay=10s'
curl -XPOST 'http://localhost:9200/_cluster/nodes/_shutdown'
curl -XPOST 'http://localhost:9200/_cluster/nodes/_all/_shutdown'

③_node操作

# 查询节点状态
curl -XGET ‘http://localhost:9200/_nodes/stats?pretty=true’
curl -XGET ‘http://localhost:9200/_nodes/192.168.1.2/stats?pretty=true’
curl -XGET ‘http://localhost:9200/_nodes/process’
curl -XGET ‘http://localhost:9200/_nodes/_all/process’
curl -XGET ‘http://localhost:9200/_nodes/192.168.1.2,192.168.1.3/jvm,process’
curl -XGET ‘http://localhost:9200/_nodes/192.168.1.2,192.168.1.3/info/jvm,process’
curl -XGET ‘http://localhost:9200/_nodes/192.168.1.2,192.168.1.3/_all
curl -XGET ‘http://localhost:9200/_nodes/hot_threads

④索引操作

# 获取索引
curl -XGET 'http://localhost:9200/{index}/{type}/{id}'
# 索引数据
curl -XPOST 'http://localhost:9200/{index}/{type}/{id}' -d '{“a”:”avalue”,”b”:”bvalue”}'
# 删除索引
curl -XDELETE 'http://localhost:9200/{index}/{type}/{id}'
# 设置mapping
curl -XPUT http://localhost:9200/{
    
    index}/{
    
    type}/_mapping -d '{
  "{type}" : {
    "properties" : {
      "date" : {
        "type" : "long"
      },
      "name" : {
        "type" : "string",
        "index" : "not_analyzed"
      },
      "status" : {
        "type" : "integer"
      },
      "type" : {
        "type" : "integer"
      }
    }
  }
}'
# 获取mapping
curl -XGET http://localhost:9200/{
    
    index}/{
    
    type}/_mapping
# 搜索
curl -XGET 'http://localhost:9200/{index}/{type}/_search' -d '{
    "query" : {
        "term" : { "user" : "kimchy" } //查所有 "match_all": {}
    },
    "sort" : [{ "age" : {"order" : "asc"}},{ "name" : "desc" } ],
    "from":0,
    "size":100
}'
curl -XGET 'http://localhost:9200/{index}/{type}/_search' -d '{
    "filter": {"and":{"filters":[{"term":{"age":"123"}},{"term":{"name":"张三"}}]},
    "sort" : [{ "age" : {"order" : "asc"}},{ "name" : "desc" } ],
    "from":0,
    "size":100
}'
# 修改索引
curl -XPUT 'http://192.168.80.136:9200/abong/'
curl -H 'Content-Type: application/json' -XPUT 'http://192.168.80.136:9200/abong/student/1' -d '{"name":"dir","age":"30","info":"I love you"}'
curl -XPUT 'http://192.168.80.136:9200/xuegod/student/1' -d '{"name":"dir","age":"30","info":"I love you"}'
# 获取索引
curl -XGET 'http://192.168.80.136:9200/abong/student/1?pretty'
curl -XGET '192.168.80.136:9200/_cat'
# 获取集群状态信息
curl '192.168.80.136:9200/_cluster/health?pretty'

3. 在node节点上安装logstash收集本机日志

3.1 配置终端采集日志

为了收集node节点上的日志,就要安装logstash服务,且logstash不支持JDK1.9

logstash下载地址https://www.elastic.co/cn/downloads/

[root@node ~]# ll logstash-7.10.1-x86_64.rpm 
-rw-r--r-- 1 root root 352352275 1月  14 19:36 logstash-7.10.1-x86_64.rpm
[root@node ~]# rpm -ivh logstash-7.10.1-x86_64.rpm 

# logstash配置文件
[root@node ~]# cd /etc/logstash/
[root@node logstash]# ll
总用量 40
drwxrwxr-x 2 root root     6 12月  5 11:11 conf.d
-rw-r--r-- 1 root root  2019 12月  5 11:11 jvm.options
-rw-r--r-- 1 root root  9097 12月  5 11:11 log4j2.properties
-rw-r--r-- 1 root root   342 12月  5 11:11 logstash-sample.conf
-rw-r--r-- 1 root root 11226 1月  18 13:08 logstash.yml
-rw-r--r-- 1 root root   285 12月  5 11:11 pipelines.yml
-rw------- 1 root root  1696 12月  5 11:11 startup.options
# logstash收集日志的模板配置文件
[root@node logstash]# cat logstash-sample.conf 
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
    
    
  beats {
    
    
    port => 5044
  }
}

output {
    
    
  elasticsearch {
    
    
    hosts => ["http://localhost:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

配置logstash收集syslog日志:

[root@node ~]# vim /etc/logstash/conf.d/syslog.conf
input{
    
       # 定义日志源
  syslog{
    
    
    type => "system-syslog"   # 定义日志类型
    port => 10514   # 定义监听端口
  }
}
output{
    
      # 定义日志输出
  stdout{
    
    
    codec => rubydebug   # 将日志输出到当前的终端上,一般都会输出到es集群的master节点上。
  }
}


==================================
# 输出到hosts上,格式为index
output{
    
    
  elasticsearch{
    
    
    hosts => ["192.168.1.63:9200"]
    index => "system-syslog-%{+YYYY.MM.DD}"
  }
}

检查syslog日志配置文件是否有问题:

[root@node ~]# cd /usr/share/logstash/bin/
[root@node bin]# ./logstash --path.settings /etc/logstash -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit

--path.settings   指定logstash的配置文件所在目录
-f   指定需要被检测的配置文件的路径
--config.test_and_exit  检测完后直接退出logstash,不启动logstash

指定所有类型的日志都上传到10514端口上:

[root@node ~]# vim /etc/rsyslog.conf 
*.* @@192.168.80.133:10514

启动rsyslog服务和logstash:

# 重启rsyslog服务
[root@node ~]# systemctl restart rsyslog

# 前台启动logstash服务
[root@node ~]# cd /usr/share/logstash/bin/
[root@node bin]# ./logstash --path.settings /etc/logstash -f /etc/logstash/conf.d/syslog.conf

# 在另一终端上查看监听端口的监听情况
[root@node ~]# netstat -lntp | grep 10514
tcp6       0      0 :::10514                :::*                    LISTEN      26058/java    

可以看到,logstash启动后,syslog的日志在当前终端上显示出来了。
在这里插入图片描述
Ctrl+C退出,并关闭logstash。

3.2 配置es服务器收集日志

配置logstash收集到的日志传输到es服务器上:

[root@node ~]# vim /etc/logstash/conf.d/syslog.conf
input{
    
    
  syslog{
    
    
    type => "system-syslog"
    port => 10514
  }
}
output{
    
    
  elasticsearch{
    
    
    hosts => ["192.168.80.136:9200"]
    index => "system-syslog-%{+YYYY.MM.DD}"
  }
}


# 检查配置文件
[root@node ~]# cd /usr/share/logstash/bin
[root@node bin]# ./logstash --path.settings /etc/logstash -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit


# 修改logstash监控的IP,默认监听127.0.0.1,本地IP无法远程通信。
[root@node ~]# vim /etc/logstash/logstash.yml 
118 http.host: "192.168.80.133"

[root@node ~]# chown -R logstash /var/lib/logstash/
[root@node ~]# chown -R logstash /var/log/logstash/


# 重启logstash服务
[root@node ~]# systemctl restart logstash && systemctl enable logstash && systemctl status logstash

[root@node ~]# netstat -lntp | grep 9600
tcp6       0      0 192.168.80.133:9600     :::*                    LISTEN      27426/java          
[root@node ~]# netstat -lntp | grep 10514
tcp6       0      0 :::10514                :::*                    LISTEN      27426/java    

logstash收集的日志索引:http://192.168.80.136:9200/_cat/indices?v
在这里插入图片描述
查看日志索引详细内容:

[root@master ~]# curl -XGET '192.168.80.136:9200/system-syslog-2021.01.18?pretty'

4. 在master节点上安装并汉化kibana,以图形界面显示系统日志

4.1 安装kibana

[root@master ~]# ll kibana-7.10.1-x86_64.rpm 
-rw-r--r-- 1 root root 250278931 1月  14 19:36 kibana-7.10.1-x86_64.rpm
[root@master ~]# rpm -ivh kibana-7.10.1-x86_64.rpm 

[root@master ~]# vim /etc/kibana/kibana.yml 
  2 server.port: 5601   # 配置kibana的端口
  7 server.host: "192.168.80.136"  # 配置监听ip
 28 elasticsearch.hosts: ["http://192.168.80.136:9200"]
 89 logging.dest: /var/log/kibana.log

创建日志文件:

[root@master ~]# touch /var/log/kibana.log && chmod 777 /var/log/kibana.log
[root@master ~]# systemctl start kibana.service && systemctl enable kibana.service  && systemctl status kibana.service 

[root@master ~]# ps aux | grep kibana
kibana    31415  138  3.1 1332184 254212 ?      Ssl  15:55   0:31 /usr/share/kiban/bin/../node/bin/node /usr/share/kibana/bin/../src/cli/dist
root      31510  0.0  0.0 112724   988 pts/0    S+   15:56   0:00 grep --color=auto kibana

[root@master ~]# netstat -lntp | grep 5601
tcp        0      0 192.168.80.136:5601     0.0.0.0:*               LISTEN      31415/node      

4.2 汉化kibana

在浏览器访问,如:http://192.168.80.136:5601/ ,由于我们并没有安装 x-pack,所以此时是没有用户名和密码的,可以直接访问的:
在这里插入图片描述

[root@master ~]# vim /etc/kibana/kibana.yml 
106 # Supported languages are the following: English - en , by default , Chinese -     zh-CN .
107 i18n.locale: "zh-CN"
[root@master ~]# systemctl restart kibana.service 

在这里插入图片描述

4.3 配置kibana显示系统日志

①创建索引模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

②点击“Discover”,选择索引模式:
在这里插入图片描述
以上就是ELK集群的基本情况,需要深入了解ELK集群的,可以查阅官网介绍。

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/112729248