当前位置: 首页 > 最新文章 > 正文

公共API服务网关日志系统

总体结构系统服务及组织关系如Figure1-1所示基于ELK的日志系统主要由Elasticsearch、Logstash和Kibana组成,简称为ELK。Figure 监控服务Docker实例目前所有关键服务均被封装在容器之内,由Docker或Docker Compose进行管理。elasticsearch目录:存放了elasticsearch的Dockerfile文件系统将根据此文件构建elas

admin

总体结构系统服务及组织关系如Figure1-1所示基于ELK的日志系统主要由Elasticsearch、Logstash和Kibana组成,简称为ELK。Figure 监控服务Docker实例目前所有关键服务均被封装在容器之内,由Docker或Docker Compose进行管理。elasticsearch目录:存放了elasticsearch的Dockerfile文件系统将根据此文件构建elasticsearch的容器镜像,将直接基于官方镜像构建,版本由环境变量所设版本号进行控制,config目录中存放了elasticsearch的配置文件。环境变量文件:是1个名为.env的文件其中定义了系统所需的环境变量,目前只有1行有效内容ELK_VERSION=7.9.1,及当前ELK的版本为7.9.1。Figure 监控系统文件结构需要注意windows的换行符和unix/linux的有所不同需要确保采用unix/linux的换行符号。受限于具体硬件条件目前Elasticsearch运行于单节点非产品模式。在elasticsearch目录下包含了Dockerfile文件和config目录。

Contents

1. 系统结构与安装配置 2

1.1. 总体结构 2

1.2. 网关日志系统 4

1.3. 网关设置 12

2. 系统运行与维护 14

2.1. 初始化并启动服务 14

2.2. Kibana配置和数据可视化分析 15

2.3. 测试与验证 17

3. 小结 20

系统结构与安装配置

下面分总体结构、网关日志系统、网关设置3部分展开。

总体结构

  1. 系统服务及组织关系

如Figure1-1所示基于ELK的日志系统主要由Elasticsearch、Logstash和Kibana组成,简称为ELK。

公共API服务网关日志系统

日志系统的挑战主要在于日志格式多种多样,数据类型复杂多变,有可能需要对部分字段做复杂处理进行解析、合成或转换,有可能出现缺失数据或异常,数据量大,数据生成速率多变,有可能产生瞬时高峰值数据量。具有大数据特征,存储、管理、检索、分析以及可视化方面均有一定挑战。

Figure ‑Prometheus+Grafana解决方案

当前只有1台虚拟主机用于网关、监控和日志管理系统的集成测试,其基本环境为,硬件:4 vCPU 2.4GHz, 8GB RAM, 100GB HDD,软件:CentOS 7.6.1810,Docker 18.09,Docker Compose 1.25.5。图Figure1-2是当前系统中运行的容器实例状态列表的截图,其中红圈内为监控服务实例。

公共API服务网关日志系统

Figure ‑监控服务Docker实例

目前所有关键服务均被封装在容器之内,由Docker或Docker Compose进行管理。以all-in-one方式实现,这是一种更省事的安装配置模式,把所有服务集成在一个Docker Compose模块之中。所有关键服务组合均由Docker Compose进行管理,类似于K8S里的Pod组织方式,这样可以为将来向K8S模式迁移打下一定基础。

  1. 关键文件目录结构

