随着当今微服务架构服务越来越复杂,生产环境一旦出现故障,研发和运维人员排查线上故障的时间和难度也随之上升。
现在生成环境的微服务能抗海量 QPS 都会部署很多的副本容器,通过 nginx 或者其他负载均衡工具转发到微服务集群上。如果出现故障,研发人员会查看服务日志是否有异常,但是多台副本容器不可能手动登录每个容器内查看。所以需要有一种方案自动把多台副本容器的日志统一发送给某个地方存储,然后通过某种语法搜索展示。
本文会介绍使用 filebeta 采集 nginx 后端服务日志的方案,最终通过 Kibana 实时展示后端服务日志,这种架构方案在一般运维架构体系中使用的比较常见,实际生成环境比本文讲述的会复杂一些,但是大体的架构方案是类似的,接下来我们看下是如何实现的吧。
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用 Elasticsearch 的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到 Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
使用 docker 来安装 Elasticsearch:
docker run --name elasticsearch -p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /usr/local/data-docker/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /usr/local/data-docker/elasticsearch/data:/usr/share/elasticsearch/data \
-v /usr/local/data-docker/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch
filebeat 是用于转发和集中日志数据的轻量级传送工具。filebeat 监视您指定的日志文件或位置,收集日志事件,并将它们转发到 elasticsearch 或 Logstash 进行索引。
filebeat 的工作方式如下:启动 filebeat 时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于 Filebeat 所找到的每个日志,filebeat 都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到 libbeat,libbeat 将聚集事件,并将聚集的数据发送到为 Filebeat 配置的输出。
使用 filebeta 的二进制文件安装,在服务器执行如下命令:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.0-linux-x86_64.tar.gz
tar -xzvf filebeat-7.7.0-linux-x86_64.tar.gz
filebeat.inputs.paths: nginx 的存储日志地址路径。
output.elasticsearch.hosts: 是 elasticsearch 的地址。
output.elasticsearch.index: 是 elasticsearch 的索引地址,通过时间戳创建。
filebeat.inputs:
- type: log
enabled: true
paths:
- /data/nginx_exporter/openresty-1.15.8.2/nginx/logs/bckend_access_json.log
json.keys_under_root: true
json.add_error_key: true
json.overwrite_keys: true
#setup.ilm.enabled: false
#
setup.template.enabled: true
setup.template.name: "filebeattest"
setup.template.pattern: "filebeattest-*"
setup.ilm.enabled: false
output.elasticsearch:
hosts: ["192.168.1.232:9200"]
index: "filebeat-testindex-%{+yyyy.MM.dd}"
./filebeat -e -c filebeat_ng.yml -d "publish"
nginx 是 HTTP Server、反向代理服务器、邮件代理服务器、通用的 TCP/UDP 代理服务器。nginx features 详细列出了 nginx 的功能特性。
如果想采集 nginx 的日志,需要额外安装 Openresty 模块。
OpenResty 是一个成熟的网络平台,它集成了标准的 Nginx 核心,LuaJIT,许多精心编写的 Lua 库,许多高质量的第三方 Nginx 模块以及大多数外部依赖项。它旨在帮助开发人员轻松构建可伸缩的 Web 应用程序,Web 服务和动态 Web 网关。
wget -c https://openresty.org/download/openresty-1.15.8.2.tar.gz
tar zxvf openresty-1.15.8.2.tar.gz
nginx-module-vts 是 Nginx 的监控模块,能够提供 JSON 格式的数据产出。
git clone git@gitcode.net:mirrors/vozlt/nginx-module-vts.git
OpenSSL 是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连线者的身份。这个包广泛被应用在互联网的网页服务器上。 其主要库是以 C 语言所写成,实现了基本的加密功能,实现了 SSL 与 TLS 协议。
wget -c https://github.com/openssl/openssl/archive/OpenSSL_1_0_2u.tar.gz
tar zxvf OpenSSL_1_0_2u.tar.gz
yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
编译 Openresty 需要用到上面软件,执行如下命令:
cd openresty-1.15.8.2.tar
./configure --prefix=/data/nginx_exporter/openresty-1.15.8.2 --with-luajit --with-pcre --with-http_iconv_module --with-http_realip_module --with-http_sub_module --with-http_stub_status_module --with-stream --with-stream_ssl_module --add-module=/data/nginx_exporter/nginx-module-vts --with-openssl=/data/nginx_exporter/openssl-OpenSSL_1_0_2u
make install
此时启动编译好的 nginx,执行如下命令:
/data/nginx_exporter/openresty-1.15.8.2/nginx/sbin -c /usr/local/nginx/conf/nginx.conf
在浏览器中输入服务器的 ip/vts_status,可以看到 nginx 的所有流量数据等信息,包括: 传输上行和下行数据、请求量、响应错误量。
http://192.168.1.232/vts_status
在 nginx 配置会配置后端服务路径,通过 path 转发到后端服务中,然后访问后端服务产生服务日志,但是产生的日志格式不是标准的 json 格式。
接下来在 nginx 配置中使用 log_format 格式,可以自定义 log 日志字段。对一个接口请求,可以定义: remote_addr、request_time、response_status、request_method 等常用接口字段。
http {
include mime.types;
default_type application/octet-stream;
log_format graylog2_json escape=json '{ "timestamp": "$time_iso8601", '
'"remote_addr": "$remote_addr", '
'"body_bytes_sent": $body_bytes_sent, '
'"request_time": $request_time, '
'"response_status": $status, '
'"request": "$request", '
'"request_method": "$request_method", '
'"host": "$host",'
'"upstream_cache_status": "$upstream_cache_status",'
'"upstream_addr": "$upstream_addr",'
'"http_x_forwarded_for": "$http_x_forwarded_for",'
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';
access_log logs/access.log graylog2_json;
vhost_traffic_status_zone;
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream backend {
server 192.168.1.232:9999;
}
server {
listen 8010;
server_name localhost;
location /backend {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend/;
}
}
}
配置文件完成后,启动 nginx,此时所有 nginx 日志会以 json 的形式存到文件中。
Kibana 是一个开源的分析与可视化平台,设计出来用于和 Elasticsearch 一起使用的。你可以用 kibana 搜索、查看存放在 Elasticsearch 中的数据。Kibana 与 Elasticsearch 的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。
推荐使用 docker 方式安装,拉取镜像。
docker pull kibana:7.10.1
启动容器携带 elasticsearch 的 ip 和端口。
docker run --name kibana -e ELASTICSEARCH_URL=http://127.0.0.01:9200 -p 5601:5601 -d kibana:7.10.1
需要手动创建索引,索引的命名是 filebta 中 filebeat-testindex-%{+yyyy.MM.dd}格式。
添加完索引后,查看最近的数据就可以看到 nginx 的日志了,在 fields 字段中可以看到在 nginx 配置文件中定义的 remote_addr、request_time、response_status、request_method 等字段。
回顾下本文主要介绍如何使用 filebeta 采集 nginx 后端服务日志的整个架构和思路,虽然本片文章和测试技术关联性不大,但是如果想扩展自己的技术深度和广度也要了解开发和运维的架构技术栈,开阔自己的技术视野和架构思维。
如果大家觉得有帮助,可以关注下方微信公众号,里边有更多的技术文档和面试技巧~