基于ELK搭建微服务日志中心

ELK简介

什么是ELK?通俗来讲,ELK是由Elasticsearch、Logstash、Kibana 三个开源软件组成的一个组合体,这三个软件当中,每个软件用于完成不同的功能,ELK又称ELKstack,官网 https://www.elastic.co/ , ELK主要优点有如下几个: 1、处理方式灵活:elasticsearch是实时全文索引,具有强大的搜索功能 2、配置相对简单:elasticsearch全部使用JSON接口,logstash使用模块配置,kibana的配置文件部分更简单 3、检索性能高:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应 4、集群线性扩展:elasticsearch和logstash都可以灵活线性扩展 5、前端操作绚丽:kibana的前端设计比较绚丽,而且操作简单

Elasticsearch

elasticsearch是一个高度可扩展全文搜索和分析引擎,基于Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作,可以处理大规模日志数据,比如Nginx、Tomcat、系统日志等功能。

Logstash

数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;支持普通log、自定义json格式的日志解析。

Kibana

数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示。

filebeat

首先 filebeat 不属于 ELK中的组件是为ELK服务的可选组件之一。因为Logstash 有一个致命的问题是它的性能以及资源消耗(默认的堆大小是 1GB)。尽管它的性能在近几年已经有很大提升,与它的替代者们相比还是要慢很多的。作为 Beats 家族的一员,Filebeat 是一个轻量级的日志传输工具,它的存在正弥补了 Logstash 的缺点:Filebeat 作为一个轻量级的日志传输工具可以将日志推送到中心 Logstash。Filebeat 只是一个二进制文件没有任何依赖。它占用资源极少,尽管它还十分年轻,正式因为它简单,所以几乎没有什么可以出错的地方,所以它的可靠性还是很高的。它也为我们提供了很多可以调节的点,例如:它以何种方式搜索新的文件,以及当文件有一段时间没有发生变化时,何时选择关闭文件句柄。

开始部署

系统环境检查

1、因为elasticsearch服务运行需要java环境,所有首先要检查服务器中的 java 环境。推荐jdk版本至少为1.8以上

[root@iZbp136dr1iwajle0r9j83Z soft]# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

2、创建用户,因为elasticsearch是不能再root账户下运行所以重新创建一个用户

[root@iZbp136dr1iwajle0r9j83Z ~]# useradd elk

3、创建文件夹

[root@iZbp136dr1iwajle0r9j83Z ~]# su - elk  # 切换到 elk 用户
[elk@iZbp136dr1iwajle0r9j83Z ~]$ mkdir soft  # 用来存储原始压缩包文件
[elk@iZbp136dr1iwajle0r9j83Z ~]$ mkdir applications  #  用来存放部署的文件

下载 ELK 文件

下载过程就自行到相关的官网上下载把,注意下载版本最好是能够对应起来的否则会出现一些莫名其妙的问题。

[root@iZbp136dr1iwajle0r9j83Z soft]# ll -l 
total 708484
-rw-rw-r-- 1 app app 290094012 Jan  2 14:31 elasticsearch-7.5.1-linux-x86_64.tar.gz
-rw-rw-r-- 1 app app  24086235 Jan  2 14:26 filebeat-7.5.1-x86_64.rpm
-rw-rw-r-- 1 app app 238481011 Jan  2 13:28 kibana-7.5.1-linux-x86_64.tar.gz
-rw-rw-r-- 1 app app 172809530 Jan  2 13:27 logstash-7.5.1.zip

这是我下载的文件,从文件属性上还是属于 app 用户的。为了方便统一管理现在将这些文件全部转给 elk 用户