如图Figure 1-3所示,相关文件放在ELK/system目录下,其中:

  • docker-compose.yml文件:为系统的docker compose配置文件,是一个all in one的文件,基中包括了elasticsearch, logstash, 和kibana的docker compose配置信息。
  • elasticsearch目录:存放了elasticsearch的Dockerfile文件系统将根据此文件构建elasticsearch的容器镜像,将直接基于官方镜像构建,版本由环境变量所设版本号进行控制,config目录中存放了elasticsearch的配置文件。
  • logstash目录:包含了logstash的Dockerfile文件系统将根据此文件构建logstash的容器镜像,将直接基于官方镜像构建,版本由环境变量所设版本号进行控制,config目录中存放了logstash的配置文件和索引模板文件,pipeline目录中存放了logstash数据导入配置文件。
  • kibana目录:存放了kibana的Dockerfile文件系统将根据此文件构建kibana的容器镜像,将直接基于官方镜像构建,版本由环境变量所设版本号进行控制,config目录中存放了kibana的配置文件。
  • 环境变量文件:是1个名为.env的文件其中定义了系统所需的环境变量,目前只有1行有效内容ELK_VERSION=7.9.1,及当前ELK的版本为7.9.1。
公共API服务网关日志系统

Figure ‑监控系统文件结构

需要注意windows的换行符和unix/linux的有所不同需要确保采用unix/linux的换行符号。

网关日志系统

系统主要由Elasticsearch搜索引擎、Logstash数据导入与预处理服务和Kibana数据分析与可视化服务组成。

  1. Elasticsearch搜索引擎

依Elastic官方介绍:“Elasticsearch 是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。”如下图Figure1-4,Elasticsearch可以很容易地实现集群工作模式,以保障系统可靠性和高性能。

公共API服务网关日志系统

Figure ‑Elasticsearch集群工作方式

当前在系统集成测试环境下Elasticsearch 在docker-compose中的配置如下:

elasticsearch:

build:

context: elasticsearch/

args:

ELK_VERSION: $ELK_VERSION

restart: always

volumes:

- type: bind

source: ./elasticsearch/config/elasticsearch.yml

target: /usr/share/elasticsearch/config/elasticsearch.yml

read_only: true

- type: volume

source: elasticsearch

target: /usr/share/elasticsearch/data

ports:

- "9200:9200"

- "9300:9300"

environment:

ES_JAVA_OPTS: "-Xms2g -Xmx2g -XX:InitiatingHeapOccupancyPercent=75"

ELASTIC_PASSWORD: xxxxxxx

# Use single node discovery in order to disable production mode and avoid bootstrap checks

# see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html

discovery.type: single-node

networks:

- elk


除了一些常见关键配置外,此处使用了由docker compose托管的持久化卷来存储索引数据,这与K8S的卷管理比较类似,在构建容器镜像的部分使用了环境变量文件中的变量$ELK_VERSION来控制ELK版本,而在容器运行的环境变量设置中配置了JVM的内存参数,实验表明太小的内存分配会导至Elasticsearch工作异常,作为大型搜索引擎系统时一般建议内存大至32GB甚至更高。受限于具体硬件条件目前Elasticsearch运行于单节点非产品模式。在elasticsearch目录下包含了Dockerfile文件和config目录。Dockerfile是elasticsearch的镜像构建文件,其中有效内容只有2行:

ARG ELK_VERSION
FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}

实质上目前系统使用的就是官方镜像,但以后可以根据我方需要修改Dockerfile,只需重新build镜像和重启服务即可升级,而无需修改其它设置。

config目录下的elasticsearch.yml是Elasticsearch的主配置文件。

cluster.name: "docker-cluster"

network.host: 0.0.0.0

## X-Pack settings

## see https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-xpack.html

#

xpack.license.self_generated.type: basic

xpack.security.enabled: true

xpack.monitoring.collection.enabled: true

xpack.security.authc.api_key.enabled: true

由于日志数据内容极其敏感,我们设xpack.security.enabled为true使得系统操作时需要进行安全认证。另外,xpack.security.authc.api_key.enabled为true并非参考项目中的设置,但在实际操作中发现刚开始ELK运行正常,但数周后无意中重启Elasticsearch服务后Logstash总不能正常工作,而且有时Kibana在使用过程中会随机地弹出认证窗口要求输入用户名和密码验证,为此经多方尝试增加了xpack.security.authc.api_key.enabled设置,目前ELK工作良好。

  1. Logstash数据导入与预处理服务

