原文链接:https://dzone.com/articles/deploying-springboot-in-ecs-part-1
作者:Joydip Kumar
译者:helloworldtang
名词解析: EC2(Elastic Compute Cloud):亚马逊弹性计算云,是一个让使用者可以租用云端主机运行所需应用的系统。 阿里云中同类的服务,名字是ECS(Elastic Compute Service):云服务器。
通过本文,你可以看到如何使用ELK Stack来实现系统的监控和日志记录,以及如何将多个微服务的日志收集到一个位置进行集中管理。
IT的重要阶段之一就是后期的生产阶段,而主要的挑战之一是锁定后期生产中的问题。当多个应用程序在不同的系统中“吐”出不同的日志时,就有一个重要的事情需要做:将它们收集到一个地方以便IT团队进行集中管理。此处,我们使用 ELKStack
来解决这个问题。在本文中,我将介绍 ELK
是什么,以及如何从不同的微服务中聚合日志并将它们推送到一个约定好的公共位置。
ELK
是什么?ELK
是Elastic公司旗下三款开源产品ElasticSearch
、Logstash
、Kibana
的缩写。
Elasticsearch
是基于ApacheLucene
的搜索引擎,它可以近实时地搜索、存储和分析大量数据。Elasticsearch
可以安装在本地,也可以作为SaaS
使用。
Logstash
是日志聚合器,它使用一个pipeline
来接收输入,过滤数据,并推送日志输出。Logstash
可以使用不同的输入插件从不同的源获取日志,并以期望的方式推送日志。
Kibana
是一个用来可视化Elasticsearch
数据的软件,是一个带有Elasticsearch
的插件。Elasticsearch
和Kibana
可以部署为云服务,并在AWS
或GCP
上托管。 Kibana
也可以安装在本地基础设施中。本文中,我们将使用ELK
的Docker
镜像并将其部署到EC2
中。
架构设计:
在上面的设计中,不同的微服务都将“吐”出日志。我们会使用Syslog
驱动程序将不同微服务生成的日志推送到Logstash
,然后Logstash
将过滤并推送日志到 Elasticsearch
。最后,我们将在Kibana
上看到所有的聚合日志。
EC2
上部署ELK
我们将使用官方的Docker
镜像,在操作系统为Ubuntu的EC2
上部署ELK
。 首先登录到EC2
服务器,并在/home/ubuntu/
目录中创建一个名为“elk”的目录。
按照以下步骤在EC2
上安装Docker
。
cd
到“elk”目录,并创建一个名为docker-compose.yml
的文件:
version: '2'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
ports:
- '9200:9200'
- '9300:9300'
kibana:
image: docker.elastic.co/kibana/kibana:6.3.2
ports:
- '5601:5601'
depends_on:
- elasticsearch
logstash:
image: docker.elastic.co/logstash/logstash:6.3.2
ports:
- '25826:25826'
volumes:
- $PWD/elk-config:/elk-config
command: logstash -f /elk-config/logstash.config
depends_on:
- elasticsearch
Elasticsearch
默认使用 mmapfs
目录来存储索引。默认情况下,操作系统的 vm.max_map_count
参数设置的都比较小,这就可能会导致Elasticsearch
发生内存溢出。
在Linux上,你以 root
身份执行以下命令来增加 limit
值,以给 mmapfs
分配最大内存:
sudo sysctl -w vm.max_map_count=262144
运行docker-compose up
命令启动并运行 ELK
服务。
通过访问 5601
端口来验证 Kibana
是否处于可用状态。如果你看到下面的页面,那就说明 Kibaba
已经正常启动了:
在 Kibana
上建立索引。 运行下面的命令并输入一些字符串:
例如: telnet 52.207.254.82 5826
一旦在Kibana
上看到了在telnet终端
上输入的字符串,这就意味着你已经可以连接到ELK
了。 接下来,我们将看到如何将从微服务的日志推送到 ELK
。
Syslog
日志驱动程序为了从EC2
中托管的微服务推送日志到Logstash
,可以使用Syslog
驱动程序。在本例中,我们将在EC2
中运行这个用来打印日志的项目。
我们需要修改Ubuntu主机上的rsyslog.conf
文件。
vi /etc/rsyslog.conf
取消UDP
、TCP
连接部分的注释,修改成如下:
现在,在Spring Boot项目的 logback.xml
文件中新增下面的配置:
<appender name=”SYSLOG” class=”ch.qos.logback.classic.net.SyslogAppender”>
<syslogHost>{logstash host }</syslogHost>
<port>{ logstash port 25826 }</port>
<facility>LOCAL1</facility>
<suffixPattern>[%thread] %logger %msg</suffixPattern>
</appender>
上面的配置会将系统“吐”出的日志推送到指定的Logstash
。 如果这个项目是使用 Docker
构建的,我们就需要使用docker run
命令来添加日志驱动程序:
docker run –log-driver syslog –log-opt syslog-address=tcp://{logstashhost}:{logstashport}
启动服务器并访问 API
,你就可以在 Kibana
中看到日志了。