[root@iZbp136dr1iwajle0r9j83Z soft]# chown -R elk:elk *
[root@iZbp136dr1iwajle0r9j83Z soft]# ll -l 
total 708484
-rw-rw-r-- 1 elk elk 290094012 Jan  2 14:31 elasticsearch-7.5.1-linux-x86_64.tar.gz
-rw-rw-r-- 1 elk elk  24086235 Jan  2 14:26 filebeat-7.5.1-x86_64.rpm
-rw-rw-r-- 1 elk elk 238481011 Jan  2 13:28 kibana-7.5.1-linux-x86_64.tar.gz
-rw-rw-r-- 1 elk elk 172809530 Jan  2 13:27 logstash-7.5.1.zip

将文件解压到 applications 文件夹中

# 处理 elasticsearch-7.5.1
[elk@iZbp136dr1iwajle0r9j83Z soft]$ tar -zxvf elasticsearch-7.5.1-linux-x86_64.tar.gz
[elk@iZbp136dr1iwajle0r9j83Z soft]$ mv elasticsearch-7.5.1 ../applications/
# 处理 logstatsh-7.5.1.zip
[elk@iZbp136dr1iwajle0r9j83Z soft]$ unzip logstatsh-7.5.1.zip
[elk@iZbp136dr1iwajle0r9j83Z soft]$ mv logstash-7.5.1 ../applications/
# 处理 kibana-7.5.1
[elk@iZbp136dr1iwajle0r9j83Z soft]$ tar -zxvf kibana-7.5.1-linux-x86_64.tar.gz
[elk@iZbp136dr1iwajle0r9j83Z soft]$ mv kibana-7.5.1-linux-x86_64 ../applications/

部署 elasticsearch

修改elasticsearch.yml文件

[elk@iZbp136dr1iwajle0r9j83Z config]$ vim elasticsearch.yml
#集群名称
cluster.name: els
#节点名称
node.name: els-1
#数据存放路径
path.data: /data/els/data
#日志存放路径
path.logs: /data/logs/els/log
#绑定IP地址
network.host: 172.16.240.19
#端口号
http.port: 7008
discovery.seed_hosts: ["172.16.240.19"]
cluster.initial_master_nodes: ["els-1"]
# 允许跨域访问(kibana获取数据时需要开放)
http.cors.enabled: true
http.cors.allow-origin: '*'

创建数据目录

mkdir /data/els
mkdir /data/logs/els

启动 elasticsearch

		[elk@iZbp136dr1iwajle0r9j83Z soft]$ cd /home/elk/applications/elasticsearch-7.5.1/bin/
		[elk@iZbp136dr1iwajle0r9j83Z soft]$ ./elasticsearch

访问elasticsearch_ip:port 看是否启动正常

部署 kibana

编辑配置文件

cd /home/elk/applications/kibana-7.5.1-linux-x86_64/config
# 修改配置
server.port: 7011
server.host: "0.0.0.0"
server.name: "kibana-server"
elasticsearch.url: "http://172.16.240.19:7008"
kibana.index: ".kibana"
i18n.locale: "zh-CN"

启动 kibana

cd /home/elk/applications/kibana-7.5.1-linux-x86_64/bin
./kibana

访问kibana_ip:port

部署 logstatsh

由于后期日志数据是通过 filebeat 收集上来的,因此针对 filebeat 单独创建一个配置文件来进行处理

cd /home/elk/logstash-7.5.1/config
vim beat.conf
input {
  # 接收filebeat读取的数据
  beats {
    port => 7110
    codec => "json"
  }
}

output {
  # 输出到es
  elasticsearch {
    hosts => ["172.16.240.19:7008"]
    index => "cloud"
    document_type => "log"
    manage_template => false
  }
}

测试配置文件语法是否正确