依Elastic官方介绍:”Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。”如下图Figure1-5,Logstash功能比较强大可以采集各种样式、大小和来源的数据还能实时解析和转换数据。

公共API服务网关日志系统

当前在系统集成测试环境下Logstash 在docker-compose中的配置如下:

Figure ‑Logstash功能示意图

logstash:

build:

context: logstash/

args:

ELK_VERSION: $ELK_VERSION

restart: always

volumes:

- type: bind

source: ./logstash/config/logstash.yml

target: /usr/share/logstash/config/logstash.yml

read_only: true

- type: bind

source: ./logstash/pipeline

target: /usr/share/logstash/pipeline

read_only: true

- type: bind

source: ./logstash/config/kong_logs_template.json

target: /usr/share/logstash/config/kong_logs_template.json

read_only: true

logging:

#driver: "json-file"

options:

max-size: "1m"

ports:

- "5000:5000/tcp"

- "5000:5000/udp"

- "9600:9600"

environment:

LS_JAVA_OPTS: "-Xmx512m -Xms512m"

networks:

- elk

depends_on:

- elasticsearch

除了一些常见关键配置外,容器镜像版本控制与elasticsearch类似,此外还设置logging参数设定容器输出日志大小不超过1m。 在Logstash目录下包含了Dockerfile文件、config目录和pipeline目录。Dockerfile是Logstash的镜像构建文件,其中有效内容只有2行:

ARG ELK_VERSION
FROM docker.elastic.co/logstash/logstash:${ELK_VERSION}

实质上目前系统使用的就是官方镜像,但以后可以根据我方需要修改Dockerfile,只需重新build镜像和重启服务即可升级,而无需修改其它设置。

config目录下的logstash.yml是Logstash的主配置文件。

http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
## X-Pack security credentials
#
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: xxxxxxxxx

此配置比较简单主要配置了Elasticsearch的相关信息,以便logstash能正常连接。而目录config下的kong_logs_template.json文件是数据导入时的索引模板文件,比较长这里就不再列出了。

在目录pipeline下是logstash数据导入的配置文件名为logstash.conf其中包含了:

  • 输入设置

input {

tcp {

port => 5000

codec => json

}

udp {

workers => 4

queue_size => 15000

port => 5000

codec => json

}

}

此处设定TCP方式5000端口和UDP方式5000端口可以作为输入,其中UDP方式经常有丢包的可能所以加大了worker数量并设置了较大的队列尺寸。

  • 过滤处理

...

geoip {

source => "client_ip"

}

useragent {

target => "ua"

source => "[request][headers][user-agent]"

}

...

此处内容较多只列出了2段基于grok的简单处理,geoip部对client_ip中的IP增加IP所在地点和区域字段,useragent可以利用客户端useragent信息获取客户所用OS以及浏览器类型版本等信息。此外filter里还去掉空数据,基于ruby脚本从网关tries信息中提取网关上某服务负载均衡器重试的详细信息,基于ruby解析JWT内容解码token payload信息以提取用户识别信息等功能块。

  • 输出设置

output {

elasticsearch {

hosts => "elasticsearch:9200"

user => "elastic"

password => "xxxxxxx"

#index => "kong-log-info-%{+YYYY.MM.dd}"

index => "kong-log-ilm"

template => "/usr/share/logstash/config/kong_logs_template.json"

template_name => "kong-log"

template_overwrite => true

codec => json

}

}

此处设置了数据流向的主机配置,设定索引名(如果不设默认为logstash-*),设定自有的索引模板参数。

需要注意的是经过多次尝试只要pipeline目录下有其它json文件则logstash总是不能正常启动,为此目前特将索引模板文件放在了config目录之下。

除了Logstash外,Beat系列组件也可以向Elasticsearch导入数据。依Elastic官方说法,关于filebeat ,就像运行tail -f命令一样逐行不断地输出,filebeat 主要用来向Logstash 或 ELasticsearch发送本地文件数据。因为本系统中采用网络直传方式所以没有搭建filebeat服务。

  1. Kibana数据分析与可视化服务

依Elastic官方介绍:”Kibana 是一款开源的前端应用程序,其基础是 Elastic Stack,可以为 Elasticsearch 中索引的数据提供搜索和数据可视化功能。“Kibana 与 Elasticsearch 和更广意义上的 Elastic Stack 紧密的集成在一起,可以搜索、查看并可视化 Elasticsearch 中所索引的数据,可以借助网络界面来监测和管理 Elastic Stack 实例并确保实例的安全,可以针对基于 Elastic Stack 开发的内置解决方案(面向可观测性、安全和企业搜索应用程序),将其访问权限集中到一起。如下图Figure1-6展示了Kibana的数据仪表盘功能。

公共API服务网关日志系统

当前在系统集成测试环境下Kibana 在docker-compose中的配置如下:

Figure ‑Kibana数据仪表盘示例

kibana:

build:

context: kibana/

args:

ELK_VERSION: $ELK_VERSION

restart: always

volumes:

- type: bind

source: ./kibana/config/kibana.yml

target: /usr/share/kibana/config/kibana.yml

read_only: true

ports:

- "5601:5601"

networks:

- elk

depends_on:

- elasticsearch

相对于其它服务Kibana除了一些常见关键配置外并没有特别之处,此处不再赘述。在Kibana目录下包含了Dockerfile文件和config目录。Dockerfile是Kibana的镜像构建文件,其中有效内容只有2行:

ARG ELK_VERSION
FROM docker.elastic.co/kibana/kibana:${ELK_VERSION}

实质上目前系统使用的就是官方镜像,但以后可以根据我方需要修改Dockerfile,只需重新build镜像和重启服务即可升级,而无需修改其它设置。

config目录下的Kibana.yml是Kibana的主配置文件。

server.name: kibana

server.host: "0"

server.basePath: /21at/kibana

server.rewriteBasePath: true

elasticsearch.hosts: [ "http://elasticsearch:9200" ]

xpack.monitoring.ui.container.elasticsearch.enabled: true

## X-Pack security credentials

#

elasticsearch.username: elastic

elasticsearch.password: 21at_ES@dmin

xpack.security.enabled: true

xpack.ingestManager.fleet.tlsCheckDisabled: true

xpack.encryptedSavedObjects.encryptionKey: "somthing_at_least_32_characters"

此配置与常见配置不同之处主要在于利用server.basePath为/21at/kibana和

server.rewriteBasePath为true为Kibana设定了服务子路径,以便利用nginx将其开放,对于Elasticsearch 7系列server.rewriteBasePath必须设为true,否则新的路径不能正常工作。此外,如前面所提及在访问Kibana时经常随机地弹出用户认证窗口要求输入用户名和密码,且在一次无意中重启了Elasticsearch后logstash总是不能正常工作,为此我们查阅大量资料都无确切答案,只有为Elasticsearch配置将xpack.security.authc.api_key.enabled设为true并在此处配置了xpack.ingestManager.fleet.tlsCheckDisabled设为true和xpack.encryptedSavedObjects.encryptionKey设为 "somthing_at_least_32_characters"后系统才恢复了正常。关于此问题目前无据可查,但估计可能与ELK内部安全控制策略有关。

网关设置

只有在网关上设置数据推送功能后ELK系统才能接收的相应的日志数据,为此我们还必须在网关上进行一定的设置。

公共API服务网关日志系统

上图Figure1-7展示了利用Konga图形界面新增Logging插件的截图。需要注意的是每个Kong结点都会提供1个该节点上的日志数据导入到ELK系统,由系统自动完成,但它们并不重复,目前还没观测到重复信息。

Figure ‑Kong Logging插件设置

公共API服务网关日志系统