cd /home/elk/applications/logstash-7.5.1/bin/
./logstash -f /home/elk/applications/logstash-7.5.1/config/beat.conf -t
Thread.exclusive is deprecated, use Thread::Mutex
Sending Logstash logs to /home/elk/applications/logstash-7.5.1/logs which is now configured via log4j2.properties
[2020-01-02T16:12:12,309][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/home/elk/applications/logstash-7.5.1/data/queue"}
[2020-01-02T16:12:12,461][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/home/elk/applications/logstash-7.5.1/data/dead_letter_queue"}
[2020-01-02T16:12:12,890][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2020-01-02T16:12:14,200][INFO ][org.reflections.Reflections] Reflections took 41 ms to scan 1 urls, producing 20 keys and 40 values 
[2020-01-02T16:12:14,673][WARN ][logstash.outputs.elasticsearch] You are using a deprecated config setting "document_type" set in elasticsearch. Deprecated settings will continue to work, but are scheduled for removal from logstash in the future. Document types are being deprecated in Elasticsearch 6.0, and removed entirely in 7.0. You should avoid this feature If you have any questions about this, please visit the #logstash channel on freenode irc. {:name=>"document_type", :plugin=><LogStash::Outputs::ElasticSearch index=>"cloud", manage_template=>false, id=>"c864643340e20cc0970e7438081bbe9f8d9e69638b91d662640155c5e847f531", hosts=>[//172.16.240.19:7008], document_type=>"log", enable_metric=>true, codec=><LogStash::Codecs::Plain id=>"plain_17e73b8f-bd1b-45ff-84ab-2a41f766a1a0", enable_metric=>true, charset=>"UTF-8">, workers=>1, template_name=>"logstash", template_overwrite=>false, doc_as_upsert=>false, script_type=>"inline", script_lang=>"painless", script_var_name=>"event", scripted_upsert=>false, retry_initial_interval=>2, retry_max_interval=>64, retry_on_conflict=>1, ilm_enabled=>"auto", ilm_rollover_alias=>"logstash", ilm_pattern=>"{now/d}-000001", ilm_policy=>"logstash-policy", action=>"index", ssl_certificate_verification=>true, sniffing=>false, sniffing_delay=>5, timeout=>60, pool_max=>1000, pool_max_per_route=>100, resurrect_delay=>5, validate_after_inactivity=>10000, http_compression=>false>}
Configuration OK
[2020-01-02T16:12:14,709][INFO ][logstash.runner          ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash

Configuration OK 则表示配置文件是成功的,接下来启动 logstash 并加载 beat.conf

./logstash -f /home/elk/applications/logstash-7.5.1/config/beat.conf

部署 filebeat

在需要收集日志的主机上安装 filebeat 组件

[root@iZbp14b5r2lytw5nc5z3w2Z filebeat]# pwd
/usr/share/filebeat
[root@iZbp14b5r2lytw5nc5z3w2Z filebeat]# ll -l
total 23524
-rw-r--r-- 1 root root 24086235 Jan  2 16:19 filebeat-7.5.1-x86_64.rpm
[root@iZbp14b5r2lytw5nc5z3w2Z filebeat]# sudo rpm -vi filebeat-7.5.1-x86_64.rpm 
warning: filebeat-7.5.1-x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Preparing packages...
filebeat-7.5.1-1.x86_64

编辑配置修改 /etc/filebeat/filebeat.yml 以设置连接信息:

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.

- type: log
  enabled: true
  tags: ["clo***dmin"]
  paths:
    - /logs/S*******/clou***min/**/*.log  


  # 将非时间戳开头的日志信息合并
  multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
	
	#----------------------------- Logstash output --------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["172.16.240.19:7112"]
  index: joy######loud

启动 filebeat 服务

cd /usr/share/filebeat/bin
./filebeat -e -c /etc/filebeat/filebeat.yml 

配置 kibana

配置完成后查看是否有日志收集上来

可以看到已经有数据上来了。然后再跟看tags值在检索条件中过滤就能过滤出不同服务输出的日志信息了。

后续

至此通过 ELK 搭建微服务日志中心的基本操作已经完成了,但是还有许多需要优化的地方例如:集群化部署,redis或Kafka进行数据转存降低对业务服务的依赖,另外案例中所有的启动命令是直接运行的,后台线程退出后服务就会关闭因此需要进行一些优雅的命令设计等等这些都是后续中需要完善的。