设置并不算复杂,不论是采用Kong的管理API还利用Konga的GUI操作,TCP通道只需要添加一个全局的Tcp Log插件即可,而UDP通道只需要添加一个全局的Udp Log插件即可。2者选择1个就可以,只是目前系统设置并同时支持2种模式。但一定注意的是需要正确设置Logstash的主机地址和网络端口。本系统ELK和网关都 在同一个主机之上,但在不同的虚拟网段内,虚拟网内不能直接用主机IP访问其它虚拟网内的主机,由于内部跨网段DNS问题也无法用服务名直接访问,为此需要查询并使用Logstash的虚拟网IP作为主机地址,如图Figur1-8所示当前配置下Logstash的虚拟网IP为172.23.0.3。这是由于本系统当前的特殊情况造成的。如果ELK和网关机不在同一主机上将可以用ELK所有主机的IP和对外开放的端口连接Logstash。

Figure ‑TCP Log插件设置

总之,ELK的安装配置总体讲并不是特别复杂,只是一定要注意一些关键的细节。

系统运行与维护

日志系统的整个安装部署都采用了典型的Docker Compose方式,所以并没有为其开发专用脚本,而是直接使用docker compose命令或在GUI上进行操纵。

初始化并启动服务

首次运行需要进行系统初始化工作。系统初始化主要完成镜像下载或构建工作然后对数据目录增加读写权限,一般只需要运行1次即可,如果要升级或修改镜像版本可以再次运行。只需在命令行模式下进入/home/centos/setup/dist/ELK/system目录运行docker-compose build即可。

启动系统可以简单使用命令docker-compose up -d,重启系统命令为docker-compose restart,停上并清除所有服务的容器实例:docker-compose down,如果加-v参数将会把由docker-compose维护的持久卷内的数据一并清除。

也可以用如下命令一行实现彻底清除旧版本容器、重启新服务并跟踪日志的功能:

docker-compose stop && docker-compose rm -f && docker-compose up -d && docker-compose logs -f

这条复合式的指令并不会清除Elasticsearch的持久化卷及索引数据,非常适合于重新构建容器镜像后升级服务。如要清除持久化卷可以运行docker-compose down -v。

Kibana配置和数据可视化分析

初次使用需要在Kibana做一些配置。首先要在管理菜单创建所需的Index Pattern索引模式,例如kong-log*,这样的索引模式将会包含所有形如kong-log-20200910、kong-log-data-00001之类的索引,在做数据分析和可视化操作时将对所有满足索引模式的索引统一处理,我们可以在Logstash里设置将索引按周、按日或按小时分区存储和管理,这样特别适合长期大数据量的管理。

如图Figure2-1是Kibana discover页面截图,一般情况下我们可以利用Discover功能按时间段浏览索引模式内的所有数据,可以增加逻辑条件,可以只显示想着看到的字段,这些操作和检索数据库数据比较类似,不过在Kibana的GUI界面下使得操作更加容易。

公共API服务网关日志系统

Figure ‑Kibana Discover界面

Kibana还提供数据分析和可视化功能,可以设定检索和统计条件绘制各类图表,如果记录中包含地理位置或区域字段还可以在世界地图上快速绘制热力图,另一方面在仪表盘上可以增加这些可视化图表实现专业的仪表盘功能。现有系统中就实现了不同时段的网络请求量趋势图,不同请求来源城市的势力图,世界地图上的请求量热力图,以不同国家发出请求的IP仪表图,如图Figure2-2。

公共API服务网关日志系统

Figure ‑Kibana 仪表盘界面

公共API服务网关日志系统

Figure ‑Kibana索引管理

此外,付费版的ELK还可以提供机器学习等高级功能。在配合Logstash设置,在Kibana上还可以以GUI方式实现设置磁盘配额、按时间段、按数据量对索引进行自动化生命周期的管理,如图Figure 2-3在Kibana里可以直接管理所有索引。

测试与验证

调试时可以用docker-compose logs -f跟踪所有服务的日志,如果只想查看某个服务的日志可以在其后加上服务名,例如docker-compose logs -f logstash。

为了确保系统质量和验证脚本功能我们还完成了一些测试与验证工作。

1) 验证ELK系统用户权限

输入curl -u elastic 'http://localhost:9200/_xpack/security/_authenticate?pretty'系统提示”Enter host password for user 'elastic':“,输入正确密码后可以得到如下内容:

{

"username" : "elastic",

"roles" : [

"superuser"

],

"full_name" : null,

"email" : null,

"metadata" : {

"_reserved" : true

},

"enabled" : true,

"authentication_realm" : {

"name" : "reserved",

"type" : "reserved"

},

"lookup_realm" : {

"name" : "reserved",

"type" : "reserved"

}

}

2)查看Elasticsearch运行情况

输入curl -u elastic http://localhost:9200将得到系统提示”Enter host password for user 'elastic':“,然后输入密码即可得到结果。如果不想反复输入密码可以在用户名后加{:密码},例如curl -i -u elastic:{密码} http://localhost:9200,可得到如下结果:

{

"name" : "909e37f37bbd",

"cluster_name" : "docker-cluster",

"cluster_uuid" : "NtolvQNORDGXptuAv6B4cA",

"version" : {

"number" : "7.9.1",

"build_flavor" : "default",

"build_type" : "docker",

"build_hash" : "083627f112ba94dffc1232e8b42b73492789ef91",

"build_date" : "2020-09-01T21:22:21.964974Z",

"build_snapshot" : false,

"lucene_version" : "8.6.2",

"minimum_wire_compatibility_version" : "6.8.0",

"minimum_index_compatibility_version" : "6.0.0-beta1"

},

"tagline" : "You Know, for Search"

}

另外,也能够在浏览器上做类似的操作,输入网址http://localhost:9200弹出验证框,输入用户名和密码后可得如图Figure2-4中的 结果:

公共API服务网关日志系统

Figure ‑在浏览器上获取ES状态

此外,也可以用GET方法获取当前索引信息,URI为http://localhost:9200/_cat/indices?pretty得到下图Figure2-5中的结果:

公共API服务网关日志系统

Figure ‑在浏览器上查询ES索引状态

3)检索索引内容

利用shell脚本用curl -u elastic:xxxx http://localhost:9200/kong-log-ilm?pretty 可以检查指定索引的详细状态。用curl -u elastic:xxxx http://localhost:9200/kong-log-ilm/_search?q=beijing可以检索所有包含beijing的记录。

此外,如图Figure2-6,也可以在Kibana的discovery里以GUI方式检索数据。

当然利用

公共API服务网关日志系统

Java、Python等编程语言也可以检索ES数据并提供更强大的数据处理和数据分析服务。

Figure ‑利用Kibana检索和过滤数据

小结

基于前期的工作,除了网关核心服务和监控服务系统,开发团队在云上虚拟主机还安装、配置和测试了由Elasticsearch、Logstash和Kibana构成的公共API网关日志系统,为了更接近当今广泛流行的K8S容器编排技术现有系统采用docker compose基于YAML格式改造了网关监控系统,已经可以达到公共API服务网关开发的第1阶段要求。

从实测效果看,在现有并发请求量下日志系统能够有效收集网关上的各种请求日志,能够获取客户主机地理位置信息、浏览器和主机信息、网关负载均衡器重试信息以及用户标识信息等,系统能够用Kibana等工具检索数据、过滤数据、分析数据,可以实现可视化服务,还可以追溯网络请求和响应的具体以便辅助开发人员调试和优化后台服务模块,各项关键功能目前系统运行良好。

日志收集、管理、分析和可视化展示需求变化多样,它不但可以对请求行为进行审计还能为领导层提供有效的决策支持服务,大数据上的存储、管理、分析和可视化应用价值潜力巨大。


上一篇: input只能输入金额(input限制输入数字范围) 下一篇:控件Listview电脑按顺序排列按键(按键值排序)
返回顶部